CERT.STRUCT.FLEXIBLE_ARRAY_MEMBER
フレキシブル配列メンバーの宣言には正しい構文を使用してください。
このチェッカーは、フレキシブル配列のように振る舞うメンバーが単一要素配列として宣言されているインスタンスを特定します。
脆弱性とリスク
フレキシブル配列メンバーの宣言時に正しい構文を使用しない場合、(構文は不正確でもほとんどの実装で機能しますが) 定義されていない動作が発生する可能性があります。
軽減と防止
フレキシブル配列メンバーを動的サイズとして宣言します。
例
struct flexArrayStruct { int num; int data[1]; }; void func(size_t array_size) { /* 構造体にスペースが割り当てられます */ struct flexArrayStruct *structP = (struct flexArrayStruct *) malloc(sizeof(struct flexArrayStruct) + sizeof(int) * (array_size - 1)); if (structP == NULL) { /* malloc の失敗を処理します */ } structP->num = array_size; /* * data[array_size] として割り当てられたかのように * data[] にアクセスします。 */ for (size_t i = 0; i < array_size; ++i) { structP->data[i] = 1; } }
この非準拠コード例は、最終メンバーとして単一要素配列を持ち、フレキシブル配列のように振る舞うメンバーの割り当てを試みます。構造がインスタンス化されると、malloc() に対して計算されたサイズが、動的配列の実際のサイズを考慮して変更されます。