緩沖區(qū)溢出是對嵌入式軟件造成嚴(yán)重破壞的錯誤之一。該系統(tǒng)似乎運行良好,然后突然,奇怪的事情開始發(fā)生!一直表現(xiàn)的變量突然以意想不到的值結(jié)束。嵌入式開發(fā)人員經(jīng)常會被難住并花費數(shù)天時間試圖弄清楚發(fā)生了什么,從而浪費了寶貴的時間和金錢。在今天的帖子中,我將向你展示如何快速有效地識別緩沖區(qū)溢出并修復(fù)它們。
緩沖區(qū)溢出癥狀
緩沖區(qū)溢出通常會給系統(tǒng)帶來一些開發(fā)人員可以輕松識別的癥狀。這些癥狀通??梢栽谒坪跖c發(fā)生溢出的位置無關(guān)的變量中找到,例如:
初始化值不正確
沒有任何代碼作用于變量的變化值
超出范圍的值應(yīng)該是不可能的
使用映射文件查找緩沖區(qū)溢出
在嵌入式開發(fā)中,緩沖區(qū)溢出的問題是它們很難找到,誰知道是什么溢出到變量內(nèi)存空間并破壞了它?如果你懷疑自己有緩沖區(qū)溢出,可以使用一個簡單的過程來查找或排除溢出。
識別似乎已損壞的變量。
編譯你的代碼。
導(dǎo)航到你編譯的項目文件夾并找到你的地圖文件。
在映射文件中搜索損壞的變量。
找到后,查看損壞的變量旁邊的變量。這很可能是罪魁禍?zhǔn)祝?/span>
在你的代碼中搜索罪魁禍?zhǔn)壮跏蓟?/span>
增加緩沖區(qū)大小,看看這是否確實是原因。
我有一個行為不正確的變量。所以,我按照上面的步驟,在我的地圖文件中發(fā)現(xiàn)了以下內(nèi)容:
我的 ScrState 變量在內(nèi)存中的前面有一個 bytesToSend 數(shù)組!
在檢查了這個數(shù)組和使用它的代碼后,我發(fā)現(xiàn)我將緩沖區(qū)覆蓋了 1 個字節(jié),值為 0! 足以將我的 ScrState = True 變量更改為
False。
結(jié)論
如果查找緩沖區(qū)溢出的過程很隨意,則很難找到緩沖區(qū)溢出。緩沖區(qū)溢出通常是可重復(fù)的,這允許嵌入式開發(fā)人員追蹤它們導(dǎo)致的損壞??焖偎阉饔成湮募⒆R別前面的變量可以幫助開發(fā)人員快速找到罪魁禍?zhǔn)撞⑿迯?fù)其溢出。