我正在搜索正确的警告标志,以便与gcc一起使用以检测类似的内容:
#include <stdlib.h>
#include <stdio.h>
int main()
{
const size_t n = (size_t)-1;
for( unsigned int i = 0; i < n; ++i ) /* use `unsigned char` if you want */
{
printf( "%d\n", i );
}
return 0;
}
我试过了:
$ gcc -Wsign-conversion -Wconversion -pedantic -Wsign-compare -W -Wall -Wextra -std=c99 t.c
发生的事情是我一直在修改现有代码,它使用unsigned int
作为内存块大小。代码启动失败,文件较大。所以我需要检查一下,我没有遗漏剩下的遗留物。
编辑:
刚刚发现-Wtype-limits
,但这又对我不起作用
答案 0 :(得分:1)
您要求编译器在运行时检测到条件始终为true。在这种情况下,这几乎不可能,因为它总是正确的原因是一方是恒定的而另一方是由unsigned int
类型限制的。我很高兴你找到了一个g ++标志,但是如果变量n
的值是在另一个文件中提供的,或者没有输入const
,那么编译器可能无法检测到条件仍然存在。
您还可以考虑使用静态分析器,它比检测器花费更多时间来检测运行时可能会发生的情况,也可能不会发生。一个开源C分析器是Frama-C:
在屏幕截图中,红色语句被检测为无法访问。
开源版只有在程序限制使用库函数时才能正常工作,但即便如此,它也可以提取g ++警告中没有出现的信息。
答案 1 :(得分:0)
好的,找到了诀窍,你需要使用c ++编译器:
$ g++ -Wextra t.c
t.c: In function ‘int main()’:
t.c:6: warning: comparison is always true due to limited range of data type
使用:
$ g++ --version
g++ (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.