[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 警告を要求/抑止するオプション

警告とは診断メッセージであり、本来のエラーではないが、潜在的な 危険性があったり、誤りが存在する可能性のある構文について報告する。

-W’ で始まるオプションを指定することで、多くの特定の警告を要求 することができる。 例えば、‘-Wimplicit’ は、暗黙の宣言についての警告を出すよう要求する。 これらの特定の警告オプションには、警告を抑止する、‘-Wno-’ で 始まる否定形がある。例えば、‘-Wno-implicit’ というのがある。 このマニュアルでは、二つの形式のうちの、デフォルトでは無い方だけを列挙する。

以下のオプションは、GCC により生成される警告の量と種類を制御する。

-fsyntax-only

文法チェックのみを行ない、それ以上のことは一切行なわない。

-pedantic

ANSI C と ISO C++ に厳密に準拠した場合に要求される警告を全て発する。 また、禁じられている拡張を使っているプログラムを全て拒絶する。

ANSI C と ISO C++ に則ったプログラムは、このオプションを指定してもしなくても、 正しくコンパイルが行なわれる(まれに、‘-ansi’ をオプションを 必要とする場合もあるが)、 しかし、このオプションを指定しない場合は、GNU の拡張機能と 古い形式の C と C++ の機能もサポートされる。このオプションを指定すると それらは拒絶される。

-pedantic’ は、先頭と末尾が ‘__’ である名前を持つ 別キーワードを使う分には警告メッセージを出さない。 「衒学的」(pedantic)な警告は、__extension__ に続く式についても 抑止される。 しかし、このような抜け道を使うのはシステムのヘッダファイルに とどめるべきであり、アプリケーションプログラムは使わないように したほうが良い。See section もう一組のキーワード.

このオプションは役に立つことを目的としていない。 単に、これがないと、GCC が ANSI 標準をサポートしていないと 文句を言い立てる輩を満足させるためだけのものである。

読者の中には、‘-pedantic’ を使って、プログラムが厳密に ANSI C に 適合しているかどうかを検査してみる人がいるかもしれない。 でもすぐに、期待通りというわけではないことが分かるだろう。 ‘-pedantic’ は、非 ANSI 的な構文のうちの幾つかを見つけるだろう。 だが、全部ではない。ANSI C が診断メッセージを要求しているもの だけなのである。

ANSI C に適合しない点についてはどんなまのでも報告する機能は場合によっては 有用かもしれないが、相当の作業量を必要とするし、‘-pedantic’ とは 全く異なったものになるだろう。 我々は近い将来このような機能をサポートする計画はない。

-pedantic-errors

-pedantic’ と同様だが、警告の代わりにエラーとする。

-w

全ての警告メッセージを抑止する。

-Wno-import

#import’ の使い方に関する警告を抑止する。

-Wchar-subscripts

配列の添え字の型が char なら警告を出す。 これは良くある間違いの元となる。プログラマは、この型がマシンによっては 符号付きになることを良く忘れるからである。

-Wcomment

コメント開始文字列 ‘/*’ が ‘/*’ 形式のコメント中に 現れたり、バックスラッシュ-改行が ‘//’ 形式のコメントに 現れた場合に警告を出す。

-Wformat

printfscanf 等の関数の呼びだしを検査し、 指定された引数の型が、フォーマット文字列で指定されたものと あっているかどうかを調べる。

-Wimplicit-int

宣言に型指定がない場合に警告をだす。

-Wimplicit-function-declaration
-Werror-implicit-function-declaration

関数が宣言される前に使われている場合に警告(あるいはエラー)を出す。

-Wimplicit

-Wimplicit-int’ と ‘-Wimplicit-function-declaration’ に同じ。

-Wmain

main’ の型に不備がある場合に警告を出す。 ‘main’ は、外部リンケージで、int を返し、適切な型の引数をゼロ個か、 二個か、三個を取る関数とすべきである。

-Wmultichar

複数文字からなる文字定数(‘'FOOF'’ が使われた場合に警告を出す。 こういうものは普通はユーザのコードのタイポを示しており、 実装定義の値になるので、可搬なコードでは使うべきではないからである。

-Wparentheses

特定の文脈において括弧が省略されている場合に警告を出す。 そのような文脈としては、真偽値が期待されている文脈で 代入を行なっていたり、優先順位を良く間違える人が多いような演算子が 入れ子になっている場合等である。

また、ある else 文がどの if 文に属するか 混乱する可能性のある構文についても警告する。 以下にその例を挙げる。

 
{
  if (a)
    if (b)
      foo ();
  else
    bar ();
}

C では、どの else 文も可能なうちで最も内側の if 文に所属する。 これは、プログラマが期待するものと違うことが良くある。 上の例では、プログラマが期待するものは字下げで示されているものである。 このような混乱の可能性がある場合は、GNU C は、このオプションを指定 している場合には、警告を出す。 警告を出さない用にするには、最も内側の if 文を括弧で明示的に 括って、else が外側の if には属する術が無いことを 知らせる。 それを反映したコードは以下のようになる。

 
{
  if (a)
    {
      if (b)
        foo ();
      else
        bar ();
    }
}
-Wreturn-type

関数定義で、戻り値型の指定がなくデフォルトの int 型に なる関数について警告を出す。 また、戻り値型が void でない関数内で、 戻り値なしの return 文があったら警告を出す。

-Wswitch

switch 文のインデックスが列挙型であり、その列挙型の 列挙定数のうち、一個以上について case が欠けている場合に、 警告を出す。 (ラベル default があれば、この警告はでない。) 列挙値の範囲外の case ラベルがある場合も、 このオプションが指定されていれば、この警告が出される。

-Wtrigraphs

トリグラフを見つけたら警告を出す(トリグラフが有効になっている場合)。

-Wunused

変数が、宣言以外の所で使われていない場合、 関数が static として宣言されているが定義されていない場合、 ラベルが宣言されているが使われていない場合、それに明示的には 使われない結果を計算している文がある場合に警告を出す。

使われていない関数の仮引数についての警告を出すには、 ‘-W’ と ‘-Wunused’ を両方指定しなければならない。

ある式について、この警告を出さないようにするには、単にその式を void にキャストする。 変数と仮引数、ラベルについてこの警告を出さないようにするには、 ‘unused’ 属性を使う(see section 変数の属性の指定)。

-Wuninitialized

自動変数が、最初に初期化する前に使われている場合に警告をだす。

この警告は、最適化を伴うコンパイルの場合にのみ発生する。 なぜなら、この警告を出すには、最適化を行なった場合にのみ 計算される、データフロー情報を必要とするからである。 ‘-O’ を指定しない場合には、単にこの警告が出ないだけである。

この警告は、レジスタ割当の候補となる変数に対してだけ出される。 このため、volatile と宣言されていたり、アドレスを取っていたり、 サイズが 1、2、4、8 バイト以外の変数に対してのみ発生する。 また、構造体、共用体、配列についても、たとえそれらがレジスタに 置かれていても警告はでない。

それ自身決して使われることのない値を計算するのにだけ使われる変数に ついては警告が出ないことに注意。 そういう計算自体が、警告が出力される前のデータフロー解析で 削除されるからである。

これらの警告がデフォルトではなくてオプションになっているのは、 そのコードにエラーがあるように見えるのに、正しいかもしれない という理由が全て分かるほど GCC は賢くないからである。 以下に、どういうふうに発生するかの例を一つ示す。

 
{
  int x;
  switch (y)
    {
    case 1: x = 1;
      break;
    case 2: x = 4;
      break;
    case 3: x = 5;
    }
  foo (x);
}

y の値が常に 1、2、3 のどれからなら、x は 常に初期化される。だが、GCC はそのことを知らない。 次の例はもう一つの良くあるケースである。

 
{
  int save_y;
  if (change_y) save_y = y, y = new_y;
  …
  if (change_y) y = save_y;
}

この場合は、save_y が使われるのは、値が設定されている場合のみ だから問題はない。

使っている関数のうち、決して戻らない関数を全て noreturn と 宣言すると、幾つかの見せ掛けの警告を回避することができる。

-Wunknown-pragmas

GCC が知らない #pragma 命令に出会った場合に警告を出す。 このコマンド行オプションを指定すると、システムヘッダファイルの中に 知らない pragma があった場合にも警告を出す。 これは、警告がコマンド行オプション ‘-Wall’ によってのみ 有効になる場合ではない。

-Wall

上記の全ての ‘-W’ オプションを組み合わせる。 これにより、ユーザによっては疑問に思うような構文のうち、 回避したり抑止するよう修正するのが簡単なものついては、それが マクロを使っているものであっても、全てについて警告を出す。

以下の ‘-W…’ オプションは、‘-Wall’ には含まれない。 この中の幾つかは、一般にはユーザが問題とは考えないことが多い構文に 関して警告するが、検査したくなることも時々あるような問題でもある。 その他のものは、ある場合には回避することが必要だったり、あるいは回避することが 難しい構文について警告する。これらの警告は、出さないようにするための コードの簡単な修正方法がないものである。

-W

以下の出来事に対して追加で警告メッセージを出力する。

-Wtraditional

旧来の C と ANSI C で動作が異なる構文について警告する。

-Wundef

未定義の識別子が、‘#if’ 制御子の中で評価される場合に 警告を出す。

-Wshadow

あるローカル変数が別のローカル変数を覆い隠す時に警告を出す。

-Wid-clash-len

二つの異なる識別子の最初の len 文字が一致するときに警告する。 これは、プログラムをある種の古い、腐ったコンパイラでコンパイルが通る ようにするときに役に立つであろう。

-Wlarger-than-len

len バイトより大きなオブジェクトが定義された場合に警告を出す。

-Wpointer-arith

関数型や void 型の「大きさ」に依存しているもの全てについて 警告する。GNU C は、 void * ポインタと関数へのポインタの計算に便利なように、 これらの型の大きさに 1 を割り当てている。

-Wbad-function-cast

関数呼び出しが、マッチしない型にキャストされた時に警告する。 例えば、int malloc()anything * にキャストされると 警告を出す。

-Wcast-qual

ポインタが、それが指す型から型修飾子を取り除いた型にキャストされると 警告を出す。例えば、const char *char * に キャストすると警告を出す。

-Wcast-align

ポインタが、その指す型に必要とされるアラインメントが大きくなるように キャストされると警告を出す。例えば、整数は2バイトまたは4バイト境界でしか アクセスできない機種で、char *int * にキャストすると 警告が出る。

-Wwrite-strings

文字列定数の型を const char[length] とし、 その文字列のアドレスを非constchar * 型のポインタに コピーしたときに警告を出させるようにする。 この警告は、文字列定数に書き込む可能性のあるコンパイル時コードを 見つける助けとなる。ただし、宣言とプロトタイプで const を 注意深く使わなければならない。 そうしないと、単に邪魔になるだけである。 このため、‘-Wall’ ではこの警告を出さないようにしている。

-Wconversion

プロトタイプ宣言のために、プロトタイプ宣言がない場合に同じ引数が 受けるのとは異なる型変換が起こる場合に警告を出す。 これは、固定小数点と浮動小数点間の変換を含み、デフォルトの格上げと 同じになる場合を除いて、固定小数点引数の幅や符号を変える変換も含む。

また、負の整数定数式が暗黙に符号なし型に変換されるときも警告を出す。 例えば、x が符号なしであれば、x = -1 という代入に 警告を出す。しかし、(unsigned) -1 のような明示的なキャストには 警告を出さない。

-Wsign-compare

符号付きの値と符号なしの値を比較するとき、符号付きの値が 符号なしに変換されると間違った結果になるときに警告を出す。 この警告は ‘-W’ によっても有効になる。‘-W’ が出す他の警告を、 この警告を出さずに得るには、‘-W -Wno-sign-compare’ を使う。

-Waggregate-return

構造体や共用体を返す関数が定義されているか呼び出されていると警告する。 (配列を返せる言語でも、警告を引き出す。)

-Wstrict-prototypes

関数が、引数の型指定なしで宣言されていたり、定義されていると 警告を出す。(古い形式の関数定義は、引数の型を指定する宣言が 事前にあれば、許され、警告は出ない。)

-Wmissing-prototypes

グローバルな関数が事前のプロトタイプ宣言なしで定義された場合に 警告を出す。この警告は、関数の定義自身がプロトタイプ宣言を提供している 場合でも発行される。目的は、ヘッダファイルで宣言されていない グローバルな関数を検出することにある。

-Wmissing-declarations

グローバルな関数が事前の宣言なしで定義された場合に 警告を出す。関数の定義自身がプロトタイプ宣言を提供している 場合でも警告が出る。このオプションを使って、ヘッダファイルで宣言されていない グローバルな関数を検出する。

-Wmissing-noreturn

属性 noreturn の候補になる可能性のある関数について警告する。 これらはあくまで候補であって、絶対的なものではないことに注意。 noreturn 属性を追加する前に、関数が実際に決して戻らないことを 自分で注意深く検証する必要がある。そうしないと、微妙なコード生成のバグ が持ち込まれる可能性がある。

-Wredundant-decls

同じスコープ内で複数回宣言されているものがあれば警告する。 これは、複数回宣言することが有効であり、何も変えない場合でも 該当する。

-Wnested-externs

extern 宣言が関数内にあると警告する。

-Winline

関数が inline 宣言されているか、‘-finline-functions’ オプションが 指定されているときに、インライン展開できない関数があれば警告を出す。

-Wlong-long

long long’ 型が使われていると警告を出す。これはデフォルトである。 この警告メッセージを出さないようにするには、‘-Wno-long-long’ を 指定する。‘-Wlong-long’ と‘-Wno-long-long’ オプションは、 ‘-pedantic’ オプションが指定されている場合にのみ、考慮される。

-Werror

全ての警告をエラーに変える。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.