1

我正在寻找与 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,但这又不适合我

4

2 回答 2

1

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

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

函数未达到返回

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

开源版本只有在程序有限使用库函数的情况下才能正常工作,但即便如此,它也可以提取 g++ 警告中没有出现的信息。

于 2013-03-01T15:36:20.700 回答
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.
于 2013-03-01T15:18:23.303 回答