色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數組越界的問題解析

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2023-04-17 09:15 ? 次閱讀

數組越界問題大家在軟件開發過程中應該都司空見慣了。如果你沒見過,大概率是一個新手,工作經驗不足,倒不是說你自己會生產這種 BUG,但有些同事卻可能是 BUG 搬運工。

在魚鷹五年的工作開發過程中,除了在北京剛畢業那會沒遇到這種隱藏問題(碰到的都是自己生產的 BUG,不過自產自銷,也還行),在深圳的這幾家公司都遇到了數組越界的問題。

問題一

第一個問題是關于串口驅動導致的越界(最終結果是 hardfault),這個魚鷹在以前的筆記中也反復強調了,因為這個問題差點導致自己熬了一個通宵,也是醉了(老代碼的一個 bug)。

當然這個問題的解決和當時沒有在線調試環境(當時的 PCB 板子通過串口燒錄代碼,沒有調試接口,大坑)有很大關系,否則解決起來會快不少。

當然當時魚鷹也沒掌握這個方法《BUG 終結者,現場抓獲!|顛覆認知》,否則出現問題時,這種小問題分分鐘定位它。

所以當時解決這個問題,全靠玄學:運氣。

否則這個問題不知道要蹂躪魚鷹多少天。

問題二

這個問題在前東家遇到。當時的環境是 boot + app 形式。boot 代碼也是跑了多年的老代碼,從來沒有出現過問題。

直到有一次版本升級,發現程序不能跳轉到 app 正常運行(具體細節不記得了)。

當時有同事懷疑是我當時更新的 printf 打印函數有關系,因為當時的版本更新有這個改動。但魚鷹對自己寫的代碼還是比較有自信的,并且我的 printf 改動和 app 跳轉能有什么關系。

但懷疑到你頭上了,同時魚鷹也經常負責定位這類疑難雜癥,剛好空閑,那就去瞧瞧看了,證明一下這不是你的問題。

因為問題 100% 復現,又掌握了那個現場抓獲的技巧,很快就定位到是 boot 的一段代碼申請的棧數組空間不足,導致被調用的函數使用這塊空間時越界了。

類似下面這種:

func2(uint8_t*buff)
{
i=5;
buff[i]= 0;
}
fun1()
{
uint8_t buff[4];
func2(buff);
}

當然實際代碼肯定不可能這么簡單,i 的值是變化的,不可能一眼看出。

這個問題也是導致 hardfault(退出 func2 時,破壞了返回地址)。

看到沒有,有時候二分法(二分查找有問題的代碼提交)查找問題也不是那么可靠,因為問題可能根本不在提交的的代碼中。

而下面的問題三也證明了這一點(當然不是說二分法沒用,只是不能全靠它作為你的結果判斷)。

問題三

這個問題是現東家遇到的問題。

自己開發的一個新模塊,當合并到主分支時,發現開機必定 hardfault,這讓我百思不得其解。自己新加入的代碼,都沒用到數組,怎么會hardfault。

我的第一反應就是,不是我的鍋。

但問題出現在我合并的過程,也只能由我定位了。還好經驗豐富,一天時間+加班幾個小時,總算是定位到了。

這個問題定位有幾個難點:

1、使用 C++

2、使用O2 優化,而使用 O0 的方式問題不復現了(最蛋疼)

3、使用了 map 庫函數

因此在復現率很高的情況下,還是花了這么多時間。

但好在順利解決了(這么高的復現率,定位root case只是時間問題,信心也是 100%)。

簡單來說,是以前的一段代碼在使用 sprintf 時(這里強烈建議用 snprintf),導致棧緩存空間越界,然后導致上一層函數的局部變量被篡改,而這個局部變量會導致 map 傳入的參數有問題,最終導致了 hardfault 。

可以看到,雖然根因在一個函數中,但最終出現問題卻可能在另一個函數中。

就像犯罪現場,作案現場只有一個(root case),但可能案發現場并不是作案現場。

因此解決 bug 過程其實就是警察破案,通過蛛絲馬跡找到第一作案現場,如此才能正確破案。

而這種代碼在工程里面有好幾處.....并且在合入我的代碼之前,運行良好。所以,數組越界也不一定會 hardfault,就看你破壞的是啥了。

為什么?

