c-在什么情况下,我可能会失去对malloc分配的指针的访问权限


编辑:更改标题以忽略我的假设。

我有一个用c编写的库,它使用posix消息队列在线程之间传递指向一些运行时数据的指针。

在数据来自用户应用程序的情况下,一切似乎都很好,并且我能够访问指针指向结构的数据,这些数据来自消息队列。

现在,我有一个特殊情况,库本身将对结构的一个实例执行malloc,设置一个标志并将其发送到同一队列。在接收端,结构为空,标志为零。对指针调用free会导致崩溃。

这里的代码:

volatile s_thestruct * volatile data = malloc(sizeof(s_thestruct));
data->flags = THE_FLAG;
mq_send(handle, (char *)&data, sizeof(s_thestruct *), 1)

在接收端:

ssize_t read = mq_receive(handle, (char*)&data, sizeof(s_thestruct*), NULL);
if(read != sizeof(s_thestruct *))
{
// Error handling, no problems here
}
if(data->flags == THE_FLAG)
{
// Do something, never gets here
}
// Do something else, no it is not freed here
// Finally
free(data); // <--CRASH

我会得到:

*** glibc detected *** /usr/bin/applicationthingy: free(): invalid pointer: 0x08053cf0 ***

接着是转储。在内存映射转储中,我发现:

....
08048000-0804a000 r-xp 00000000 08:01 802680     /usr/bin/applicationthingy
0804a000-0804b000 r--p 00001000 08:01 802680     /usr/bin/applicationthingy
0804b000-0804c000 rw-p 00002000 08:01 802680     /usr/bin/applicationthingy
0804c000-0806f000 rw-p 00000000 00:00 0          [heap]
b6e00000-b6e21000 rw-p 00000000 00:00 0 
....

那么,有人对这里发生的事情有什么建议吗?

假设它们来自同一地址空间,那么(传递指针)应该可以正常工作。

我唯一能想到的是,是否有可能从单独的进程写入队列?这将使指针变得无用,因为它们在不同的过程中指向的内容完全不同。

不过,老实说,除非结构本身很大,否则我不会像那样到处传递指针。如果您通过该结构,您将获得能够执行适当的进程间队列的所有优势。

另一件需要检查的事情是,库以某种方式从与主代码不同的内存领域获得分配。这种情况会导致free失败,但可能不是错误的标志,因为即使它们使用不同的竞技场,它们也会在相同的地址空间中。

至少,您应该在发送端和接收端打印出data的值,以确保它毫发无损。完全有可能是其他代码损坏了它(la缓冲区溢出等等)。

您应该在mq_send(handle, (char *)&data, sizeof(s_thestruct *), 1)中传递data而不是&data(数据地址)。

相关内容

  • 没有找到相关文章

最新更新