我们使用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
}
尝试写入空指针会导致我的应用程序失败,但是在他们的机器中,数据已经定义并因此能够通过。我在测试的第一行设置了断点,看看这就是我得到的:
不知何故,虽然调用堆栈是相同的,虽然测试以相同的顺序运行,但在一台机器中,变量以某种方式携带一些其他值。
在具有相同代码库的两台不同机器上,这会有不同的原因吗?测试中定义的变量的范围是否有限?
答案 0 :(得分:3)
正如UnholySheep在评论中提到的那样,responseData
未被初始化,而你的同事正在使用它。
正如维基百科指出的那样,C ++标准没有规定在这种情况下会发生什么(这称为undefined behaviour)。这意味着它可以与他们合作,而不是与你合作。因此,如果您使用的编译器与它们不同(或者即使您设置了不同的编译标志,如优化级别,或者您是否使用调试),您可能得不到相同的结果。
为了更深入地解释您的具体情况,使用它们,似乎指针未设置为任何内容(responseData
具有垃圾值),而对于您,responseData
设置为nullptr。 / p>
答案 1 :(得分:3)
写入未初始化的指针是未定义的行为。这意味着发生的事情完全取决于争夺。它可能是段错误或更糟,会覆盖一些内存。
它的作用取决于当时机器的状态。这就是为什么你在不同的机器上得到不同的行为。