为什么 Google 测试在一台机器上通过而在另一台机器上失败?

Why would a Google Test pass in one machine yet fail in another?

我们使用 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
}

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

我的机器 - 空指针:

他们的机器 - 定义指针(和长度):

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

为什么这会在具有相同代码库的两台不同机器上表现不同?测试中定义的变量没有范围限制吗?

正如评论中提到的 UnholySheep,responseData 未初始化,您的同事正在使用它。

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

为了更深入地解释你的具体情况,与他们一起,指针似乎没有设置为任何东西(responseData 有一个垃圾值),而与你一起,responseData 被设置为 nullptr .

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

它做什么取决于当时机器的状态。这就是为什么你在不同的机器上会有不同的行为。