C 格式化字符串需要的参数个数与实际传入的参数个数应一致
10.6.6 ID_inconsistentFormatArgNum
如果 C 格式化占位符的数量大于参数的数量,会导致标准未定义的行为,反之多余的参数会失去意义,往往意味着逻辑错误。
示例:
void foo(int type, const char* msg) {
printf("Error (type %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