EN JP CN

SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY

SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY

scan 関数呼び出しの引数が多すぎます

scan 関数呼び出しの書式文字列には、書式指定にあるのと同じ数のパラメーターがあるはずです。SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY チェッカーは、scan 関数にあるパラメーターが書式文字列に指定された数より多い場合、コードにフラグを立てます。

脆弱性とリスク

変換指定の構文が不正確な場合は、動作が未定義となり、予期しない出力を生じる場合があります。

脆弱コード例

1   void foo(FILE* f, char* pc, int i, char c) {
2       fscanf(f, "%o", &i, pc);     // too many parameters
3       fscanf(f, "%4s", pc);
4   }

Klocwork は 2 行目でエラーを報告します。書式文字列の指定と対応パラメーターの数は同じでなければならないため、関数は、%o 指定用にパラメーターを 1 つのみ期待し、2 つ受け取ります。3 行目にはフラグがありません。 これは、書式文字列指定と対応パラメーターがそれぞれ 1 つあるためです。

修正コード例

1   void foo(FILE* f, char* pc, int i, char c) {
2       fscanf(f, "%o", &i);
3       fscanf(f, "%4s", pc);
4   }

修正されたコードでは、2 行目は書式文字列に指定と対応パラメーターがそれぞれ 1 つあります。