警告 clang 的移动裸整数值默认为 32 位

Warning for clang's shifting bare integer values default to 32 bit

所以,在上游资源中,我们有这一行

rc_c_max = allmem - (3 << 30);

通常使用 gcc 的上游执行 "as expected"。 allmem 是 uint64_t。 但是对于 clang,它似乎假设“3”是 32 位(或者可能有符号)并且结果不是 "as expected"。一个简单的解决方法是将其更改为

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

一切正常。通过工作 out/guessing 来更改所有的整数班次需要更正是乏味的,是否有警告我可以启用 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