[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
警告とは診断メッセージであり、本来のエラーではないが、潜在的な 危険性があったり、誤りが存在する可能性のある構文について報告する。
‘-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
printf
や scanf
等の関数の呼びだしを検査し、
指定された引数の型が、フォーマット文字列で指定されたものと
あっているかどうかを調べる。
-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
以下の出来事に対して追加で警告メッセージを出力する。
longjmp
の呼び出しにより変えられる可能性が
ある。この警告は最適化コンパイルの場合にのみ可能になる。
コンパイラは setjmp
の呼び出ししか分からない。
どこで longjmp
が呼ばれるかを知ることはできない。
実際、シグナルハンドラからは、コードの任意の点で呼び出される可能性がある。
その結果、実際には何も問題がなくても警告を受けることがある。
これは、longjmp
が、実際に問題を起こした箇所から呼び出されることは
ありえないからである。
foo (a) { if (a > 0) return a; } |
static
のような記憶クラス指定子が宣言の最初でないところにある。
C 規格によれば、この使い方は廃れつつある。
x.h
の初期化子を中括弧で
囲んでいないからである。
struct s { int f, g; }; struct t { struct s h; int i; }; struct t x = { 1, 2, 3 }; |
x.h
が暗黙に
ゼロに初期化されるからである。
struct s { int f, g, h; }; struct s x = { 3, 4 }; |
-Wtraditional
旧来の C と ANSI C で動作が異なる構文について警告する。
switch
文の引数が、long
型である。
static
関数の宣言の後に static
版が続く。
この構文は、幾つかの古い 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]
とし、
その文字列のアドレスを非const
の char *
型のポインタに
コピーしたときに警告を出させるようにする。
この警告は、文字列定数に書き込む可能性のあるコンパイル時コードを
見つける助けとなる。ただし、宣言とプロトタイプで 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.