C++ 为什么谷歌测试在一台机器上通过,而在另一台机器上却失败了?

C++ 为什么谷歌测试在一台机器上通过,而在另一台机器上却失败了?,c++,c,initialization,googletest,C++,C,Initialization,Googletest,我们使用GoogleTest在Eclipse中测试我们的代码,但我有一个测试在一台机器中通过,在另一台机器中由于指针取消引用而失败,我不知道为什么它会以不同的方式运行。这个测试最近由jr开发人员添加到测试文件的末尾,以验证一个小更改。测试包括一个错误,但该错误在他们的计算机中以某种方式传递: TEST(TEST_SUITE, TEST_NAME) { uint8* response_data; uint16 response_length = 1; response_da

我们使用GoogleTest在Eclipse中测试我们的代码,但我有一个测试在一台机器中通过,在另一台机器中由于指针取消引用而失败,我不知道为什么它会以不同的方式运行。这个测试最近由jr开发人员添加到测试文件的末尾,以验证一个小更改。测试包括一个错误,但该错误在他们的计算机中以某种方式传递:

TEST(TEST_SUITE, TEST_NAME)
{
    uint8* response_data;
    uint16 response_length = 1;
    response_data[0] = 0x54;
    //more code and actual validation
}
尝试写入空指针导致我的应用程序失败,但在他们的机器中数据被定义,因此能够传递。我在测试的第一行设置断点以查看,这是我得到的结果:

我的计算机-空指针:

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

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


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

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

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


为了更深入地解释您的具体情况,对于它们,指针似乎没有设置为任何值(
responseData
有垃圾值),而对于您,
responseData
被设置为nullptr。

写入未初始化指针是未定义的行为。这意味着所发生的一切完全由人掌握。它可能会出现故障或更糟的情况,覆盖一些内存


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

uint8*response\u data-此处不初始化指针(这不是空指针,未初始化),因此
response\u data[0]=0x54导致未定义的行为。。。它行为不同的原因是因为这就是它的意思。没有定义。所以不要这样做,问题就解决了。即使它是空的,也不意味着应用程序会崩溃——它仍然是未定义的行为,这意味着编译器可以自由地执行anything@avivas这不是Java或C等等。没有运行时检查“如果为空则崩溃”。好的方面是速度,坏的方面是:预测特定的结果是行不通的。我想到了代码审查和linter/代码分析工具。同时将编译设置上的警告级别增加到最大值(并将警告视为错误)。注意:它甚至不必是不同的编译器-即使更改编译设置(例如:优化级别)也可能会导致不同的结果。在这种情况下,行为取决于tge先前存在的堆栈内存中的内容。这在不同的程序实例中可能会有所不同。@doron是的,我本来打算解释一下,但我觉得我不需要把事情过分复杂化。”…或者更糟的是“什么都不做”:-(