大家很奇怪,為毛數據越界大部分情況下會 hardfault,有時卻不會產生問題。只有思考到更深層的原因,你才能在 BUG 環繞中有所成長。

這個時候,就看你的基礎扎實不扎實了。

這里來個簡單示意函數(優化O0)

void func2()
{
inti= 0;
intbuff[4];
 
 buff[4] = 0;
}
voidfunc1()
{
intj=0;//假設該局部變量使用r4
func2();
}

棧空間如下(因為只有 4 個字,編譯器可能 buff[4] 直接使用寄存器了,但為了簡單說明,這里假設 buff 都使用了棧):

552128a6-dcbc-11ed-bfe3-dac502259ad0.png

從上圖我們可以知道,進入 func2 函數時,先 push,離開時 pop。

局部變量 i 使用 r4 寄存器,但是棧空間 r4 保存的是 func1 使用的j的值。

因此,當我們數組越界時(一般越界是往高地址,因為數組索引一般是自加),很容易破壞上一個函數的棧空間,在這里破壞的是 j 的值。如果 j 很重要,那么很可能會導致 hardfault 或者其它問題(能引起 hardfault 反而是好事)。

并且這里面還有重要的返回地址 lr,如果這個值被越界破壞,那么大概率都是hardfault,因為你企圖跳轉到一個不存在的地址執行。

數組越界是一個很危險的 BUG,能觀察到現象還好,萬一是默默破壞而不能很快被察覺,成為一個隱藏 BUG,那才是最危險的。

那為啥問題三增加別的代碼會觸發這個 BUG ,修改優化等級又會消失呢?

這和編譯器有關系,有可能你的代碼導致有問題的代碼使用了不同的內存布局,從而越界篡改的位置變成了重要的內存,因此出現了現象,而優化等級對棧內存布局更是有很大影響。

另外本篇筆記介紹的局部緩存數組的越界,實際上還有全局數組的越界,那種問題相對簡單許多,看 map 文件即可。

因此,操作數組時,一定要時時刻刻檢測數組的索引的大小,以防越界。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5411

    瀏覽量

    123103
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7213
  • 數組越界
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5557
  • printf函數
    +關注

    關注

    0

    文章

    31

    瀏覽量

    6068

