C++ GMock SetArrayaGument双重自由或腐败

C++ GMock SetArrayaGument双重自由或腐败,c++,memory,googletest,googlemock,double-free,C++,Memory,Googletest,Googlemock,Double Free,编辑:我自己解决了双重自由错误,但是问题(问题1)为什么它的行为不同于命令行和CLion内部仍然存在 我正在尝试使用gmock和gtest。我想模拟一个函数,它将指针作为参数,并用内容填充它。我的模拟类具有以下功能: //MockUdpServer class MOCK_METHOD(int, receive_msg_impl, (unsigned char *buf, int sec, int usec)); virtual int receive_msg(unsigned char *b

编辑:我自己解决了双重自由错误,但是问题(问题1)为什么它的行为不同于命令行和CLion内部仍然存在


我正在尝试使用gmock和gtest。我想模拟一个函数,它将指针作为参数,并用内容填充它。我的模拟类具有以下功能:

//MockUdpServer class
MOCK_METHOD(int, receive_msg_impl, (unsigned char *buf, int sec, int usec));

virtual int receive_msg(unsigned char *buf, int sec = -1, int usec = -1) override {
        return receive_msg_impl(buf, sec, usec);
}
我的测试代码如下所示:

TEST(Action, ref) {
    MockUdpServer mock_server;

    unsigned char test[]={0x0, 0x61}

    EXPECT_CALL(mock_server, receive_msg_impl)
            .WillOnce(SetArrayArgument<0>(test, test+2));

    unsigned char a[256];
    mock_server.receive_msg(a);
}
有两件事让我困惑:

  • 为什么在CLion内部运行和从命令行运行之间存在差异?我猜可能是一些编译器标志
  • (此设置在不同的情况下工作,例如,我有另一个对象,它接受
    MockUdpServer
    并在其上内部调用
    receive\u msg
    。此调用成功。为什么它不能直接在测试本身中工作?回答:在其他测试用例中,我使用了DoAll并指定了返回值和数组co。))

  • 编辑:显然,测试代码必须指定返回值,即使它未被使用。以下代码不会产生任何错误:

    TEST(Action, ref) {
        MockUdpServer mock_server;
    
        unsigned char test[]={0x0, 0x61}
    
        EXPECT_CALL(mock_server, receive_msg_impl)
                .WillOnce(DoAll(
                       SetArrayArgument<0>(test, test+2),
                       Return(2)));
    
        unsigned char a[256];
        mock_server.receive_msg(a);
    }
    
    测试(动作,参考){
    MockUdpServer mock_server;
    无符号字符测试[]={0x0,0x61}
    期望调用(模拟服务器,接收消息)
    .威洛斯(道尔)(
    SetArrayArgument(测试,测试+2),
    返回(2));
    无符号字符a[256];
    模拟服务器。接收消息(a);
    }
    
    TEST(Action, ref) {
        MockUdpServer mock_server;
    
        unsigned char test[]={0x0, 0x61}
    
        EXPECT_CALL(mock_server, receive_msg_impl)
                .WillOnce(DoAll(
                       SetArrayArgument<0>(test, test+2),
                       Return(2)));
    
        unsigned char a[256];
        mock_server.receive_msg(a);
    }