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);
  }

修正されたコードでは、無効な書式指定子は削除されました。