2016-11-10 18 views
2

我有一個龐大的代碼庫。它的聲明如下所示:靜態分析器檢測兩個後/增量運算符

int a = ((unsigned int) ((unsigned char) buffer[offset++]) << 8) | (unsigned int) (unsigned char) buffer[++offset]; 

最近我遷移到更高版本的編譯器。隨着編譯器的遷移,如上所示的複雜語句的演變會導致不一致的結果。

我知道這是一種錯誤的編碼習慣,希望糾正它。尋找可以標記這些錯誤的靜態分析器。任何指向特定的靜態分析器的讚賞。

+0

clang用'-Wunsequenced'檢測,gcc用'-Wsequence-point' – deniss

+1

這不僅僅是壞習慣,它還是一個未定義的行爲錯誤。工具推薦問題是無關緊要的,但是任何一半的體面靜態分析器都會對此代碼尖叫。如果你想確定,選擇一個可以檢查是否符合MISRA-C(其中大多數可以,現在)。在同一表達式中將++與其他操作混合使用會被MISRA-C禁止,從而避免了這個bug。 – Lundin

+0

此外,這些演員表明,編寫此代碼的人完全不知道隱式類型促銷如何在C中工作。這也可以通過閱讀MISRA-C解決,MISRA-C非常關注如何避免隱式類型提升錯誤。 – Lundin

回答

5

這不僅僅是錯誤的編碼習慣。

這是可怕的。您正在向程序中引入未定義行爲的絕對卡車負載。

|,不像||,是不是一個測序點。您同時在概念上增加兩次offset。 C標準沒有定義這種行爲。

你需要立即解決這個問題。暫時擱置靜態分析器。您的編譯器警告標誌套件可以幫助您。但是如果我處於你的位置,我會處於恐慌模式,我會搜索我的代碼庫++--,並檢查每個表達式。

+0

編譯器不需要警告未定義的行爲,因此獲取靜態分析器仍然是一個好主意。 – Lundin

+0

嗯,市場上幾乎所有的靜態分析儀都以某種方式被破壞......但它們仍然比編譯器警告或者根本就沒有分析儀要好。 – Lundin