【问题标题】:gcc warning about unitialized values caused by turning optimization ongcc 警告关于打开优化导致的未初始化值
【发布时间】:2021-03-10 23:06:32
【问题描述】:

考虑下面的代码

#include <iostream>

template<typename Value>
struct Wrapper {
    Value m_value;

    Wrapper() {}
    Wrapper(const Wrapper<Value> &copy_from) : m_value(copy_from.m_value) {}
};

template<typename Value>
struct DefaultContainer {
    Value m_default;

    DefaultContainer(const Value& def) : m_default(def) {}
};

template<typename Value>
struct DefaultContainerUser : public DefaultContainer<Value> {
    DefaultContainerUser() : DefaultContainer<Value>(Value()) {}
};

int main() {
    DefaultContainerUser<Wrapper<double>> user;
    std::cout << user.m_default.m_value << std::endl;
}

当我用 c++ -O1 -Werror -Wall test.cpp 编译它时,我收到以下错误:

test.cpp: In function ‘int main()’:
test.cpp:8:63: error: ‘<anonymous>.Wrapper<double>::m_value’ is used uninitialized in this function [-Werror=uninitialized]
    8 |  Wrapper(const Wrapper<Value> &copy_from) : m_value(copy_from.m_value) {}
      |                                                     ~~~~~~~~~~^~~~~~~
cc1plus: all warnings being treated as errors

如果我使用-O0 禁用优化,一切正常。添加 -Wno-error=maybe-uninitialized 优化仍然打开并没有帮助。我在这里做错了什么?

我使用的编译器是c++ (GCC) 10.2.1 20201016 (Red Hat 10.2.1-6)

【问题讨论】:

  • copy_from.m_value 在哪里初始化?
  • 啊,你是对的,将默认构造函数更改为Wrapper() : m_value() {} 可以解决问题。有时您只需要有人重新阅读错误消息给您。但是为什么我只有在开启优化的情况下才会报错呢?
  • 我猜这是 UB 的结果——它会以不可预知的方式出现。
  • 一些调试版本会将内存初始化为零,这可能会干扰未初始化的使用检测。

标签: c++ initialization compiler-optimization temporary-objects


【解决方案1】:

编译器报告的警告取决于优化级别是正常的。警告通常是优化的副产品,因为特定优化所需的分析可能会发现代码中可能存在的问题,或者在优化期间应用的转换可能会发现可能的错误。这意味着当优化关闭且未执行分析和转换时,不会检测到问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多