【发布时间】:2013-02-03 15:26:01
【问题描述】:
我正在使用 Visual Studio 2012 编译此示例代码:
#include <stdarg.h>
#include <stdio.h>
const char * __cdecl foo(const char * format, const char * requiredArgument, ...)
{
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
return requiredArgument;
}
int main(int, char **)
{
foo("The %s is %d pixels wide and %d pixels high.", "box", 300, 200);
return 0;
}
程序的调试构建在打印消息“框宽 300 像素,高 200 像素。”后正常终止。
发布版本因分段错误而崩溃。
我对这种行为的解释 - 但我可能错了,如果是,请纠正我 - 是我错误地指定了一个函数参数,而不是 @ 中的最后一个非可变参数987654322@,这里唯一可接受的形式是va_start(args, requiredArgument),而不是我想要的va_start(args, format)。
换句话说,我误用了va_start,导致整个程序流程变得不可预测,所以这里的分段错误没什么问题。
如果我的假设是正确的,我现在有两个问题:
如果选择其他显然是非法的,为什么还要在
va_start中指定最后正式声明的函数参数?为什么挑剔的 VC++ 编译器不针对如此容易检测和潜在的严重缺陷发出警告?
【问题讨论】:
-
Linux/Debian/x86-64 上的 GCC 4.7 编译器在使用
gcc -Wall -g fti.c -o fti调用时会正确警告:fti.c:7:5: warning: second parameter of 'va_start' not last named argument [enabled by default]
标签: c undefined-behavior variadic-functions