【问题标题】:Is this uninitialised variable usage undefined behaviour [duplicate]这是未初始化的变量使用未定义的行为吗?
【发布时间】:2019-01-06 13:01:04
【问题描述】:

这段代码是未定义的行为吗?

特别是这个? "while (Thing* x = getNext(x))" 是因为标准中的规则而将 x 初始化为零,还是只是幸运,或者编译器无论如何都在这样做,但不应该依赖?

#include <iostream>

struct Thing {

};

Thing* getNext(Thing* thing)
{
    std::cout << "thing:" << thing << "\n";
    return thing;
}

void test()
{
    while (Thing* x = getNext(x))
    {

    }
}

【问题讨论】:

    标签: c++ variables undefined-behavior


    【解决方案1】:

    该程序通过访问未初始化变量的值表现出未定义的行为。如果您观察到零被​​打印出来,那只是偶然。

    【讨论】:

      【解决方案2】:

      这是未初始化的变量使用未定义的行为

      是的。

      读取不确定值的行为未定义。此代码副本使用尚未初始化的 x 初始化参数 thing,因此具有不确定的值,因此行为未定义。

      这段代码是未定义的行为吗?

      是的。

      特别是这个? “而(事物* x = getNext(x))”

      是的,特别是这有 UB。

      x 是否因为标准中的规则而被初始化为零

      没有。没有这样的规则会说 x 在这种情况下会被初始化为零。

      还是只是运气好,还是编译器正在这样做但不应该依赖?

      行为未定义。如果是程序的行为提醒您它可能未定义的结论,那么您可以认为自己很幸运。您可以通过启用编译器警告来提高运气:

      warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
      

      【讨论】:

      • 可能要强调的是,在“这个上下文”中,x 是一个自动存储持续时间的变量。如果 x 具有静态存储持续时间(另一个上下文),它将被零初始化 - 并且 OP 错误地假设零初始化始终适用。
      • 不,不是程序的行为引起了我的注意,它被设置为零,我认为这是不正确的,或者只是运气当时在那里的记忆,因此问题
      【解决方案3】:

      这段代码是未定义的行为吗?

      是的,因为您的程序正在访问一个未初始化的变量。

      使用-Wall -Wextra 选项编译程序,你会发现编译器给出了这个警告信息:

      prg.cpp:17:31: warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized]
          while (Thing* x = getNext(x))
      

      【讨论】:

        猜你喜欢
        • 2016-01-28
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 2016-07-31
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        相关资源
        最近更新 更多