【问题标题】:Why does clang-tidy say vsnprintf has an uninitialized va_list argument?为什么 clang-tidy 说 vsnprintf 有一个未初始化的 va_list 参数?
【发布时间】:2020-02-28 13:28:19
【问题描述】:

在下面的函数中,我初始化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;
}

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

这是我的代码或 clang-tidy 的问题吗?我使用的是 LLVM 版本 7.0.0,但警告也会出现在 8.0.0 中。

【问题讨论】:

  • 这是一个整洁的错误。不知道它是什么号码,但我可以稍后查找。
  • (void *) 演员表不需要,而且会适得其反。
  • @JoshuaNelson, JL2210:这应该是一个答案,不是吗?
  • 如果 JL 想让它成为答案,我会将其标记为已接受 :)

标签: c variadic-functions clang-tidy


【解决方案1】:

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

此外,从注释in the comments,您不必将0 转换为(void *)。演员表已经是隐式的了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多