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