在代码审查/clang-tidy 运行时,我遇到了一个具有如下签名的函数:
void appendFoo(const char * fmt, va_list& rVaList);
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这个。Afaik,您可以va_list按值传递(也可以通过指针传递?)。
这引出了我的第一个问题:通过va_list引用传递合法吗?它是否按预期工作?
不管怎样,appendFoo()调用vsprintf()它的定义和 clang-tidy 给出了以下警告:Function 'vsprintf' is called with an uninitialized va_list argument [clang-analyzer-valist.Uninitialized]。看起来的定义appendFoo()基本上是这样的:
void appendFoo(const char * fmt, va_list& rVaList) {
// retracted: allocate buffer
vsprintf(buffer, fmt, rVaList);
// errorhandling
// de-allocate buffer
}
Run Code Online (Sandbox Code Playgroud)
(是的, 的返回值vsprintf被忽略,错误以另一种方式“处理”。我正在修复它......)
特别是,不va_copy调用va_start、 等。
删除引用va_list并按值传递,即将签名更改为void appendFoo(const char * fmt, va_list rVaList);,消除了 clang-tidy 警告。 …