【发布时间】:2017-03-13 11:53:06
【问题描述】:
以下面的 C 代码为例:
int main(int argc, char *argv[])
{
signed char i;
unsigned char count = 0xFF;
for (i=0; i<count;i++)
{
printf("%x\n", i);
}
return 0;
}
这段代码在无限循环中运行,即使我编译如下:
# gcc -Wall -Wpedantic -Wconversion -Wsign-compare -Wtype-limits -Wsign-conversion test.c -o test
有人知道应该警告此类问题的编译器标志吗?
为了清楚起见,我不是在问“为什么会出现无限循环”,而是想知道是否有办法使用编译器或静态分析来防止它?
【问题讨论】:
-
-W 选项不只是警告吗?您的代码将永远运行,因为有符号字符在回绕(或提交一些未定义的行为)之前不能超过 127,因此它不能超过您的循环终止条件。
-
对我来说似乎很像一个家庭作业问题。这么小的程序中不必要的类型不匹配?完全使用
signed char? -
也许 lint 会检测到它。
-
签名字符总是小于 255。因此它不会退出循环。
-
除了现有答案外,还有一个注意事项:确实,您无法检测有符号整数溢出,但使用 gcc,您可以使用
-fwrapv至少 避免UB (但是除非编译器将其用于某些优化,否则您的代码仍然被破坏,这可以通过-wstrict-overflow检测到。简而言之:如果您知道它,您可以检测到它(许多assign-with-overflow -检查那里的实现)但是AFAIK如果你做错了那么你就被咬了
标签: c gcc compiler-warnings unsigned signed