編集:私の仮定を無視するようにタイトルを変更しました。
c で記述されたライブラリがあります。このライブラリは、posix メッセージ キューを使用して、スレッド間のランタイム データへのポインタを渡します。
データがユーザー アプリケーションからのものである場合、すべて正常に動作しているように見え、メッセージ キューからの構造体へのポインタが指すデータにアクセスできます。
ここで、ライブラリ自体が構造体の 1 つのインスタンスの 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
....
それで、誰かがここで何が起こっているかについて何か提案を受けましたか?