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

时间:2019-01-06 03:39:19

标签: c++ variables undefined-behavior

此代码是未定义行为吗?

具体是这个吗? “ 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))
    {

    }
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

此未初始化的变量用法是否为未定义的行为

是的

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

  

此代码是未定义行为吗?

是的

  

具体是这个吗? “而(事物* x = getNext(x))”

是的,特别是有UB。

  

由于标准中的规则,将x初始化为零

不。在这种情况下,没有这样的规则可以说x初始化为零。

  

是幸运的还是编译器仍在这样做但不应依赖它?

该行为是不确定的。如果是程序的行为使您得出结论:它可能是未定义的,则您可以认为自己很幸运。您可以通过启用编译器警告来改善运气:

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

答案 2 :(得分:0)

  

此代码是未定义的行为吗?

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

使用-Wall -Wextra选项编译程序,您会发现编译器发出以下警告消息:

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