Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

5.4 lint のメッセージ

大部分の lint のメッセージは簡単な 1 行の文で、問題が起こって診断されるたびに出力されます。インクルードファイルで検出されたエラーはコンパイラによって複数回報告されますが、lint によってはそのファイルがほかのソースファイルに何度インクルードされても一度報告されるだけです。複合メッセージは、ファイル全域の矛盾に対して、また時にはファイル内の問題に対しても表示されます。単一メッセージは、検査しているファイルで問題が発生するごとに知らせます。lint フィルタの使用で発生のたびにメッセージを出力する必要がある場合は、-s オプションを指定して lint を呼び出すことによって、複合診断を単純な型に変換できます。詳細は、lint ライブラリを参照してください。

lint のメッセージは stderr に書き込まれます。

5.4.1 メッセージを抑制するオプション

lint 診断メッセージは、いくつかの lint オプションを使用して抑制できます。メッセージは、-erroff オプションのあとに 1 つ以上の tags を指定することによって抑制できます。これらのニーモニックタグは、-errtags=yes オプションで表示できます。

次の表に lint のメッセージを抑制するオプションを示します。

表 15  メッセージを抑制する lint オプション
オプション
抑制されるメッセージ
-a
代入によって暗黙的により小さい型に変換されます
より大きな整数型への変換は符号拡張が不正確になる可能性があります
-b
到達できない文です
-h
等価演算子 "==" の使用が想定される場所に代入演算子 "=" が使用されています
演算子のオペランドが定数です: "!"
case 文を通り抜けます
ポインタのキャストによって境界整列が不正確になる可能性があります
優先度が混乱する可能性があります; 括弧
文が帰結していません: if
文が帰結していません: else
-m
大域的に宣言されていますが静的 (static) にすることができます
-erroff=tag
タグで指定した 1 つまたは複数の lint メッセージ
-u
名前が定義されていますが使用されていません
未定義の名前が使用されています
-v
引数が関数中で使用されていません
-x
名前が宣言されていますが使用も定義もされていません

5.4.2 lint メッセージの形式

lint プログラムは、特定のオプションが指定されている場合、エラーが発生した位置にポインタが表示されている状態で正確なソースファイルの行を表示できます 。この機能を有効にするオプションは -errfmt=f で、これによって lint は次の情報を表示します。

  • ソースの行と位置

  • マクロの展開

  • エラーを起こしやすいスタック

たとえば、次に示すプログラム Test1.c にはエラーがあります。

1 #include <string.h>
2 static void cpv(char *s, char* v, unsigned n)
3 { int i;
4   for (i=0; i<=n; i++){
5        *v++ = *s++;}
6 }
7 void main(int argc, char* argv[])
8 {
9     if (argc != 0){
10        cpv(argv[0], argc, strlen(argv[0]));}
11}

Test1.c に対して lint—errfmt=src オプション付きで使用すると、次の出力が生成されます。

% lint -errfmt=src-Nlevel=2 Test1.c
      |static void cpv(char *s, char* v, unsigned n)
      |            ^  line 2, Test1.c
      |
      |         cpv(argv[0], argc, strlen(argv[0]));
      |                      ^  line 10, Test1.c
warning: improper pointer/integer combination: arg #2
      |
      |static void cpv(char *s, char* v, unsigned n)
      |                               ^  line 2, Test1.c
      |
      |cpv(argv[0], argc, strlen(argv[0]));
      |                       ^ line 10, Test1.c
      |
      |        *v++ = *s++;
      |         ^  line 5, Test1.c
warning: use of a pointer produced in a questionable way
    v defined at Test1.c(2)    ::Test1.c(5)
      call stack:
          main()                ,    Test1.c(10)
          cpv()                 ,    Test1.c(5)

1 つめの警告は、2 つのコード行の間で矛盾があることを示しています。2 つめの警告には、コールスタックとエラーになるまでの制御フローが表示されます。

次に示すプログラム Test2.c には、前述のものとは異なる種類のエラーがあります。

1 #define AA(b) AR[b+l]
2 #define B(c,d) c+AA(d)
3
4 int x=0;
5
6 int AR[10]={1,2,3,4,5,6,77,88,99,0};
7
8 main()
9  {
10  int y=-5, z=5;
11  return B(y,z);
12 }

Test2.c に対して —errfmt=macro オプションを指定して lint を使用すると、マクロ置換の手順を示す次の出力が生成されます。

% lint -errfmt=macro Test2.c
      | return B(y,z);
      |        ^  line 11, Test2.c
      |
      |#define B(c,d) c+AA(d)
      |                 ^  line 2, Test2.c
      |
      |#define AA(b) AR[b+l]
      |                   ^  line 1, Test2.c
error: undefined symbol: l
|
      |    return B(y,z);
      |           ^  line 11, Test2.c
      |
      |#define B(c,d) c+AA(d)
      |                 ^  line 2, Test2.c
      |
      |#define AA(b) AR[b+l]
      |                   ^  line 1, Test2.c
variable may be used before set: l
lint: errors in Test2.c; no output created
lint: pass2 not run - errors in Test2.c