1

编辑:我自己解决了双重免费错误,但是问题(问题 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);
}

现在,在调用之后,receive_msg我希望数组a的内容为test. 当我在 CLion 中执行此操作时,a只有随机内容。当我使用 cmake 单独构建并运行它时,我收到错误消息

double free or corruption (out)
Aborted (core dumped)

有两件事让我感到困惑:

  1. 为什么在 CLion 内部运行和从命令行运行有区别?我想这可能是一些编译器标志?
  2. (这个设置在不同的情况下工作,例如我有另一个对象,它接受MockUdpServer和内部调用receive_msg。这个调用是成功的。为什么它不能直接在测试本身工作?回答:在其他测试用例中我使用了 DoAll并指定了返回值和数组内容。

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

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);
}
4

0 回答 0