警告 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
。
所以,在上游资源中,我们有这一行
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
。