ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Valgrind Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ. ΠΠΎΠΌΠ½ΠΈΡΠ΅ ch15-badmem.c? (Π‘ΠΌ. ΡΠ°Π·Π΄Π΅Π» 15.5.2.2 Β«Electric FenceΒ».) ΠΠΏΡΠΈΡ -b Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΏΠ°ΠΌΡΡΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΡΡΡΡ Π²Π½Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ malloc() Π±Π»ΠΎΠΊΠ°. ΠΠΎΡ ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Valgrind:
$ valgrind ch15-badmem1 -b
1 ==8716== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
2 ==8716== Copyright (C) 2002-2003, and GNU GPL'd, by Julian Seward.
3 ==8716== Using valgrind-20030725, a program supervision framework for x86-linux.
4 ==8716== Copyright (C) 2000-2003, and GNU GPL'd, by Julian Seward.
5 ==8716== Estimated CPU clock rate is 2400 MHz
6 ==8716== For more details, rerun with: -v
7 ==8716==
8 p = <not 30 bytes>
9 ==8716== Invalid write of size 1
10 ==8716== at 0x8048466: main (ch15-badmem1.c:18)
11 ==8716== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
12 ==8716== by 0x8048368: (within /home/arnold/progex/code/ch15/ch15-badmem1)
13 ==8716== Address 0x4104804E is 12 bytes after a block of size 30 alloc'd
14 ==8716== at 0x40025488: malloc (vg_replace_malloc.Ρ:153)
15 ==8716== by 0x8048411: main (ch15-badmem1.c:11)
16 ==8716== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
17 ==8716== by 0x8048368: (within /home/arnold/progex/code/ch15/ch15-badmem1)
18 ==8716==
19 ==8716== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
20 ==8716== malloc/free: in use at exit: 30 bytes in 1 blocks.
21 ==8716== malloc/free: 1 allocs, 0 frees, 30 bytes allocated.
22 ==8716== For a detailed leak analysis, rerun with: --leak-check=yes
23 ==8716== For counts of detected errors, rerun with: -v
(ΠΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊ Π² Π²ΡΠ²ΠΎΠ΄Π΅, ΡΡΠΎΠ±Ρ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅.) Π‘ΡΡΠΎΠΊΠ° 8 ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ; ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΡ Valgrind Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ. Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΡΡΠΎΠΊΠ°Ρ 9β17. ΠΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ² Π±ΡΠ»ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π΅Π²Π΅ΡΠ½ΠΎ (ΡΡΡΠΎΠΊΠ° 9), Π³Π΄Π΅ ΡΡΠΎ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ (ΡΡΡΠΎΠΊΠ° 10), ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅ΠΊΠ°. Π‘ΡΡΠΎΠΊΠΈ 13β17 ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ, ΠΎΡΠΊΡΠ΄Π° Π±ΡΠ»Π° Π²ΡΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡΡ. Π‘ΡΡΠΎΠΊΠΈ 19β23 ΠΏΠΎΠ΄Π²ΠΎΠ΄ΡΡ ΠΈΡΠΎΠ³ΠΈ.
ΠΠΏΡΠΈΡ -f ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ch15-badmem1 ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² Π½Π΅Π΅ ΡΠ΅ΡΠ΅Π· Π²ΠΈΡΡΡΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΠΎΡ ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Valgrind Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅:
$ valgrind ch15-badmem1 -f
==8719== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
...
p = <not 30 bytes>
==8719== Invalid write of size 1
==8719== at 0x8048498: main (ch15-badmem1.Ρ:21)
==8719== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
==8719== by 0x8048368: (within /home/arnold/progex/code/ch15/ch15-badmem1)
==8719== Address 0x41048024 is 0 bytes inside a block of size 30 free'd
==8719== at 0x40025722: free (vg_replace_malloc.Ρ:220)
==8719== by 0x8048491: main (ch15-badmem1.c:20)
==8719== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
==8719== by 0x8048368: (within /home/arnold/progex/code/ch15/ch15-badmem1)
...
ΠΠ° ΡΡΠΎΡ ΡΠ°Π· Π² ΠΎΡΡΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ Π±ΡΠ»Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½Π° Π² ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΡΡΠΎ Π²ΡΠ·ΠΎΠ² free() Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΡΡΠΎΠΊΠ΅ 20 ch15-badmem1.c.
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π±Π΅Π· ΠΎΠΏΡΠΈΠΉ ch15-badmem1.c Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ, Π½ΠΎ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π΅Π΅. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠΏΡΠΈΡ βleak-check=yes:
$ valgrind --leak-check=yes ch15-badmem1
1 ==8720== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
...
8 p = <not 30 bytes>
9 ==8720==
10 ==8720== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
11 ==8720== malloc/free: in use at exit: 30 bytes in 1 blocks.
12 ==8720== malloc/free: 1 allocs, 0 frees, 30 bytes allocated.
...
16 ==8720==
17 ==8720== 30 bytes in 1 blocks are definitely lost in loss record 1 of 1
18 ==8720== at 0x40025488: malloc (vg_replace_malloc.c:153)
19 ==8720== by 0x8048411: main (ch15-badmem1.c:11)
20 ==8720== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
21 ==8720== by 0x8048368: (within /home/arnold/progex/code/ch15/ch15-badmem1)
22 ==8720==
23 ==8720== LEAK SUMMARY:
24 ==8720== definitely lost: 30 bytes in 1 blocks.
25 ==8720== possibly lost: 0 bytes in 0 blocks.
26 ==8720== still reachable: 0 bytes in 0 blocks.
27 ==8720== suppressed: 0 bytes in 0 blocks.
28 ==8720== Reachable blocks (those to which a pointer was found) are not shown.
29 ==8720== To see them, rerun with: --show-reachable=yes
Π‘ΡΡΠΎΠΊΠΈ 17β29 ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΡΠ΅Ρ ΠΎΠ± ΡΡΠ΅ΡΠΊΠ΅; ΡΡΠ° ΠΏΠ°ΠΌΡΡΡ Π±ΡΠ»Π° Π²ΡΠ΄Π΅Π»Π΅Π½Π° Π² ΡΡΡΠΎΠΊΠ΅ 11 ch15-badmem1.Ρ.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΎΡΡΠ΅ΡΠΎΠ² ΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Valgrind ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ch15-badmem3.c:
1 /* ch15-badmem3.c --- ΠΏΠ»ΠΎΡ ΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ Ρ Π½Π΅Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 int main(int argc, char **argv)
7 {
8 int a_var; /* ΠΠ±Π΅ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ */
9 int b_var;
10
11 /* Valgrind Π½Π΅ ΠΎΡΠΌΠ΅ΡΠΈΡ ΡΡΠΎ; ΡΠΌ. ΡΠ΅ΠΊΡΡ. */
12 a_var = b_var;
13
14 /* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ; ΡΡΠΎ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ. */
15 printf("a_var = %d\n", a_var);
16
17 return 0;
18 }
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Valgrind Π²ΡΠ΄Π°Π΅Ρ ΡΡΠΎΡ (ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΡΠΉ) ΠΎΡΡΠ΅Ρ:
==29650== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
...
==29650== Use of uninitialised value of size 4
==29650== at 0x42049D2A: _IO_vfprintf_internal (in /lib/i686/libc-2.2.93.so)
==29650== by 0x420523C1: _IO_printf (in /lib/1686/libc-2.2.93.so)
==29650== by 0x804834D: main (ch15-badmem3.Ρ:15)
==29650== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
==29650==
==29650== Conditional jump or move depends on uninitialised value(s)
==29650== at 0X42049D32: _IO_vfprintf_internal (in /lib/i686/libc-2.2.93.so)
==29650== by 0x420523C1: _IO_printf (in / lib/i686/libc-2.2.93.so)
==29650== by 0x804834D: main (ch15-badmem3.c:15)
==29650== by 0x420158D3: __libc_start_main (in /lib/i686/libc-2.2.93.so)
...
a_var = 1107341000
==29650==
==29650== ERROR SUMMARY: 25 errors from 7 contexts (suppressed: 0 from 0)
==29650== malloc/free: in use at exit: 0 bytes in 0 blocks.
==29650== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
==29650== For a detailed leak analysis, rerun with: --leak-check=yes
==29650== For counts of detected errors, rerun with: -v
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Valgrind ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π΅ Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ . ΠΠ±ΠΎΠ»ΠΎΡΠΊΠ° memcheck ΠΎΡΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ (Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅) ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΡ . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, a_var ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΡ b_var, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ.
memcheck ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. ΠΠ΄Π΅ΡΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π‘ (_IO_vfprintf_internal()), ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΡΡΠΎΠΊΡ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ, ΠΎΠ½Π° ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Ρ ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ ΠΎΡΡ Valgrind ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ Π±ΠΈΡΠΎΠ², ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΡΠ°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . (Valgrind ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π³ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΡΠ°ΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΡΡ ΠΏΠ°ΠΌΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π½Π°Π΅Ρ ΠΎ Π½Π°ΡΠ°Π»Π΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.)
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Valgrind ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π² ΡΠ°ΠΊΠΈΡ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ , ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΠΊΠ°ΠΊ KDE 3, OpenOffice ΠΈ Π²Π΅Π±-Π±ΡΠ°ΡΠ·Π΅Ρ Konqueror. ΠΠ½ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΠ΅Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ, Π° Π΄ΡΡΠ³Π°Ρ Π΅Π³ΠΎ Π²Π΅ΡΡΠΈΡ Π±ΡΠ»Π° Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° (ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΡΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ WINE[182]) Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π΄Π»Ρ Microsoft Windows Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Visual Π‘++! ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Valgrind Ρ Π΅Π³ΠΎ Π²Π΅Π±-ΡΠ°ΠΉΡΠ°[183].
15.5.2.5. ΠΡΡΠ³ΠΈΠ΅ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΈ malloc
ΠΠ²Π΅ ΡΡΠ°ΡΡΠΈ Cal Ericson Π² Linux Journal ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ mtrace ΠΈ dmalloc, Π° ΡΠ°ΠΊΠΆΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠΈ ΡΡΠ°ΡΡΠΈ Memory Leak Detection in Embedded Systems, Π²ΡΠΏΡΡΠΊ 101[184], ΡΠ΅Π½ΡΡΠ±ΡΡ 2002 Π³., ΠΈ Memory Leak Detection in C++, Π²ΡΠΏΡΡΠΊ 110[185], ΠΈΡΠ½Ρ 2003 Π³. ΠΠ±Π΅ ΡΡΠ°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π° Π²Π΅Π±-ΡΠ°ΠΉΡΠ΅ Linux Journal.
ΠΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΡ ΠΎΠ΄Π½Ρ ΠΏΠΎ ΠΏΡΠΈΡΠΎΠ΄Π΅ Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ ΡΠ°Π½Π΅Π΅.
ccmalloc
ΠΠ°ΠΌΠ΅ΡΠ°ΡΡΠ°Ρ malloc() Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² ΠΎΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Ρ Π‘++. Π‘ΠΌ. http://www.inf.ethz.ch/personal/biere/projects/ccmalloc.
malloc ΠΠ°ΡΠΊΠ° ΠΠΎΡΠ°Π΅ΡΠ° (Mark Moraes)
Π‘ΡΠ°ΡΠΈΠ½Π½Π°Ρ, Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ malloc(), ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π΅ Ρ ftp://ftp.cs.toronto.edu/pub/moraes/malloc-1.18.tar.gz.
mpatrol
ΠΠ°ΠΊΠ΅Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΠΌ http://www.cbmamiga.demon.ΡΠΎ.uk/mpatrol.
memwatch
ΠΠ°ΠΊΠ΅Ρ, ΡΡΠ΅Π±ΡΡΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΠΏΡΠΈΠΉ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΠΌ. http://www.linkdata.se/sourcecode.html.
njamd
Β«ΠΠ΅ ΠΏΡΠΎΡΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ mallocΒ» (Not Just Another Malloc Debugger). ΠΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ; Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ LD_PRELOAD Π΄Π»Ρ Π·Π°ΠΌΠ΅Π½Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ. Π‘ΠΌ. http://sourceforge.net/projects/njamd.
yamd
ΠΠΎΡ ΠΎΠΆ Π½Π° Electric Fence, Π½ΠΎ ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΎΠΏΡΠΈΡΠΌΠΈ. Π‘ΠΌ. http://www3.hmc.edu/~neldredge/yamd.
ΠΠΎΡΡΠΈ Π²ΡΠ΅ ΠΈΠ· ΡΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. Π ΡΠ°Π±Π»ΠΈΡΠ΅ 15.1 Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠ°ΡΠ΅ΠΉ ΠΈΠ· Linux Journal ΡΠ΄Π΅Π»Π°Π½Π° ΡΠ²ΠΎΠ΄ΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².