小编use*_*229的帖子

在 C++ 中传递 va_list 作为对函数的引用是否合法?

在代码审查/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 警告。 …

c++ pass-by-reference variadic-functions

15
推荐指数
1
解决办法
355
查看次数