为什么一台计算机上的Google测试通过但另一台计算机失败?

时间:2017-03-06 18:44:51

标签: c++ c initialization googletest

我们使用GoogleTest在Eclipse中测试我们的代码,但我有一个测试,它通过一台机器而在另一台机器上失败,因为指针取消引用,我不确定它为什么运行不同。最近,jr dev将测试添加到测试文件的末尾,以验证一个小的更改。该测试包括一个错误,但在他们的机器中以某种方式通过了:

TEST(TEST_SUITE, TEST_NAME)
{
    uint8* response_data;
    uint16 response_length = 1;
    response_data[0] = 0x54;
    //more code and actual validation
}

尝试写入空指针会导致我的应用程序失败,但是在他们的机器中,数据已经定义并因此能够通过。我在测试的第一行设置了断点,看看这就是我得到的:

我的机器 - 空指针: Failing Test at first line in test

他们的机器定义指针(和长度): Passing Test at first line in test

不知何故,虽然调用堆栈是相同的,虽然测试以相同的顺序运行,但在一台机器中,变量以某种方式携带一些其他值。

在具有相同代码库的两台不同机器上,这会有不同的原因吗?测试中定义的变量的范围是否有限?

2 个答案:

答案 0 :(得分:3)

正如UnholySheep在评论中提到的那样,responseData未被初始化,而你的同事正在使用它。

正如维基百科指出的那样,C ++标准没有规定在这种情况下会发生什么(这称为undefined behaviour)。这意味着它可以与他们合作,而不是与你合作。因此,如果您使用的编译器与它们不同(或者即使您设置了不同的编译标志,如优化级别,或者您是否使用调试),您可能得不到相同的结果。

为了更深入地解释您的具体情况,使用它们,似乎指针未设置为任何内容(responseData具有垃圾值),而对于您,responseData设置为nullptr。 / p>

答案 1 :(得分:3)

写入未初始化的指针是未定义的行为。这意味着发生的事情完全取决于争夺。它可能是段错误或更糟,会覆盖一些内存。

它的作用取决于当时机器的状态。这就是为什么你在不同的机器上得到不同的行为。