编译错误 : "creating array with negative size (' -0x0000000000000000 1')", "assignment of read-only location"

标签 c googlemock

您好,我是 GoogleMock 的新手,但对 mocking 并不陌生(我有 python 经验)。

对于基于 C 代码的界面,我们希望使用 Googlemock。直到编译一切顺利。定义基于 C 的代码没有问题: 模拟头文件

#include "gmock/gmock.h"  
extern "C"
{
   #include "interface/interfacetype.h"
}
struct HELPER
{
   virtual ~HELPER() {}
   virtual int interface_func( ID_ENUM_TYPE id, MY_STRUCT_TYPE *params) = 0;
};
struct INTERFACE_MOCK : public HELPER
{
    MOCK_METHOD2( interface_func, int( ID_ENUM_TYPE id, MY_STRUCT_TYPE *params) );
};
extern INTERFACE_MOCK *mock_create_mock();
extern void mock_delete_mock();

模拟实现:

#include mock.h
extern "C"
{
  #include "interface/interfacetype.h"
}
INTERFACE_MOCK *interface_2_mock = NULL;
extern "C"
{
   int interface_func( ID_ENUM_TYPE id, MY_STRUCT_TYPE *params )
   {
       return interface_2_mock->interface_func( id, params );
   }
}
INTERFACE_MOCK *mock_create_mock()
{
    if ( interface_2_mock == NULL )
    {
        interface_2_mock = new( INTERFACE_MOCK );
    }
    return interface_2_mock;
}
void mock_delete_mock()
{
    delete interface_2_mock;
}

MY_STRUCT_TYPE 如下:

typedef struct my_struct_tag
{
    float value[196]
} MY_STRUCT_TYPE

单元测试代码如下:

INTERFACE_MOCK *interface_2_mock;

class fixture : public ::testing::Test
{
   protected:
      virtual void SetUp()
      {
         interface_2_mock = mock_create_mock();
      }

      virtual void TearDown()
      {
         mock_delete_mock();
      }
};


TEST_F( fixture, test_case )
{
MY_STRUCT_TYPE params;
int result = 0;
for ( int i=0; i<196; i++)
{
    params.value[i] = 1.23;
}
// I'm only interested in checking that function is called,
            //  mocking the return-value and mocking 'params' which is an output-param
EXPECT_CALL( *interface_2_mock, interface_func( _, _ ) ) 
            .Times(2)
            .WillRepeatedly( DoAll( SetArgReferee<1>( &params ), return 0 ) ) );
// Call function_under_test which calls interface_func
result = function_under_test();
            ASSERT_EQ( 0, result ) << "Return-value " << result << " not as expected"
}

编译时一切顺利,直到编译了 EXPECT_CALL 行。我们有以下我们不理解的错误:

Rebuilding "<target>.oppsparc" on host "<host>" 

======== Finished "<target>.oppsparc" on host "<host>" ========
Sun native compile : test_my_test.cpp to test_my_test.oppsparc
In file included from ./gmock/gmock.h:65,
             from mock/interface_2_mock.hpp:33,
             from test_my_test.cpp:23:
./gmock/gmock-more-actions.h: In member function 'typename testing::internal::Function<F>::Result testing::SetArgRefereeActionP<k, value_type>::gmock_Impl<F>::gmock_PerformImpl(const typename testing::internal::Function<F>::ArgumentTuple&, arg0_type, arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type, arg8_type, arg9_type) const [with arg0_type =  ID_ENUM_TYPE , arg1_type = MY_STRUCT_TYPE*, arg2_type = testing::internal::ExcessiveArg, arg3_type = testing::internal::ExcessiveArg, arg4_type = testing::internal::ExcessiveArg, arg5_type = testing::internal::ExcessiveArg, arg6_type = testing::internal::ExcessiveArg, arg7_type = testing::internal::ExcessiveArg, arg8_type = testing::internal::ExcessiveArg, arg9_type = testing::internal::ExcessiveArg, F = void( ID_ENUM_TYPE , MY_STRUCT_TYPE*), int k = 1, value_type = MY_STRUCT_TYPE*]':
./gmock/gmock-generated-actions.h:664:   instantiated from 'static Result testing::internal::ActionHelper<Result, Impl>::Perform(Impl*, const std::tr1::tuple<_U1, _U2>&) [with A0 = ID_ENUM_TYPE , A1 =MY_STRUCT_TYPE*, Result = void, Impl = testing::SetArgRefereeActionP<1, MY_STRUCT_TYPE*>::gmock_Impl<void( ID_ENUM_TYPE ,MY_STRUCT_TYPE*)>]'
./gmock/gmock-more-actions.h:170:   instantiated from 'typename testing::internal::Function<F>::Result testing::SetArgRefereeActionP<k, value_type>::gmock_Impl<F>::Perform(const typename testing::internal::Function<F>::ArgumentTuple&) [with F = void( ID_ENUM_TYPE , MY_STRUCT_TYPE*), int k = 1, value_type = MY_STRUCT_TYPE*]'
test_my_test.cpp:251:   instantiated from here
./gmock/gmock-more-actions.h:175: error: creating array with negative size ('-0x00000000000000001')
./gmock/gmock-more-actions.h:177: error: assignment of read-only location 'std::tr1::get [with int __i = 1, _Elements = ID_ENUM_TYPE, MY_STRUCT_TYPE*](((const std::tr1::tuple<ID_ENUM_TYPE, MY_STRUCT_TYPE*>&)((const std::tr1::tuple<ID_ENUM_TYPE, MY_STRUCT_TYPE*>*)args)))'
*** Error code 1
========================================================

Aborting...

你能帮我们吗?

/* edit */我看到我遗漏了夹具

最佳答案

这次我找到了答案。而不是 SetArgReferee<1>( ¶ms ),我应该使用 SetArgPointee<1>( params )

关于编译错误 : "creating array with negative size (' -0x0000000000000000 1')", "assignment of read-only location",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614040/

相关文章:

c - 链表追加中指针的指针

C 编程 我试图从 2 个 txt 文件切换内容

函数声明中参数的 Const 限定

c++ - gmock 模拟类不继承任何类

c++ - GoogleMock 是否让我在模拟类中实现析构函数?

c++ - gmock TypedEq 相同的字符串不同的地址

c++ - 将方法参数传递给 googlemock 中的操作

c - 是否可以在同一个函数中使用两种不同类型的二进制文件进行写入?

c - 在ubuntu上运行C程序

qt - 将 Gmock 设置为 QT (Windows)