1

Valgrind でこれらのエラーが表示され続けます。私のプログラムも segfault しますが、最初に Valgrind のエラーを解決しようとしています。

81 char *ptr = NULL;
82      if (addition_is_safe(sz, TRAILER_SZ))
83          ptr = malloc(sz + TRAILER_SZ);
84 syslog(LOG_NOTICE, "Calling set trailer value, ptr=%p", ptr);

これをログに出力します:

9 月 17 日 00:05:50 アプライアンス m61[18301]: コーリング セット トレーラー値、ptr=0x96af158

ヴァルグラインド:

==18069== 2 errors in context 1 of 4:
==18069== Invalid read of size 1
==18069==    at 0x402BCCA: memcpy (mc_replace_strmem.c:882)
==18069==    by 0x8048819: main (test025.c:13)
==18069==  Address 0x4213709 is 137 bytes inside a block of size 368 free'd
==18069==    at 0x4028F0F: free (vg_replace_malloc.c:446)
==18069==    by 0x40AA00B: fclose@@GLIBC_2.1 (iofclose.c:88)
==18069==    by 0x4136003: __vsyslog_chk (syslog.c:228)
==18069==    by 0x4136446: syslog (syslog.c:119)
==18069==    by 0x8049823: attempt_create_allocation (m61_allocation_core.c:84)
==18069==    by 0x8048914: m61_malloc (m61.c:47)
==18069==    by 0x80487B4: main (test025.c:9)
==18069== 

編集: 私が実行したテスト コードは、実際には Valgrind と私のメモリ デバッグ コードでキャッチされる無効な解放を生成することを意図していました。ただし、セグメンテーション違反は想定されていませんでした。これが起こっていました。syslog をオフにすると、セグ フォールトはなくなり、Valgrind レポートはテスト コードに対して期待どおりになりました。syslog が上記の問題を引き起こした理由がわかりません。

テストコード:

1 #include "m61.h"
2 #include <stdio.h>
3 #include <assert.h>
4 #include <string.h>


7 int main() {
8    char *a = (char *) malloc(200);
9    char *b = (char *) malloc(50);
10   char *c = (char *) malloc(200);
11   char *p = (char *) malloc(3000);
12   (void) a, (void) c;
13   memcpy(p, b - 200, 450);
14   free(p + 200);

新しい Valgrind レポート Valgrind をオフにした後:

==5688== 18 errors in context 1 of 3:
==5688== Invalid read of size 4
==5688==    at 0x402BD00: memcpy (mc_replace_strmem.c:882)
==5688==    by 0x8048849: main (test025.c:13)
==5688==  Address 0x41f92c0 is 16 bytes before a block of size 208 alloc'd
==5688==    at 0x4029F6F: malloc (vg_replace_malloc.c:270)
==5688==    by 0x80497AD: attempt_create_allocation (m61_allocation_core.c:77)
==5688==    by 0x8048950: m61_malloc (m61.c:48)
==5688==    by 0x8048804: main (test025.c:10)
4

1 に答える 1