编辑:我自己解决了双重免费错误,但是问题(问题 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)
有两件事让我感到困惑:
- 为什么在 CLion 内部运行和从命令行运行有区别?我想这可能是一些编译器标志?
- (这个设置在不同的情况下工作,例如我有另一个对象,它接受
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);
}