SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY

扫描函数调用中的参数过多

在扫描函数调用的格式字符串中,参数数量应与格式规范中的参数数量相同。如果代码中提供给扫描函数的参数数量多于格式字符串中指定的参数数量,则 SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY 检查器会标记此代码。

漏洞与风险

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

漏洞代码示例

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

Klocwork 针对第 2 行报告错误。由于在格式字符串中,规范的数量和对应的参数数量应该相同,因此函数仅预期有一个用于 %o 规范的参数,但是这一行中接收到两个参数。未标记第 3 行,因为格式字符串拥有一个规范和一个对应的参数。

修正代码示例

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

在经修正的代码中,第 2 行有一个规范,并在格式字符串中有一个对应的参数。