我已經被咬了幾次,我會寫一個超出范圍的陣列。我已經在一個特定的韌體上作業了 2 年多,并且懷疑現在幾乎不可能找到的溢位 - 例如:
uint8_t example[50];
uint8_t example2[100];
for(uint8_t i = 0; i < sizeof(example2); i )
example[i] = i;
我知道上面的代碼示例是原始的。這只是我試圖描述的一個例子。
是否有可用的包或功能可以檢測這些“泄漏”?
uj5u.com熱心網友回復:
帶有標志的最新版本的 GCC-Wall
將檢測簡單的錯誤,例如您的示例中的問題,并列印警告。
Valgrind 工具更高級,但也需要更多的作業來正確配置和使用。
世界上沒有工具可以檢測出所有可能的錯誤,所以從最容易使用的開始。
uj5u.com熱心網友回復:
靜態分析只能做這么多,但這里有幾個我每天都在使用的工具:
- cppcheck
- clang-tidy ( LLVM的一部分) - 如果你不使用 CMake,設定起來并不容易。
此外,正如 Tom V 指出的那樣,打開盡可能多的警告(-Wall
這是最低要求 -這是一組很好的警告標志)。
uj5u.com熱心網友回復:
GCC會警告此類越界問題。使用以下代碼編譯此代碼示例-Wall -pedantic -O1
:
int main(void) {
int example[50];
for (int i = 0; i < 100; i )
example[i] = i;
return example[0];
}
...導致此編譯警告(使用 ARM GCC 11.2 (linux),可在Godbolt上測驗,就像在 Tom V 的回答的評論中已經指出的那樣):
<source>: In function 'main':
<source>:4:20: warning: iteration 50 invokes undefined behavior [-Waggressive-loop-optimizations]
4 | example[i] = i;
| ~~~~~~~~~~~^~~
<source>:3:23: note: within this loop
3 | for (int i = 0; i < 100; i )
| ~~^~~~~
Compiler returned: 0
在這種情況下,需要優化選項標志-O1
(或-O2
, -Os
)才能從 GCC 獲得未定義的行為警告。-O3
優化回圈輸出,因此不會有警告。沒有優化(默認選項)也不會導致警告,因為據我所知-O0
,GCC 顯然只在優化回圈時才注意到越界問題(請參閱 參考資料)。-Waggressive-loop-optimizations
(一些注意事項:GCC-fstack-check
和-fstack-protector
選項也可能值得一看(運行時檢查)。Valgrind或其他靜態/動態分析工具也很有用。但是,在微控制器上,在目標上運行時分析程式通常并不容易,模擬器或在開發機器上使用不同的編譯器編譯程式的非平臺特定部分也可以提供幫助,使其更加嚴格。
此處討論了相關主題:Accessing an array out of bounds 沒有錯誤,為什么?, gcc 選項 -fstack-check 究竟是如何作業的?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430164.html