2

凌晨 05:00 的肮脏黑客攻击。通过在同一个进程的线程之间使用 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+pure pthreads 应用程序的插件试图直接通信的上下文中?出于某种原因,我觉得这不是一些明显的垃圾收集,而且公平,Linux 线程正在使用共享进程内存,所以它没有地址不匹配,并且指针取消引用看起来也不错。

4

2 回答 2

5

我在这里猜你应该尝试:

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

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

于 2013-08-25T02:47:04.640 回答
2

addr包含 achar **而不是 a char *
这意味着您发送的是指针变量的地址,而不是缓冲区本身的地址。
稍后在您的线程代码中,您将 long back 转换为char *,这应该是char **. 这就是记忆似乎被改变的原因。

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

于 2013-08-25T10:53:01.730 回答