我在一些我正在使用的代码中发现了一个问题,我担心这可能是代码库的几个方面的问题.该问题与签名/未签名的比较有关:
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都没有说什么.
您可以使用-Wsign-compare与-Wsign-conversion.
当您使用无符号值比较有符号值时,第一个警告您.后者警告您有关从unsigned到signed以及从signed到unsigned的隐式转换.
在你的情况下,-Wsign-compare由于整数提升,将不会做任何事情,同时-Wsign-conversion将警告隐式转换s16 = u16.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |