Clang-Tidy:根据未初始化的非局部变量、C 指针引用,使用非常量表达式初始化非局部变量

标签 c clang-tidy

我们有一段非常简单的代码,它会发出警告,但看起来应该没问题,并且运行良好。我们知道通常编译单元之间的初始化顺序可能存在问题,但在这种情况下我们使用指针进行初始化,因此不理解顺序如何导致问题,或者这段代码可能会出现什么问题。请注意,在实际代码中,我们有更复杂的结构场景,但下面的代码显示了基本问题。

编辑:删除了 const 限定符,因为它们不影响警告

文件1.c

int foo=42;

文件2.c

#include <stdio.h>

extern int foo;
// Clang-Tidy: Initializing non-local variable with non-const expression depending on uninitialized non-local variable 'foo'
int *bar=&foo;

int main() {
  printf("%d\n", *bar); // prints '42'
}

警告不是来自 gcc,而是来自 clang-tidy。重现运行:

clang-tidy -checks=* file1.c file2.c

最佳答案

clang-tidy 警告一些不是问题的事情:foo 是否初始化在这个初始化器中没有区别,只有它的地址是拍摄。

此外,foo 是一个全局变量,因此它要么在定义它的模块中静态初始化,要么没有初始化器,在运行时由加载程序初始化为 0。如果程序被编译为 C++,foo 可能会在运行时初始化,在 main 被调用之前,可能是通过运行初始化代码,但这同样没有区别,因为它的地址用于 int *bar = &foo;

Cameron Tacklind 所述,您应该禁用此警告。

关于Clang-Tidy:根据未初始化的非局部变量、C 指针引用,使用非常量表达式初始化非局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68175261/

相关文章:

c - 将 C for 循环转换为 Pascal

c - 如何修复 c 中对 '_imp_curl_easy_setopt' 的 undefined reference ?

c - C语言中如何遍历二维数组对角线?

c++ - "used after it was moved [bugprone-use-after-move]"警告是这里的真正问题吗?

clang-tidy - 如何在 `clang-apply-replacements` 生成的变更集上运行 `clang-tidy --export-fixes`?

c - 读取程序的输出,将其保存为字符串,然后在原始程序中使用该字符串

c - 如何调试这个基本的 OR 程序?

C++ 在外部库中使用 clang-tidy

c - "Use of a signed integer operand with a binary bitwise operator"- 使用 unsigned short 时

c++ - 警告 : zero as null pointer constant while comparing iterators