c++ - Google模拟内部段错误

标签 c++ segmentation-fault googlemock

我正在尝试使用GoogleMock进行UnitTest,同时也切换为假冒。

#include <gmock/gmock.h>
#include <iostream>

using ::testing::Matcher;

class Fake {
public:
    void test(int, float) {}
};

class MockTest {
public:
    MockTest() :
        fake(new Fake()) {
    }

    MOCK_METHOD2(func, void(int, float));
    MOCK_METHOD2(func, void(char*, int));

    void delegate() {
        ON_CALL(*this, func(Matcher<int>(), 
                            Matcher<float>()))
        .WillByDefault([this](int val1, float val2) {
            fake->test(val1, val2);
        });
    }

private:
    Fake *fake;
};

int main() {
    MockTest *test = new MockTest();
    test->delegate();
    test->func(1, 5.6);
}
每当func(int,float)被调用时,我都会尝试击中假对象。它编译良好,但是遇到了段错误。 valgrind的错误消息显示:
[ethan@ethan test]$ valgrind ./gmock_test 
==119183== Invalid read of size 8
==119183==    at 0x10DD74: MatchAndExplain (gmock-matchers.h:292)
==119183==    by 0x10DD74: Matches (gmock-matchers.h:298)
==119183==    by 0x10DD74: Matches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:908)
==119183==    by 0x10DD74: Matches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:907)
==119183==    by 0x10DD74: TupleMatches<std::tuple<testing::Matcher<int>, testing::Matcher<float> >, std::tuple<int, float> > (gmock-matchers.h:976)
==119183==    by 0x10DD74: Matches (gmock-spec-builders.h:340)
==119183==    by 0x10DD74: FindOnCallSpec (gmock-spec-builders.h:1497)
==119183==    by 0x10DD74: testing::internal::FunctionMockerBase<void (int, float)>::DescribeDefaultActionTo(std::tuple<int, float> const&, std::ostream*) const (gmock-spec-builders.h:1650)
==119183==    by 0x10CF94: testing::internal::FunctionMockerBase<void (int, float)>::UntypedDescribeUninterestingCall(void const*, std::ostream*) const (gmock-spec-builders.h:1672)
==119183==    by 0x40550F5: testing::internal::UntypedFunctionMockerBase::UntypedInvokeWith(void*) (in /misc/toolchain-builds/d1ce2497ca66f4a55430c86fd8812027a7e8d5ea.x86_64/lib/libgmock.so)
==119183==    by 0x10CB3E: InvokeWith (gmock-spec-builders.h:1603)
==119183==    by 0x10CB3E: Invoke (gmock-generated-function-mockers.h:121)
==119183==    by 0x10CB3E: MockTest::func(int, float) (test.cc:19)
==119183==    by 0x10C957: main (test.cc:37)
==119183==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
有人可以告诉我该如何处理吗?

最佳答案

问题出在这里的匹配器


ON_CALL(*this, func(Matcher<int>(), 
                            Matcher<float>()))

::testing::Matcher<T>的默认构造函数创建空实现(gtest / gtest-matchers.h):

327   // Constructs a null matcher.  Needed for storing Matcher objects in STL
328   // containers.  A default-constructed matcher is not yet initialized.  You
329   // cannot use it until a valid value has been assigned to it.
330   explicit Matcher() {}  // NOLINT

您需要使用any匹配器来实现以下目的:
ON_CALL(*this, func(_, _))

或者,因为您已重载了此功能,请使用A/An匹配器:

ON_CALL(*this, func(An<int>(), A<float>()))

PS。
A和An之间没有真正的区别-只是英语语法:)

关于c++ - Google模拟内部段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63199667/

相关文章:

c++ - 信号中的 Qt 枚举需要 qRegisterMetaType

C++ 无法从映射中调用 lambda 表达式

c - 读取充满整数的文件时,C 中的段错误

c - 从 void ptr 取消引用整数时出现 SegFault

c++ - 我在使用纯虚拟方法和 Google Mock 时做错了什么?

c++ - 谷歌模拟单元测试

c++ - 传递 GCcflags -std=c++11 CXXFLAGS 或 CXX 或 CFLAGS

c++ - LuaJIT FFI 中的指针和引用问题

generics - 不安全队列实现

googletest - TEST、TEST_F 和 TEST_P 之间有什么区别?