CERT.EXPR.TEMP_OBJ.MOD

一時的な存続期間を持つオブジェクトを変更しない

CERT.EXPR.TEMP_OBJ.MOD チェッカーは、C99 以降において、一時的な存続期間を持つオブジェクトへの変更を検出します。関数が配列を含む構造体や共用体を返し、その戻り値が名前付き変数に格納されない場合、添字演算子を使用してその配列要素を修正すると未定義の動作を引き起こします。

このチェッカーは、モダンエンジンにのみ適用されます。

脆弱性とリスク

一時オブジェクトは、たとえそのオブジェクト自体が安定した存続期間を持たないにもかかわらず、書き込み可能に見えるメンバーや配列要素を公開することがあります。これらの式を用いて記述すると、未定義の動作や信頼性の低いプログラム結果が生じる可能性があります。

軽減と防止

メンバーや要素を変更する前に、返された値を名前付きオブジェクトに代入してください。一時オブジェクトに基づく配列からポインターへの変換やメンバーアクセス式へのポインターの格納、あるいはそれらへの書き込みは避けてください。

脆弱コード例

コピー
struct S1 {
    int array[10];
};

struct S1 getS1(void);

void update_element(int value)
{
    getS1().array[3] = value;
}

この非準拠の例では、コードは一時構造体の値の配列要素に書き込みを行っています。getS1() によって返される構造体は一時的な存続期間を持つため、この書き込みは未定義の動作を引き起こす可能性があります。

修正コード例

コピー
struct S1 {
    int array[10];
};

struct S1 getS1(void);

void update_element(int value)
{
    struct S1 result = getS1();
    result.array[3] = value;
}

準拠ソリューションでは、配列要素を変更する前に、返された値を名前付きオブジェクトに格納します。

外部参考資料