检测已签名与未签名的比较错误

时间:2018-04-04 17:39:52

标签: c

我在某些代码中发现了一个问题我正在处理我可能在代码库的几个方面存在问题。该问题与签名/未签名的比较有关:

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都没有说什么。

1 个答案:

答案 0 :(得分:5)

您可以将-Wsign-compare-Wsign-conversion一起使用。

当您将签名值与无符号值进行比较时,第一个警告您。后者警告您隐式转换从无符号到签名,从签名到无符号。

在您的情况下-Wsign-compare由于整数提升而无法执行任何操作,而-Wsign-conversion会在s16 = u16中警告隐式转化。