gpt4 book ai didi

c - memcpy(dst, src, n) 之后的 free(src) 导致段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:01 25 4
gpt4 key购买 nike

考虑下面的代码:

int main(int argc, char* argv[])
{
int prt = 6;
serial_port *cprt = open_comport(prt);

int n;

while(TRUE)
{
ubx_raw *msg = malloc(sizeof(ubx_raw));
uint8_t *buf = malloc(1024*sizeof(uint8_t));
n = RS232_PollComport(cprt->nr, buf, 1024);

msg = ubx_acquire_frombuf(buf, n);
//PROBLEM
free(buf);
if (msg == NULL)
{
printf("Message scrambled or no message in the buffer!\n");
free(msg);
}
else
{
printf("Length: %" PRIu16 "\n", msg->length);
}

free(buf);
Sleep(1000);
if (msg == NULL)
{
free(msg);
}
}

return 0;
}

函数

ubx_raw *ubx_acquire_frombuf(uint8_t *buf, int size)
{
ubx_raw *msg = malloc(sizeof(ubx_raw));
int n = 0;
//sweep through bytes
while (n < size - 1)
{
//check if start of message
if ((buf[0] == UBX_SYNC1) && (buf[1] == UBX_SYNC2))
{
//put stuff into msg
msg->length = ((uint16_t)*(buf+4));
//check if full message available, otherwise
//reduce amount to memcpy
if (msg->length < size)
{
size = msg->length;
}
//PROBLEMATIC
memcpy(&msg->data, &buf, size);
return msg;
}
else
{
n++;
continue;
}
}
return NULL;
}

每当 ubx_acquire_frombuf() 被调用时(接近 mainwhile 循环的开始)随后的 free(buf) 给出段错误。显然,该函数中的 buf 发生了一些不好的事情。我知道你不能 free() 没有 malloc() 的东西,你不能 free() 东西两次.实际上,因为指针是按值传递的,所以 ubx_acquire_frombuf() 内部发生的事情应该与 main 无关,对吧?

无论如何,注释掉有问题的 memcpy()(在 ubx_acquire_frombuf() 中)会删除段错误。为何如此?我还是想用那个memcpy!任何人都可以阐明正在发生的事情吗? memcpy() 不应该编辑它复制的来源(即 buf),对吧?

附言很抱歉没有一个最小的例子,但我无法从头开始重现问题。我不确定发生了什么,但在 ubx_acquire_frombuf() 中没有任何异常(即调用我编写的其他函数),所以这与最小示例相差不远。


编辑:根据大众需求:

typedef struct {
uint8_t *data;
uint16_t length;
} ubx_raw;

最佳答案

您标记为有问题的代码确实有问题:

// PROBLEMATIC
memcpy(&msg->data, &buf, size);

问题是你在复制size字节到字段 msg->data (因为您将 msg->data 的地址传递给 memcpy),但该字段只是一个指针,其大小非常小。所以 memcpy 将覆盖 ubx_raw 的其余部分结构,然后是内存中它后面的任何内容,其中将包括一些 malloc的内部会计信息。

你可能是说

// PROBLEMATIC
memcpy(msg->data, &buf, size);

但这仍然是个问题,因为msg->data从未被初始化。所以一个更可能的解决方案是:

// NOT PROBLEMATIC but don't forget to free(msg->data) before free(msg).
msg->data = malloc(size); // Check for non-NULL
memcpy(msg->data, &buf, size);

关于c - memcpy(dst, src, n) 之后的 free(src) 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com