我在某些代码中发现了一个问题我正在处理我可能在代码库的几个方面存在问题。该问题与签名/未签名的比较有关:
unsigned short u16;
short s16;
u16 = 0x8000;
s16 = u16;
if (u16 > s16) {
/* This is what gets printed in GCC */
printf("u16 > s16\n");
} else if (u16 == s16) {
printf("u16 == s16\n");
} else {
printf("u16 < s16\n");
}
我理解why this is an issue。有没有很好的方法可以在您的代码库中可靠地找到这种问题?理想情况下,它会显示为编译器警告或静态代码分析警告,但GCC和Coverity都没有说什么。
答案 0 :(得分:5)
您可以将-Wsign-compare
与-Wsign-conversion
一起使用。
当您将签名值与无符号值进行比较时,第一个警告您。后者警告您隐式转换从无符号到签名,从签名到无符号。
在您的情况下-Wsign-compare
由于整数提升而无法执行任何操作,而-Wsign-conversion
会在s16 = u16
中警告隐式转化。