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

时间:2016-01-20 06:54:54

标签: c clang

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

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

1 个答案:

答案 0 :(得分:2)

您正在寻找的旗帜是:

-Wshift-sign-overflow  

虽然与gcc不同,我建议使用clang的编译器标志:

-Weverything  

这也将启用-Wshift-sign-overflow