未初始化的值在Linux上的行为与预期不同,但不是Windows

时间:2012-06-08 14:26:22

标签: c++ visual-studio-2010 g++

为什么未初始化的“max”和“min”值适用于Linux而不适用于Windows?例如:

double max, min, test;
while (1)
{
  std::cin >> test;
  if (test > max)
    max = test;

  if (test < min)
    min = test;
}

这适用于Linux。我知道一个事实,因为我一直在使用这个(虽然我直到现在还没有意识到这是多么可怕)至少3个月了。但是,许多同事告诉我,他们的机器上已经坏了:他们使用Visual Studio进行编译。他们的陈述是否有效,为什么?这仅仅是UB的情况吗?如果是这样,过去几个月没有我注意到它是如何运作的?

另请注意:gcc(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2和Visual Studio 2010

4 个答案:

答案 0 :(得分:8)

这“无效”。

所有这一切都是调用未定义的行为“似乎做我所期望的”只是 UB 实现自身的一种方式。不过,这是一个相当不幸的事情,因为它让你相信你的代码很好,直到有一天它会爆炸到你客户的脸上。

答案 1 :(得分:6)

因为未定义的未定义行为。它可能有用,或者它可能不起作用,你只是不知道。显然,在您的Linux环境中,它可以工作。

答案 2 :(得分:3)

使用未初始化变量的值是未定义的行为,因此任何事情都可能发生。 任何,这意味着代码似乎可以正常工作,它可能会崩溃,或者它可能会让恶魔飞出你的鼻子。

答案 3 :(得分:3)

粗略地说,如果未初始化的变量minmax碰巧保留了test中遇到的实际最小值和最大值之间的值,那么您的代码似乎会有用。 。未初始化的自动变量的对象表示可能是也可能不一致,具体取决于编译器,选项和程序其余部分中的代码。读取未初始化的值肯定是UB。 UB可能是也可能不一致。

例如,您可以通过以下方式获得您观察到的行为的一种简单方法:

  • 您的测试集包括正值和负值,
  • gcc / linux始终在未初始化的变量中放置一个全位零表示,
  • VS始终将NaN放入未初始化的变量中(因此test < mintest > max都是假的。)

根据您的测试数据以及“在其机器上损坏”的含义,细节可能会有所不同。我刚刚在UB的无限范围内描述了一种可能性。