缺少与转换说明符 'number' 对应的 'function-name' 的整数参数
注解
此警告指示代码没有提供足够的参数来匹配格式字符串,缺失的参数中有一个是整数。
为格式函数提供的参数太少会导致未定义的行为,因为该函数尝试读取未传递的值。 可能的后果包括不正确的输出、崩溃,甚至安全漏洞,例如信息泄漏。
为了确保稳定性和安全性,请始终将参数的数量和类型与字符串中的格式说明符匹配。
代码分析名称:MISSING_INTEGER_ARGUMENT_TO_FORMAT_FUNCTION
示例
以下代码在启用代码分析时生成此警告(项目属性 >配置属性> **代码分析 ** >常规>在生成时启用代码分析),因为它在调用 sprintf_s 中使用了不正确的参数数,并且缺少的参数是整数。 如果使用不安全函数 sprintf 而不是更安全的变体 sprintf_s,则此代码可能会导致堆栈溢出,而不仅仅是意外的输出:
void f()
{
char buff[8];
const char *string="Hello";
sprintf_s(buff, sizeof(buff), "%s %d", string); // Attempts to print "Hello "
// followed by a number up to eleven characters long, depending on the garbage
// found on the stack. Any number other than a single non-negative digit can't
// fit in the 8 char buffer and leave room for the trailing null. If sprintf
// had been used instead, it would overflow.
}
若要更正此警告,请指定缺少的参数或调整格式字符串。 在此示例中,我们将添加缺失的整数值。
void f()
{
char buff[8];
const char *string = "Hello";
sprintf_s(buff, sizeof(buff), "%s %d", string, strlen(string));
}