gcc 警告オプション運用ガイド

1 目的

本ガイドは、gcc の警告を品質ゲートとして活用し、
EL8 (gcc8) と EL10 (gcc14) の両環境でビルドを破綻させずに
ロバストな C / C++ プログラミングを行うことを目的としています。

特に以下を重視しています。

  • 移植時に顕在化しやすい未定義動作や API 設計ミスの早期検出
  • コンパイラ世代差 (gcc8 ↔︎ gcc14) による警告増減への耐性
  • メモリレイアウトをそのままファイル I/O に用いる要件への対応
    (暗黙パディング検出は必須です)

2 基本方針

  • -Wall -Wextra を基礎とし、バグに直結しやすい警告のみを厳選して追加します
  • C と C++ で意味の異なる警告は必ず分離します
  • 警告を抑制するための指定 (=0, -Wno-*) は原則使いません
  • gcc14 で warning → error に昇格した項目に依存しないコードを書きます

3 推奨警告セット

3.1 Base 警告 (言語共通)

-Wall -Wextra
-Wformat=2
-Wshadow
-Wundef
-Wpointer-arith
-Wcast-qual
-Wcast-align
-Wswitch-enum
-Wswitch-default
-Wpacked
-Wpadded
-Wunknown-pragmas

3.2 C 専用警告

-Wmissing-prototypes
-Wstrict-prototypes
-Wmissing-declarations

3.3 makefile 例

WARN_BASE = \
    -Wall -Wextra \
    -Wformat=2 \
    -Wshadow -Wundef \
    -Wpointer-arith -Wcast-qual -Wcast-align \
    -Wswitch-enum -Wswitch-default \
    -Wpacked -Wpadded \
    -Wunknown-pragmas

WARN_C_ONLY = \
    -Wmissing-prototypes \
    -Wstrict-prototypes \
    -Wmissing-declarations

CFLAGS   += $(WARN_BASE) $(WARN_C_ONLY)
CXXFLAGS += $(WARN_BASE)

4 構造体レイアウト固定 (I/O) に関する指針

  • ファイル I/O 用構造体は用途専用に分離します
  • フィールドは固定幅整数型のみを使用します
  • sizeof と offsetof を static_assert で固定化します
  • packed 構造体は memcpy 専用とし、直接アクセスを避けます

5 付録 A: 各警告の概要

  • -Wall
    一般的に有用とされる基本警告群です。

  • -Wextra
    -Wall に含まれない追加警告です。

  • -Wformat=2
    printf 系フォーマット不整合を厳密に検出します。

  • -Wshadow
    変数の意図しない隠蔽を検出します。

  • -Wundef
    未定義マクロ使用を検出します。

  • -Wpointer-arith
    非標準なポインタ演算を検出します。

  • -Wcast-qual
    const / volatile 除去キャストを検出します。

  • -Wcast-align
    アラインメント破壊の可能性を検出します。

  • -Wswitch-enum
    enum の未処理列挙子を検出します。

  • -Wswitch-default
    default 節の無い switch を検出します。

  • -Wpacked
    packed 指定による危険なレイアウトを検出します。

  • -Wpadded
    暗黙パディングの発生を検出します。

  • -Wunknown-pragmas
    未対応 pragma を検出します。

  • -Wmissing-prototypes (C)
    非 static 関数の未宣言を検出します。

  • -Wstrict-prototypes (C)
    古い関数宣言形式を検出します。

  • -Wmissing-declarations (C)
    ヘッダ未宣言のグローバル関数を検出します。