我正在使用 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 像素高。”后正常终止。
发布版本因分段错误而崩溃。
我对这种行为的解释——但我可能错了,如果是,请纠正我——是我错误地指定了一个函数参数,而不是最后一个非可变参数va_start
,唯一可接受的形式是这里va_start(args, requiredArgument)
而不是va_start(args, format)
我想拥有。换句话说,我va_start
以一种使整个程序流程不可预测的方式误用,因此这里的分段错误没什么大不了的。
如果我的假设是正确的,我现在有两个问题:
va_start
如果选择其他任何东西显然是非法的,为什么还要指定最后一个正式声明的函数参数?为什么挑剔的 VC++ 编译器不会对如此容易检测和潜在的严重陷阱发出警告?