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++ フラグを見つけてくれてうれしいですが、 variable の値がn別のファイルで提供された場合、またはたとえば として型指定されていないconst場合、コンパイラは条件が true のままであることを検出できない可能性があります。

また、実行時に発生する可能性があるものと発生しない可能性があるものを検出するために、コンパイラよりも多くの時間を費やす静的アナライザーの使用を検討することもできます。オープンソースの C アナライザーの 1 つに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 に答える