2016-01-20 38 views
0

所以,在上游來源,我們有此線警告爲鐺的換檔裸整數值默認爲32位

rc_c_max = allmem - (3 << 30); 

上游其通常使用GCC,做事「如預期」。 allmem是uint64_t。 但與鐺,它似乎假設「3」是32位(或可能簽名),並且結果不是「按預期」。一個簡單的解決辦法是將其更改爲

rc_c_max = allmem - (3ULL << 30); 

並且一切正常。通過計算/猜測哪些需要糾正的方法來改變所有裸露的整數變化是很乏味的,有沒有一個警告我可以讓clang指出這一點?-Wall -Wextra不抱怨這一行。

輸出:

1/19/16 9:25:30.000 AM kernel[0]: allmem - (3 << 30) : 0x373333000 : 14817636352 
1/19/16 9:25:30.000 AM kernel[0]: allmem - (3ULL << 30) : 0x273333000 : 10522669056 
+0

'3'的類型爲'signed int'。在編寫包含班次的代碼時,您應該始終考慮類型。 –

回答

2

你正在尋找的標誌是:

-Wshift-sign-overflow 

雖然不像GCC,我建議使用鐺的編譯標誌:

-Weverything 

這將使-Wshift-sign-overflow

+0

完美,在我的代碼中顯示了一個,另外一個在XNU源代碼中很難修復:) – lundman

相關問題