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() に対して計算されたサイズが、動的配列の実際のサイズを考慮して変更されます。