用于伪造比较的gcc警告标志

时间:2013-03-01 15:02:32

标签: gcc

我正在搜索正确的警告标志,以便与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,但这又对我不起作用

2 个答案:

答案 0 :(得分:1)

您要求编译器在运行时检测到条件始终为true。在这种情况下,这几乎不可能,因为它总是正确的原因是一方是恒定的而另一方是由unsigned int类型限制的。我很高兴你找到了一个g ++标志,但是如果变量n的值是在另一个文件中提供的,或者没有输入const,那么编译器可能无法检测到条件仍然存在。

您还可以考虑使用静态分析器,它比检测器花费更多时间来检测运行时可能会发生的情况,也可能不会发生。一个开源C分析器是Frama-C

function does not reach return

在屏幕截图中,红色语句被检测为无法访问。

开源版只有在程序限制使用库函数时才能正常工作,但即便如此,它也可以提取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.