0

我正在使用谷歌 C++ 测试工具进行单元测试。我是一名新手 C 程序员和测试员。以下是我的代码片段:

TEST_F (def_fix, SR_M_T) {
    I_M_S * arg;
    RM__S_F_R_T* message_data;
    char mT[MAX_M_T_LENGTH] = "data";

    strcpy(message_data->mT,mT);
    message_data->rUID[0] = '\0';
    message_data->uT[0] = '\0';

    unsigned char buffer[sizeof(RM__S_F_R_T)+2];
    memcpy(&buffer[2],message_data,sizeof(RM__S_F_R_T));

    buffer[0] = 1;      //This assignment is not important for this test
    buffer[1] = 2;          //This assignment is not important for this test

    arg->payload_data = buffer;

    handleSR(arg);
}

以上所做的是创建传入消息。这个传入的消息arg将用作调用函数的参数,它handleSR (void *).
def_fix是一个默认的夹具类,其中包含SetUp()并且TearDown()没有任何花哨的东西。

RM__S_F_R_T是一个包含 3 个字符串的结构。 I_M_S是一个包含指向 的指针的结构RM__S_F_R_T

当我用谷歌测试这个时,它给出了一个分段错误。但是,当我更改: RM__S_FR_R_ * message_data; 使用 运算符RM__S_FR_R_ message_data;.不是->运算符时,事情往往会奏效。谁能解释一下?

4

5 回答 5

2

这两种说法:

RM__S_F_R_T* message_data;
strcpy(message_data->mT,mT);

是罪魁祸首。你永远不会初始化RM__S_F_R_T(谁设计了这个东西?!)指针。当不将其用作指针时,您可以在堆栈上创建一个可以使用的实例。

修复要么不使用指针(你已经发现了),要么分配内存:

message_data = malloc(sizeof(RM__S_F_R_T));

free(message_data)当你完成实例时不要忘记,否则你会泄漏内存。

于 2013-05-30T06:39:48.070 回答
0

初始化I_M_S * argRM__S_F_R_T* message_data

I_M_S * arg = malloc(sizeof(I_M_S));
RM__S_F_R_T* message_data = malloc(sizeof(RM__S_F_R_T));

此外,请确保不要在 function 范围之后使用这些分配的指针,TEST_F()因为您在 function 之后分配arg->payload_data = buffer了本地化变量的范围buffer结束的位置TEST_F()

所以,在你离开之前释放这些指针TEST_F()

免费(arg);免费(消息数据);

于 2013-05-30T06:42:06.207 回答
0

这是因为您声明message_data为指针,但不要将其指向任何东西。那么它将指向一个随机内存位置,当您取消引用它时会导致未定义的行为。

要么将其声明为不是指针,要么为其分配内存。

于 2013-05-30T06:39:15.073 回答
0

您没有为 RM__S_F_R_T* 提供内存。之后使用 message_data

message_data = (RM__S_F_R_T*)malloc(sizeof(RM__S_F_R_T));
于 2013-05-30T06:40:29.820 回答
0

message_data没有指向任何东西。您需要将初始化的 RM__S_F_R_T 结构指针作为参数传递给您的函数,或者在函数本身内部对其进行初始化。

此外,我认为message_data->mT是一个 char 指针。它目前没有指向任何东西。

您可以使用 为它分配空间malloc,或者如果它是一个 char 数组,则确保它足够大以容纳mT它(假设它的结构已经初始化)。

以上适用于所有message_data会员。

正如其他海报已经提到的那样,不要忘记free()您已经malloc()编辑过的任何内容。

于 2013-05-30T06:44:42.577 回答