CERT.FIO.RESET

fgets() または fgetws() が失敗した後は、文字列をリセットしてください。

CERT.FIO.RESET チェッカーは、fgets() または fgetws() が失敗した後、文字列が既知の値にリセットされることなく使用されていることを検出します。失敗した呼び出しにより、宛先配列が不定状態のままになる可能性があり、その後の使用によって未定義動作が引き起こされることがあります。

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

脆弱性とリスク

fgets() または fgetws() が失敗した場合、宛先配列の内容は不定となります。配列をリセットする前に使用すると、誤った結果や未定義の挙動が生じる可能性があります。

軽減と防止

fgets() または fgetws() の戻り値を確認します。呼び出しが失敗し、その文字列を後で使用する予定がある場合は、使用前にその文字列を既知の値にリセットします。

脆弱コード例

コピー
#include <stdio.h>

void use(const char* value);

void read_value(FILE* file)
{
    char buffer[1024];
    if (fgets(buffer, sizeof(buffer), file) == NULL) {
        /* Handle the error and continue. */
    }
    use(buffer);
}

呼び出しが失敗した場合、use() に引き渡される前に、buffer が不定状態のまま残る可能性があります。

修正コード例

コピー
#include <stdio.h>

void use(const char* value);

void read_value(FILE* file)
{
    char buffer[1024];
    if (fgets(buffer, sizeof(buffer), file) == NULL) {
        /* Handle the error and continue. */
        buffer[0] = '\0';
    }
    use(buffer);
}

この修正例では、呼び出しが失敗した後、buffer を使用する前にリセットしています。fgetws() の場合は、宛先を空のワイド文字列にリセットしてください。

外部参考資料