# 推奨セットに含めない警告オプションとその理由

本ドキュメントは、gcc 警告オプション運用ガイド の推奨警告セットに
含めなかった警告オプションについて、除外理由を整理したものです。

# 1 判断基準

除外の判断は、ガイドの基本方針に基づいています。

基準 | 方針の根拠
--- | ---
バグ直結性 | 「バグに直結しやすい警告のみを厳選して追加します」
抑制禁止 | 「警告を抑制するための指定 (=0, -Wno-*) は原則使いません」
既存カバー | -Wall -Wextra またはデフォルトで既に有効な警告は重複追加しません
対象環境 | EL8 (gcc8) と EL10 (gcc14) の両方で利用可能であること

除外理由を以下のカテゴリに分類しています。

カテゴリ | 説明
--- | ---
A. 既に有効 | -Wall / -Wextra / デフォルトに含まれるため重複します
B. 抑制指定 | =0 による警告抑制であり、基本方針に違反します
C. スタイル制約 | コーディングスタイルの強制であり、バグ検出ではありません
D. 最適化情報 | コンパイラ最適化に関するフィードバックであり、コードの正しさと無関係です
E. 高ノイズ | 正当なコードに対する警告が多く、品質ゲートとして機能しません
F. 環境非対応 | 対象環境 (gcc8 以降) で利用できません

# 2 -W

項目 | 内容
--- | ---
除外カテゴリ | A. 既に有効
概要 | -Wextra の旧名 (非推奨エイリアス)

推奨セットに -Wextra を含んでいるため、-W を併記する意味はありません。
GCC のドキュメントでも -Wextra の使用が推奨されています。

# 3 -Wbad-function-cast

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | 関数の戻り値を異なる型クラスにキャストした場合に警告 (C 専用)

明示的なキャストに対して警告するため、開発者が意図的に型変換している箇所にも
警告が発生します。`(int)strlen(s)` のような一般的かつ安全なパターンでも
警告されるため、品質ゲートとして運用すると大量の抑制が必要になります。

型変換の安全性を包括的に検出するには -Wconversion の方が適切ですが、
こちらもノイズが多いため推奨セットには含めていません。

# 4 -Wdeclaration-after-statement

項目 | 内容
--- | ---
除外カテゴリ | C. スタイル制約
概要 | 文の後に変数宣言がある場合に警告 (C89 スタイルの強制、C 専用)

C89 では変数宣言はブロック先頭のみに許可されていましたが、C99 以降は
文の後の宣言が合法です。対象環境 (gcc8: gnu11、gcc14: gnu17) は
いずれも C99 以降が既定であり、この制約を課す理由はありません。

さらに、使用箇所に近い宣言はスコープを狭め、未初期化変数のリスクを
低減するため、C99 スタイルの方がバグ防止に寄与します。
モダナイゼーションの方向性とも相反します。

# 5 -Wdisabled-optimization

項目 | 内容
--- | ---
除外カテゴリ | D. 最適化情報
概要 | コードが複雑すぎて最適化パスが無効化された場合に警告

コンパイラの最適化器が内部的に処理を断念したことを通知するものであり、
コードの正しさや移植性とは無関係です。
出力の有無はコンパイラバージョンや最適化レベルに強く依存し、
gcc8 と gcc14 で挙動が異なる可能性が高いです。品質ゲートには適しません。

# 6 -Wfloat-equal

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | 浮動小数点数の等値比較 (==, !=) に警告

浮動小数点数の等値比較が危険な場合があるのは事実ですが、0.0 との比較や
番兵値との比較など、正当なパターンも多くあります。
一律に警告すると誤検出が多発し、品質ゲートとして機能しません。

本プロジェクトのサンプルコード (calc) は整数演算が中心であり、
浮動小数点演算の安全性はコードレビューで対応する方が実用的です。

# 7 -Wformat-overflow=0

項目 | 内容
--- | ---
除外カテゴリ | B. 抑制指定
概要 | -Wformat-overflow による書式オーバーフロー検出を無効化

=0 は警告の抑制指定であり、基本方針「警告を抑制するための指定
(=0, -Wno-*) は原則使いません」に違反します。

-Wformat-overflow は gcc7 以降で -Wall に含まれており (レベル 1)、
推奨セットではこれをそのまま有効にしています。
抑制ではなく、警告が出ないコードを書くべきです。

# 8 -Wimplicit-fallthrough=0

項目 | 内容
--- | ---
除外カテゴリ | B. 抑制指定
概要 | -Wimplicit-fallthrough による switch フォールスルー検出を無効化

=0 は警告の抑制指定であり、基本方針に違反します。

-Wimplicit-fallthrough は gcc7 以降で -Wextra に含まれており、
推奨セットではこれをそのまま有効にしています。
意図的なフォールスルーには `__attribute__((fallthrough))` または
コメントアノテーションで明示してください。

# 9 -Winit-self

項目 | 内容
--- | ---
除外カテゴリ | A. 既に有効
概要 | 変数が自分自身で初期化されている場合に警告 (`int i = i;`)

-Winit-self は -Wall に含まれています。
推奨セットで -Wall を指定しているため、明示的に追加する必要はありません。

