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

Pau*_*ulH 3 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");
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么这是一个问题.有没有很好的方法可以在您的代码库中可靠地找到这种问题?理想情况下,它会显示为编译器警告或静态代码分析警告,但GCC和Coverity都没有说什么.

Sta*_*irl 5

您可以使用-Wsign-compare-Wsign-conversion.

当您使用无符号值比较有符号值时,第一个警告您.后者警告您有关从unsigned到signed以及从signed到unsigned的隐式转换.

在你的情况下,-Wsign-compare由于整数提升,将不会做任何事情,同时-Wsign-conversion将警告隐式转换s16 = u16.