SV.FMT_STR.UNKWN_FORMAT.SCAN

扫描函数调用中存在未知格式说明符

在扫描函数调用的格式字符串中,允许使用一系列以 % 开头的格式说明符。最常用的说明符是 d、i、o、u、x、X、f、g、G、c、s(空格)、lf 和 Lf。如果格式字符串中包含无效的格式说明符,则 SV.FMT_STR.UNKNOWN_FORMAT.SCAN 检查器会标记此代码。

漏洞与风险

当转换规范的语法不正确时,会产生未定义的行为,从而可能导致非预期的输出。

漏洞代码示例

复制
  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 针对第 2 行报告错误,因为 %k 是无效的格式说明符。

修正代码示例

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

在经修正的代码中,已删除无效的格式说明符。