addresssanitizer heap-buffer-overflow 錯誤

看板C_and_CPP作者 (晴日橘子)時間3年前 (2020/08/16 21:45), 編輯推噓2(2027)
留言29則, 5人參與, 3年前最新討論串1/1
大家好 https://reurl.cc/N6akmq 小弟在寫leetcode第八題的時候 運行程式碼出現這個錯誤 addresssanitizer heap-buffer-overflow 我的程式碼 https://glot.io/snippets/fqanzjusa4 這個程式碼在自己的compiler上會過 而且試過幾種input感覺應該沒問題 就是不知道為何在leetcode上跑會出現那個錯誤@@ 我有試著搜尋一下那個錯誤的意思是什麼 但小弟初學實在有點看不懂... 不知有沒有大大可以簡單解釋一下orz 我程式碼的邏輯: 建三個vector : no_space, no_sign, ans_v 先用no_space把str從第一個非空白的地方開始存起來 再判斷no_space開頭是否有正負號,有的話紀錄下來,然後用no_sign把no_space除了開頭正負號以外的部分再存起來 接著用ans_v把no_sign裡遇到第一個非數字之前的數字部分存下來 最後把ans_v代表的數字計算一下再回傳 感謝各位 ----- Sent from JPTT on my Samsung SM-G950F. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.14.226.161 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1597585500.A.982.html

08/16 21:53, 3年前 , 1F
這個錯誤最常見的原因是陣列存取越界, 特別是容器類的存取
08/16 21:53, 1F

08/16 21:53, 3年前 , 2F
檢查一下你的 vector 存取會不會在某個奇怪的時候越界
08/16 21:53, 2F

08/16 23:12, 3年前 , 3F
你的while(no_sign[i] >= 48 && no_sign[i] <= 57)
08/16 23:12, 3F

08/16 23:13, 3年前 , 4F
在全部的文字都是有效數字的時候會讀到no_sign[end+1]
08/16 23:13, 4F

08/16 23:32, 3年前 , 5F
一個小技巧,STL老問題了
08/16 23:32, 5F

08/16 23:32, 3年前 , 6F
vector少用[]多用.at()
08/16 23:32, 6F

08/16 23:32, 3年前 , 7F
[]完全不會做任何檢查 所有的out-of-bound都是undefine
08/16 23:32, 7F

08/16 23:33, 3年前 , 8F
d behavior 什麼奇怪的東西都會跑出來
08/16 23:33, 8F

08/16 23:34, 3年前 , 9F
.at()則會相當盡責地做boundary check跟丟std::excepti
08/16 23:34, 9F

08/16 23:34, 3年前 , 10F
on出來,所以別用[]了
08/16 23:34, 10F

08/16 23:51, 3年前 , 11F

08/16 23:51, 3年前 , 12F
看第三段Portable programs......那行
08/16 23:51, 12F

08/17 00:09, 3年前 , 13F
為了 portability 更不應該用 at(), 因為在需要效能
08/17 00:09, 13F

08/17 00:09, 3年前 , 14F
的時候會因為 at() 快不起來, 而且因為編譯器會產生
08/17 00:09, 14F

08/17 00:10, 3年前 , 15F
例外處理的程式碼, 所以也要特別注意介面的設計是否
08/17 00:10, 15F

08/17 00:13, 3年前 , 16F
合理, 如果需要檢查建議使用 BOOST_ASSERT() 這類可
08/17 00:13, 16F

08/17 00:14, 3年前 , 17F
以切換行為的 contract programming lib, 靜態大小就
08/17 00:14, 17F

08/17 00:15, 3年前 , 18F
用 bounded_integer, 到 C++23 時稍微改一下就好了
08/17 00:15, 18F

08/17 00:19, 3年前 , 19F
學希佳佳第一件事就是把 cplusplus.com這網站 ban 掉
08/17 00:19, 19F

08/17 10:09, 3年前 , 20F
這個就看你喜歡哪種風格了,但是undefined behavior絕
08/17 10:09, 20F

08/17 10:10, 3年前 , 21F
對是最有害的,那麼有把握能做到完全檢查的話,你說的
08/17 10:10, 21F

08/17 10:10, 3年前 , 22F
應該就沒錯,但是實務上這幾乎是不可能的
08/17 10:10, 22F

08/17 10:11, 3年前 , 23F
另外我覺得把std::exception視為洪水猛獸...maa,也是
08/17 10:11, 23F

08/17 10:11, 3年前 , 24F
一種主流學說啦,只是我個人覺得不太贊同就是
08/17 10:11, 24F

08/17 10:11, 3年前 , 25F
另外其實portability跟效能無關 不然java早就吃屎啦...
08/17 10:11, 25F

08/17 10:12, 3年前 , 26F
另外BOOST_ASSERT()是個非常好的解決方案,這我贊同
08/17 10:12, 26F

08/17 10:13, 3年前 , 27F
反正就別搞到不想用std::exception結果跑去setjmp就好
08/17 10:13, 27F

08/17 12:19, 3年前 , 28F
感謝各位!問題的確是出在n大講的部分 其他大大的建議
08/17 12:19, 28F

08/17 12:19, 3年前 , 29F
我也會去研究一下的m(_ _)m
08/17 12:19, 29F
文章代碼(AID): #1VEJXSc2 (C_and_CPP)