addresssanitizer heap-buffer-overflow 錯誤

作者: hydebeast (雷槍)   2020-08-16 21:44:56
大家好
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代表的數字計算一下再回傳
感謝各位
作者: LPH66 (-6.2598534e+18f)   2020-08-16 21:53:00
這個錯誤最常見的原因是陣列存取越界, 特別是容器類的存取檢查一下你的 vector 存取會不會在某個奇怪的時候越界
作者: nh60211as   2020-08-16 23:12:00
你的while(no_sign[i] >= 48 && no_sign[i] <= 57)在全部的文字都是有效數字的時候會讀到no_sign[end+1]
作者: Killercat (殺人貓™)   2020-08-16 23:32:00
一個小技巧,STL老問題了vector少用[]多用.at()[]完全不會做任何檢查 所有的out-of-bound都是undefined behavior 什麼奇怪的東西都會跑出來.at()則會相當盡責地做boundary check跟丟std::exception出來,所以別用[]了https://tinyurl.com/lszrg7v看第三段Portable programs......那行
作者: loveme00835 (髮箍)   2020-08-17 00:09:00
為了 portability 更不應該用 at(), 因為在需要效能的時候會因為 at() 快不起來, 而且因為編譯器會產生例外處理的程式碼, 所以也要特別注意介面的設計是否合理, 如果需要檢查建議使用 BOOST_ASSERT() 這類可以切換行為的 contract programming lib, 靜態大小就用 bounded_integer, 到 C++23 時稍微改一下就好了學希佳佳第一件事就是把 cplusplus.com這網站 ban 掉
作者: Killercat (殺人貓™)   2020-08-17 10:09:00
這個就看你喜歡哪種風格了,但是undefined behavior絕對是最有害的,那麼有把握能做到完全檢查的話,你說的應該就沒錯,但是實務上這幾乎是不可能的另外我覺得把std::exception視為洪水猛獸...maa,也是一種主流學說啦,只是我個人覺得不太贊同就是另外其實portability跟效能無關 不然java早就吃屎啦...另外BOOST_ASSERT()是個非常好的解決方案,這我贊同反正就別搞到不想用std::exception結果跑去setjmp就好
作者: hydebeast (雷槍)   2020-08-17 12:19:00
感謝各位!問題的確是出在n大講的部分 其他大大的建議我也會去研究一下的m(_ _)m

Links booklink

Contact Us: admin [ a t ] ucptt.com