原文標題:數組越界是一顆隱形炸彈

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    精彩回顧 | 《電磁兼容仿真技術與電源EMC問題解析》直播圓滿結束!

    賽盛技術于4月22日19:00舉辦了《電磁兼容仿真技術與電源EMC問題解析》專題直播。感謝每一位觀眾的熱情參與與支持,讓我們的直播活動得以圓滿落幕。在此,小編將帶大家一起回顧本次直播中的精彩亮點
    的頭像 發表于 04-23 11:24 ?233次閱讀
    精彩回顧 | 《電磁兼容仿真技術與電源EMC問<b class='flag-5'>題解析</b>》直播圓滿結束!

    數組的下標為什么可以是負數

    最近有同學發來這樣一段代碼,并提出一個問題,數組的下標為什么可以是負數? ? ? #include int main(){ const char *s = "helloworld"; const
    的頭像 發表于 12-20 11:18 ?409次閱讀

    數組名之間可以直接賦值嗎

    數組之間的賦值能不能直接使用等于號?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發表于 11-26 11:23 ?471次閱讀

    指針數組和二維數組有沒有區別

    指針數組和二維數組有沒有區別?比如這樣的兩個代碼。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][6
    的頭像 發表于 11-24 11:12 ?443次閱讀

    C語言數組應用計算機導論A第6講:數組

    C語言數組應用計算機導論A第6講:數組
    發表于 11-20 15:33 ?0次下載

    MLCC斷裂問題解決方案

    MLCC斷裂問題解決方案
    的頭像 發表于 10-16 09:43 ?1057次閱讀

    Keystone EDMA常見問題解

    電子發燒友網站提供《Keystone EDMA常見問題解答.pdf》資料免費下載
    發表于 10-11 10:43 ?0次下載
    Keystone EDMA常見問<b class='flag-5'>題解</b>答

    Keystone NDK常見問題解

    電子發燒友網站提供《Keystone NDK常見問題解答.pdf》資料免費下載
    發表于 10-11 10:41 ?0次下載
    Keystone NDK常見問<b class='flag-5'>題解</b>答

    越界智能監測攝像機:安全防護的新利器

    隨著社會的快速發展,安全問題日益凸顯,尤其是在公共場所和重要設施周邊,如何有效防范非法入侵和潛在威脅成為了亟待解決的難題。越界智能監測攝像機應運而生,以其先進的技術和強大的功能,為安全防護提供了全新
    的頭像 發表于 10-09 09:57 ?405次閱讀
    <b class='flag-5'>越界</b>智能監測攝像機:安全防護的新利器

    TFPxxx常見問題解

    電子發燒友網站提供《TFPxxx常見問題解答.pdf》資料免費下載
    發表于 09-29 09:56 ?0次下載
    TFPxxx常見問<b class='flag-5'>題解</b>答

    越界智能監測攝像機

    隨著科技的不斷發展,越界智能監測攝像機在安防領域得到了廣泛應用。這種智能監測設備結合了圖像識別技術和人工智能算法,旨在實現對區域內物體的越界行為進行監測和警示。通過高清晰度的攝像頭捕捉到場景中的物體
    的頭像 發表于 09-05 11:06 ?446次閱讀
    <b class='flag-5'>越界</b>智能監測攝像機

    labview字符串數組轉化為數值數組

    在LabVIEW中,將字符串數組轉換為數值數組是一項常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW中的數據類型是非
    的頭像 發表于 09-04 17:47 ?4608次閱讀

    TMP LM 75比較常見問題解

    電子發燒友網站提供《TMP LM 75比較常見問題解答.pdf》資料免費下載
    發表于 08-30 11:40 ?0次下載
    TMP LM 75比較常見問<b class='flag-5'>題解</b>答

    面試常考+1:函數指針與指針函數、數組指針與指針數組

    在嵌入式開發領域,函數指針、指針函數、數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針函數與函數指針指針函數:定義:指針
    的頭像 發表于 08-10 08:11 ?1266次閱讀
    面試常考+1:函數指針與指針函數、<b class='flag-5'>數組</b>指針與指針<b class='flag-5'>數組</b>

    EMC問題解決實戰教學2——傳導發射問題解決!

    EMC問題解決之實戰教學SES”信號干擾、復雜的噪聲模型、差共模干擾判斷困難以及測試設備和方法選擇都是工程師在傳導發射測試中常遇到的挑戰。這些困難不僅影響了測試的準確性和可靠性,同時也增加了工程師
    的頭像 發表于 05-28 08:17 ?851次閱讀
    EMC問<b class='flag-5'>題解</b>決實戰教學2——傳導發射問<b class='flag-5'>題解</b>決!
    主站蜘蛛池模板: 麻豆成人久久精品二区三区网站 | 亚洲精品嫩草AV在线观看 | 亚洲 欧美 制服 视频二区 | 欧美性最猛xxxx在线观看视频 | 翘臀少妇被扒开屁股日出水爆乳 | 久久精品国产亚洲AV影院 | 美女xx00| 亚洲免费无码av线观看 | 亚洲嫩草AV永久无码精品无码 | 18禁无遮挡羞羞污污污污免费 | 日韩av国产av欧美天堂社区 | 冈本视频黄页正版 | 嘟嘟嘟在线视频免费观看高清中文 | 超碰99热在线精品视频 | 男神插曲女生软件完整版 | 边吃胸边膜下床震免费版视频 | 99久久蜜臀亚洲AV无码精品 | 亚洲VA欧美VA天堂V国产综合 | 性色AV一区二区三区咪爱四虎 | 国产爱豆剧果冻传媒在线 | 欧美美女论坛 | 国产精品永久AV无码视频 | 亚洲精品第一综合99久久 | 国产精品v欧美精品v日韩 | 最近中文字幕MV免费高清在线 | 国产精品无需播放器 | 脔到她哭H粗话HWWW男男动漫 | 青青草原国产在线观看 | 男人的天堂久久精品激情a 男人的天堂黄色片 | 国产不卡无码高清视频 | 欧美一区二区三区男同 | 国产欧美精品国产国产专区 | 亚洲在线v观看免费国 | 久久中文字幕人妻AV熟女 | 亚洲国产精品无码中文在线 | 91热久久免费频精品99欧美 | 亚洲伊人久久一次 | 东京热一本无码av | 日本高清天码一区在线播放 | 鲁大师影院在线视频在线观看 | 小776论坛 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品