所以,在上游源头,我们有这条线

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成为可能。

10-08 12:02