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