【发布时间】:2021-11-11 21:31:47
【问题描述】:
我在运行 clion 项目 stepik 文件时遇到问题。以下错误不断出现。我有一个编译器,我可以运行其他代码,但有些代码不起作用。
In file included from /home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-all.cc:42:
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc: In function ‘bool testing::internal::StackGrowsDown()’:
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1224:24: error: ‘dummy’ may be used uninitialized [-Werror=maybe-uninitialized]
1224 | StackLowerThanAddress(&dummy, &result);
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1214:13: note: by argument 1 of type ‘const void*’ to ‘void testing::internal::StackLowerThanAddress(const void*, bool*)’ declared here
1214 | static void StackLowerThanAddress(const void* ptr, bool* result) {
| ^~~~~~~~~~~~~~~~~~~~~
/home/gergoszabo/CLionProjects/Prog2_08/test-framework/googletest-src/googletest/src/gtest-death-test.cc:1222:7: note: ‘dummy’ declared here
1222 | int dummy;
| ^~~~~
cc1plus: all warnings being treated as errors
gmake[3]: *** [../test-framework/googletest-build/googlemock/gtest/CMakeFiles/gtest.dir/build.make:72: ../test-framework/googletest-build/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:587: ../test-framework/googletest-build/googlemock/gtest/CMakeFiles/gtest.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:1394: lesson1/labbeli/CMakeFiles/global-lesson1-labbeli-test.dir/rule] Error 2
gmake: *** [Makefile:598: global-lesson1-labbeli-test] Error 2
【问题讨论】:
-
那么,真正的问题是什么?您有一个名为
dummy的变量,当它的地址传递给StackLowerThanAddress()时,该变量未初始化。编译器不知道StackLowerThanAddress()将如何处理dummy,因此它只是警告您关于一个潜在 问题,如果StackLowerThanAddress()要尝试读取dummy的值。但是,您将编译器设置为将所有警告 视为错误,即使这可能不是致命的情况。如果您不希望警告发生,则要么初始化dummy,要么使用编译器#pragma禁用警告 -
这就像一个测试文件,我无权访问,但它在其他计算机上工作,一定是我的IDE有问题。
-
当参数为
void*时,这似乎不会发生。编译器可能很聪明,并且意识到如果没有一些不诚实的恶作剧就无法更改参数,因此可能会被读取。 -
@Tsyvarev,“不,编译器不会针对使用未知的变量发出此类警告。” - 这是不正确的:gcc.godbolt.org/z/f4Yhr8P4T。请特别注意,警告使用语言 may,就像可能一样,表示在发出此警告之前不需要确定。
-
@chris:嗯,看起来真实的行为在某种程度上更复杂。根据测试,编译器在两种不同的情况下发出警告: 1. 编译器确实没有看到被调用函数的定义 并且参数的类型是完全正确
const void*(void*和const int*都不会发出警告)。 2. 编译器看到被调用函数的定义并且该定义取消了对参数的引用。在给定的问题中,肯定是第二种情况,因为警告消息指向函数的定义。