Last Updated on 2021-10-06 by Clay
最近在練習解 LeetCode 的題目時,突然間跳出了一個沒有提供任何行號的報錯:
ERROR: AddressSanitizer: heap-buffer-overflow on address
這令人困擾的,突然間一下子不知道如何 DEBUG。
上網查了一下,這才發現 Address Sanitizer 是個檢查記憶體存取是否錯誤的工具,在一般於本機端自己寫編譯程式執行的時候因為沒有設定,所以幾乎肯定不會遇到,因為 C/C++ 編譯器通常不會替你的記憶體存取做邊界檢查。
但是在 LeetCode 執行測試程式時,由於嚴格地控制你上傳的程式不要存取並非你所要求的記憶體區塊,所以在錯誤要求記憶體區塊時會回傳此一錯誤訊息。
解決方法
解決方法很單純卻很麻煩:確認自己沒有做超過記憶體邊界的請求。最常見的狀況之一,就是呼叫超過陣列物件長度的 index 元素。
在網路上看到許多人添加了判斷式防止自己存取錯誤的索引,這也是一種可能的方法。
當然,若想要徹底解決這個問題,也可以在自己的本機端環境中安裝 Address Sanitizer 工具來測試。
References
- https://stackoverflow.com/questions/51579267/addresssanitizer-heap-buffer-overflow-on-address
- https://github.com/google/sanitizers/wiki/AddressSanitizer