为什么 clang-tidy 说 vsnprintf 有一个未初始化的 va_list 参数?

Why does clang-tidy say vsnprintf has an uninitialized va_list argument?

在下面的函数中,我初始化 args,在对 va_start 的调用中使用它们,然后调用 va_end

代码在我看来是正确的,但 clang-tidy 给出了警告:

tmp2.c:7:11: error: Function 'vsnprintf' is called with an uninitialized va_list argument [clang-analyzer-valist.Uninitialized,-warnings-as-errors] len = vsnprintf((void*)0, 0, format, args);

#include<stdarg.h>
#include<stdio.h>
int f(char *format, ...) {
    int len;
    va_list args;
    va_start(args, format);
    len = vsnprintf((void*)0, 0, format, args);
    va_end(args);
    return len;
}

更奇怪的是,这只会在我一次检查多个文件时发生,所以 clang-tidy tmp2.c 不会给出警告,但 clang-tidy tmp2.c tmp2.c 会!

这是我的代码问题还是 clang-tidy 问题?我使用的是 LLVM 版本 7.0.0,但警告也出现在 8.0.0.

这是 clang-tidy 中的错误。它与您显然已经看到的 this bug 最相似。

此外,从音符 ,您不必将 0 转换为 (void *)。转换已经是隐式的。