# 10 -Winline

項目 | 内容
--- | ---
除外カテゴリ | D. 最適化情報
概要 | inline 宣言された関数がインライン展開できない場合に警告

コンパイラの最適化判断に関するフィードバックであり、
コードの正しさやバグの検出とは無関係です。
inline 展開の可否はコンパイラバージョンや最適化レベルに依存するため、
gcc8 と gcc14 で異なる結果が出る可能性が高く、
品質ゲートとして安定しません。

# 11 -Wint-to-pointer-cast

項目 | 内容
--- | ---
除外カテゴリ | A. 既に有効
概要 | 整数からポインタへのキャストでサイズが異なる場合に警告 (C 専用)

GCC ではデフォルトで有効であり、-Wall の有無にかかわらず警告が出力されます。
推奨セットに明示的に追加する必要はありません。

# 12 -Winvalid-pch

項目 | 内容
--- | ---
除外カテゴリ | C. スタイル制約
概要 | プリコンパイル済みヘッダーが使用できない場合に警告

ビルドインフラの構成管理に関する警告であり、
コードの品質やバグの検出とは無関係です。
プリコンパイル済みヘッダーの管理はビルドシステム側で対応すべき問題であり、
コード品質ゲートの範囲外です。

# 13 -Wmissing-format-attribute

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | format 属性を付与できる関数に属性がない場合に警告

printf/scanf 系のラッパー関数に `__attribute__((format(...)))` の
付与を促す警告です。属性の付与は良い習慣ですが、属性が欠けていること自体は
バグではありません。推奨セットの -Wformat=2 によって、format 属性が付与された
関数の呼び出し側での不整合は既に厳密に検出されています。

# 14 -Wmissing-noreturn

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | noreturn 属性を付与できる関数に属性がない場合に警告

`__attribute__((noreturn))` の付与を促す警告です。
属性の欠落はコンパイラの最適化機会の損失にはなりますが、バグではありません。
exit() や abort() を呼ぶユーティリティ関数すべてに警告が出るため、
ノイズが多くなります。

# 15 -Wnested-externs

項目 | 内容
--- | ---
除外カテゴリ | C. スタイル制約
概要 | 関数内部での extern 宣言に警告 (C 専用)

関数ブロック内の extern 宣言は合法な C コードであり、
バグに直結するものではありません。可読性やメンテナンス性の問題であり、
コードレビューで対応すべき範囲です。

# 16 -Wpointer-to-int-cast

項目 | 内容
--- | ---
除外カテゴリ | A. 既に有効
概要 | ポインタから整数へのキャストでサイズが異なる場合に警告 (C 専用)

GCC ではデフォルトで有効であり、-Wall の有無にかかわらず警告が出力されます。
推奨セットに明示的に追加する必要はありません。

# 17 -Wredundant-decls

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | 同一スコープ内での冗長な再宣言に警告

ヘッダーファイルの防御的インクルード設計 (複数のヘッダーが同じ宣言を
含む場合) で正当に発生します。ライブラリの公開ヘッダーと内部ヘッダーの
両方に宣言を持つ一般的なパターンでも警告されるため、
品質ゲートとして運用すると抑制が必要になる場面が多くなります。

# 18 -Wsequence-point

項目 | 内容
--- | ---
除外カテゴリ | A. 既に有効
概要 | シーケンスポイント違反 (未定義動作) を検出

-Wsequence-point は -Wall に含まれています。
推奨セットで -Wall を指定しているため、明示的に追加する必要はありません。

# 19 -Wstrict-aliasing=2

項目 | 内容
--- | ---
除外カテゴリ | E. 高ノイズ
概要 | strict aliasing ルール違反の検出 (レベル 2)

-Wall は -Wstrict-aliasing をレベル 3 (最も保守的) で有効にしています。
レベル 2 はより積極的に検出しますが、誤検出 (false positive) も増加します。

レベル 2 の誤検出を抑制するために -Wno-strict-aliasing を追加するのは
基本方針に反します。-Wall によるレベル 3 の検出で十分であり、
真に危険なエイリアシング違反はコードレビューや静的解析ツールで対応する方が
実用的です。

# 20 -Wunsafe-loop-optimizations

項目 | 内容
--- | ---
除外カテゴリ | F. 環境非対応
概要 | ループ最適化が安全でない可能性がある場合に警告

この警告オプションは GCC 8 で削除されています。
対象環境の下限が gcc8 (EL8) であるため、そもそも利用できません。

仮に利用可能であったとしても、最適化器の内部判断に関するフィードバックであり、
コードの正しさとは無関係 (カテゴリ D) に該当します。

# 21 -Wvariadic-macros

項目 | 内容
--- | ---
除外カテゴリ | C. スタイル制約
概要 | 可変引数マクロの使用に警告

可変引数マクロは C99 で標準化された機能であり、
対象環境 (gcc8: gnu11、gcc14: gnu17) では言語仕様として正当です。
デバッグマクロやログマクロで広く使用されるパターンであり、
これを禁止する合理的な理由はありません。

-Wdeclaration-after-statement と同様に、C99 以降の正当な機能に対する
制約はモダナイゼーションの方向性と相反します。