c++ _vsnprintf意外格式字符串



我有一个日志记录函数,它接受可变数量的参数,并使用_vsnprintf对它们进行格式化。我的问题是,当我调试OCR自动化时,它返回的字符串被发送到日志,所以如果文件说这样的话:

这个位图表示%n

那么它会像这样被发送到我的日志记录函数:

void log(LPCSTR msg, ...)
{
    char log[MAX_ALLOWED];    
    int length = sizeof(log) / sizeof(log[0]);
    va_list argptr;
    va_start( argptr, pzMsg );
    // our msg accidentally has a %
    if ( strchr(msg, '%') ) { 
        // debug assertion - no parameters were passed
        _vsnprintf( log, length, msg, argptr );
    }
    log[length-1] = (char)0;
    va_end( arg_ptr );
}

是否有一种方法,以及检查'%',我可以检查是否没有参数?谢谢你。

确保某些内容不能通过printf展开的传统方法是

log("%s", yourString);

当然,您也可以添加一个只接受一个参数的log的变体,或者您可以计算变量参数的数量,如果没有,则不格式化字符串。

如果我理解正确,您应该检查实际传递给log()的参数的数量。

不幸的是,这是高度特定于机器的。我知道只有一种架构提供了明确的参数计数。这就是VAX。所有其他的都依赖于调用者和被调用者来"把它做好"。

最新更新