【问题标题】:'dummy' may be used uninitialized'dummy' 可以在未初始化的情况下使用
【发布时间】: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. 编译器看到被调用函数的定义并且该定义取消了对参数的引用。在给定的问题中,肯定是第二种情况,因为警告消息指向函数的定义。

标签: c++ cmake g++ clion


【解决方案1】:

这个问题不在你自己的项目中,而是在它似乎正在使用的库中:GoogleTest。

您当前使用的 GoogleTest 版本在使用 GCC 11 编译时出现问题。GCC 发出此警告(出于各种复杂原因)。 GoogleTest 已配置编译器给出的任何警告都应视为错误。因此 GCC 会在遇到该警告时停止编译。

这不是您的错误,而是由 GoogleTest 来解决。已在此处进行修复并合并:https://github.com/google/googletest/pull/3024

更新 GoogleTest 以使用 1.11.0 或更高版本应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多