注目★★★★★Lobsters
GCC と Clang が C++ 標準に非準拠、言語リンケージ情報を型に保持していない問題
30秒で把握
- 1GCC・Clang が C++ 標準の言語リンケージ情報を型に保持せず、異なるリンケージの関数を同一型として扱う
- 2extern "C" と通常の関数型の区別が失われ、is_same 検査や関数オーバーロード時の ODR 判定が非準拠動作に
- 3標準を実装依存化すべきと著者主張・ほぼ全プラットフォームで C/C++ 呼び出し規約が同一のため ABI 互換性で対応困難
要約
C++ 標準では関数型に言語リンケージ (C++、C、その他) が関連付けられ、異なる言語リンケージを持つ 2 つの関数型は同一であっても区別すべきだと明記している。だが GCC と Clang はこの情報を型に保存していないため、言語リンケージの異なる関数が同一型として扱われる。その結果 `std::is_same<extern "C" void(), void()>` が真を返す (本来は偽) など、標準非準拠の動作が生じる。関数ポインタ パラメータのオーバーロード時にも問題が顕在化し、本来コンパイルすべきコードが ODR 違反として拒否される。著者は標準側の定義に問題があり、実装依存化すべきだと主張している。
あなたへの影響
国内の C++ プロダクション開発チームが言語リンケージを活用している場合、GCC/Clang における動作の非準拠性を認識しておく必要がある。
推奨:ただし実務上は C と C++ の呼び出し規約が実質同一なプラットフォームが主流であるため、即座の対応不要だが、クロスプラットフォーム互換性を重視する場合は標準に厳密に従った型チェック手段の検証が有用。