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