所以,在上游来源中,我们有这条线
rc_c_max = allmem - (3 << 30);
通常使用gcc的上游,按预期“完成”。 allmem
是uint64_t。
但是对于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
答案 0 :(得分:2)
您正在寻找的旗帜是:
-Wshift-sign-overflow
虽然与gcc不同,我建议使用clang的编译器标志:
-Weverything
这也将启用-Wshift-sign-overflow
。