malloc:什么可以“破坏”Linux / Qt应用程序(涉及的线程)中分配的内存?

时间:2013-08-25 01:58:14

标签: c multithreading qt gdb ipc

凌晨05:00肮脏的黑客攻击。我犯了错误,SO ,通过FIFO在相同进程的线程之间传递指针的地址:

total_buf = (char*)malloc(msize);
// ...
long addr = (long)&total_buf;
// ...
write(fifo, buf, 128);

在接收器线程中收到指向total_buf的指针后,void* pt = (void*)addr;char* tbuf = (char*)pt;我注意到缓冲区内容已更改,并且通过检查内存内容明确确认:(gdb) x/1024xb tbuf

出现这种情况的可能原因是什么 - 在多线程Qt +纯pthreads应用程序的插件尝试直接通信的环境中?出于某种原因,我觉得这不是一些明显的垃圾收集和事后,Linux线程正在使用共享进程内存,因此它没有地址不匹配,并且指针取消引用也看起来不错,。

2 个答案:

答案 0 :(得分:5)

我猜你应该尝试:

long addr = (long)total_buf; /* removed & */

...因为你后来首先将addr转换为void *然后转换为char *。你的版本有addr是指向指针的长版本,而不是指向缓冲区的指针的长版本。

答案 1 :(得分:2)

addr包含char **而不是char * 这意味着您要发送指针变量的地址,而不是缓冲区本身的地址 稍后在您的线程代码中,您将回到char *,这应该是char **。这就是内存似乎被改变的原因。

顺便说一句:地址应该转换为size_t而不是长。