靜態程式碼分析工具可簡化編碼過程,檢測出錯誤並幫助修復。有個國外團隊檢測了 200 多個 C/C++ 開源專案,包括了 Php、Qt 和 Linux 核心等知名專案。於是他們每天分享一個錯誤案例,並給出相應建議。
譯註:本文所指出的錯誤例子其實非常簡單,任何 C++ 的初學者都能看懂。但是這個錯誤也非常典型,估計很多非常嚴肅的程式碼裡面都存在這樣的錯誤。
這個 Bug 是來自於 CoreCLR 原始碼(譯註:高大上的出處啊!)
錯誤程式碼:
1 2 |
bool operator( )(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; } |
解釋:
你不能將 memcpy()、strcmp() 以及其他一些標準函式的返回值,和 1、-1 這些具體的數字做比較,因為這些函式的返回值只保證大於 0 或者小於 0(譯註:而並不保證大於0就等於1,小於0就等於-1)。
上面那段錯誤的程式碼可能在很長時間內都能正常工作。不過那僅僅是因為運氣好而已,沒什麼其他原因。某一天你寫的函式很可能突然間就崩潰了 —— 比如,你換了一個編譯器編譯原始碼,或者通過其他方式優化了 memcpy() 函式。然後你的程式碼就不能正常工作了。
正確的程式碼:
1 2 |
bool operator( )(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) < 0; } |
建議:
不要依賴函式本身的行為。如果文件上說一個函式能返回一個不等於 0 的值,那它就是這麼實現的。也就是說這個函式可能返回 -10、2 或者 1024。你可能經常看到函式的返回值就是 -1、0 或者 1,但是這並不能保證它每次都會這麼做。
這個錯誤是通過 PSV-Studio 靜態分析工具掃描分析得到的。錯誤文字如下:V698 表示式 “memcmp(…) == -1“ 是不正確的。這個函式可能的返回值不一定只有“-1”,而可能是任何負數。請考慮到使用 “memcmp(…) < 0 ”來替換。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!