所以,在上游源头,我们有这条线
rc_c_max = allmem - (3 << 30);
通常使用gcc的上游,按“预期”行事。
allmem
是uint64。但是对于clang,它似乎假设“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
最佳答案
你要找的旗子是:
-Wshift-sign-overflow
不过,与gcc不同,我建议使用clang的编译器标志:
-Weverything
这也将使
-Wshift-sign-overflow
成为可能。