Linux 2.6.36.4、GCC 4.7.2、多数の「変数が設定されているが使用されていません」警告を受け取る

Linux 2.6.36.4、GCC 4.7.2、多数の「変数が設定されているが使用されていません」警告を受け取る

デフォルトでは、3.5カーネルを実行しているLinux Mint 14でLinuxカーネル2.6.36.4をコンパイルしようとしています。 gccバージョン4.7.2を使用してください。インターネットを検索しようとしましたが、成功しませんでした。警告は次のとおりです。

warning: variable ‘gfp’ set but not used [-Wunused-but-set-variable]

編集を通して、これらの警告は非常にたくさんあります。コンパイルはどこでも失敗しません。最悪の部分は、コンパイルされたカーネルも正常に起動しないことです。

設定する必要があるgccオプションはありますか?それとも無視すべきですか?

注:私はvirtualboxで開発中です。ストックカーネルはうまく動作します。

答え1

「変数は設定されていますが使用されていません」という警告は、情報提供の目的でのみ使用されます。

~によると公式文書-Wunused-but-set-variable次の動作を制御します。

ローカル変数が割り当てられているが使用されないたびに(宣言を除く)警告が発生します。この警告はによって有効になります-Wall

目的は、プログラマが変数に値を割り当ててから何もしない状況をキャッチすることです。カーネルはやや特別です。これは、低レベルのオペレーティングシステムプログラミングの深淵でこれを行うことが完全に合法的であるか、さらには私でさえ想像できるからです。必要希望の結果を得てください。

変数割り当てステートメントが実際に必要でない場合、コンパイラはこれを最適化できます。

結論は、開発者ではない限り、これらの警告を無視しても安全であるということです。開発者の場合は、割り当てが必要かどうかを検討する必要があります。 GCC以外のコンパイラへの移植性が優先順位ではない場合は、__attribute__((unused))変数に関する警告を表示しないように宣言に追加することを検討してください。変数属性

答え2

それとも無視すべきですか?

未使用変数できるコーディングエラーを示します。これが真実ではないと確信し、特定の変数に関する警告を表示したくない場合は、次のようにします。(GCC固有)__attribute__タグ(例:

/* Unused parameter (in definition, not declaration): */
void somefunc (int x __attribute__ ((unused))) {
    [...]
}

/* Unused variable. */
int x __attribute__ ((unused));
/* But set... */
x = 1;

最初のケースは、APIを実装する場合はまれではありません。たとえば、パラメータを無視するがコールバック署名と一致する必要があるコールバックを作成する場合です。 2番目のケースは少し矛盾しているように見えますが、まだ使用されていないことを宣言して設定し、警告などが気を散らしたくない場合は一時的に便利です。

これはおそらく-Wunused-parameter終了および/または-Wunused-but-set-variable

関連情報