CERT.EXPR.PASS_NON_STD_LAYOUT

実行境界を超えて標準ではないレイアウトタイプオブジェクトを渡さないでください。

脆弱性とリスク

標準のレイアウトタイプは、タイプのレイアウトが厳密に指定されているため、他のプログラミング言語で記述されたコードとやりとりするために使用できます。

非標準のレイアウトタイプは使用しないでください。言語やコンパイラのバージョンが異なると、メンバーデータが別々に配置される場合があるためです。

このチェッカーは、呼び出された関数が "C++" 以外のリンケージ指定子により "extern" と宣言されている関数呼び出しを検索します。非標準のレイアウトオブジェクトが渡されると、違反が報告されます。

軽減と防止

非標準のレイアウトオブジェクトを、他の言語で定義された関数に渡さないでください。

コピー
  struct B {
    int i, j;
  };
  
  struct D : B {
    float f;
  };
  
  extern "C" void func(void *);
  
  void foo(D *d) {
    func(d);
  }

12 行目で違反が報告されます。