我有一個龐大的代碼庫。它的聲明如下所示:靜態分析器檢測兩個後/增量運算符
int a = ((unsigned int) ((unsigned char) buffer[offset++]) << 8) | (unsigned int) (unsigned char) buffer[++offset];
最近我遷移到更高版本的編譯器。隨着編譯器的遷移,如上所示的複雜語句的演變會導致不一致的結果。
我知道這是一種錯誤的編碼習慣,希望糾正它。尋找可以標記這些錯誤的靜態分析器。任何指向特定的靜態分析器的讚賞。
clang用'-Wunsequenced'檢測,gcc用'-Wsequence-point' – deniss
這不僅僅是壞習慣,它還是一個未定義的行爲錯誤。工具推薦問題是無關緊要的,但是任何一半的體面靜態分析器都會對此代碼尖叫。如果你想確定,選擇一個可以檢查是否符合MISRA-C(其中大多數可以,現在)。在同一表達式中將++與其他操作混合使用會被MISRA-C禁止,從而避免了這個bug。 – Lundin
此外,這些演員表明,編寫此代碼的人完全不知道隱式類型促銷如何在C中工作。這也可以通過閱讀MISRA-C解決,MISRA-C非常關注如何避免隱式類型提升錯誤。 – Lundin