警告 C6064

缺少与转换说明符 '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));
}

另请参阅

sprintf_s、、_sprintf_s_lswprintf_s、、_swprintf_s_l
C4473