为什么 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 *)
。转换已经是隐式的。
在下面的函数中,我初始化 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 *)
。转换已经是隐式的。