SV.FMT_STR.UNKWN_FORMAT.SCAN
scan 関数呼び出しの書式指定子が不明です
scan 関数呼び出しの書式文字列は、多数の % で始まる書式指定子を受け付けます。最も広く使用されている指定子は、d、i、o、u、x、X、f、g、G、c、s、(スペース)、lf、および Lf です。SV.FMT_STR.UNKNOWN_FORMAT チェッカーは、書式文字列に無効な書式指定子がある場合、コードにフラグを立てます。
脆弱性とリスク
変換指定の構文が不正確な場合は、動作が未定義となり、予期しない出力を生じる場合があります。
脆弱コード例
コピー
void foo(FILE* f, char* pc, int i, char c) {
fscanf(f, "%c %4s %k", &c, pc, i); // unknown specifier 'k'
fscanf(f, "%o", &i);
}
Klocwork は、%k が無効な書式指定子のため、2 行目でエラーを報告します。
修正コード例
コピー
void foo(FILE* f, char* pc, int i, char c) {
fscanf(f, "%c %4s %i", &c, pc, i); // unknown specifier 'k' replaced with proper integer specifier 'i'
fscanf(f, "%o", &i);
}
修正されたコードでは、無効な書式指定子は削除されました。