C 格式化字符串需要的参数个数与实际传入的参数个数应一致
10.6.6 ID_inconsistentFormatArgNum
如果参数的数量小于 C 格式化占位符的数量,会导致标准未定义的行为,反之多余的参数会失去意义,往往意味着逻辑错误。
示例:
void log(int type, const char* msg) {
printf("[%d]: %s\n", type); // Non-compliant, undefined behavior
}
例中格式化字符串需要两个参数,但只传入了一个,可能会打印出错误的信息,也可能会使程序异常终止。
由于可变参数列表自身的局限,很难在编译时发现这种问题,有些编译器会检查 printf、sprintf 等标准函数,但无法检查自定义函数,建议在 C++ 代码中禁用可变参数列表和 C 风格的格式化函数。
相关
依据
ISO/IEC 9899:1999 7.19.6.1(2)-undefined
ISO/IEC 9899:2011 7.21.6.1(2)-undefined