Valgrind Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Ρ ΠΎΡΡ, ΠΊΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ.
$ valgrind ./broken
==30882== Memcheck, a.k.a. Valgrind, a Memory ERROR detector for x86-linux.
==30882== Copyright (C) 2002-2003, and GNU GPL'd, by Julian Seward.
==30882== Using valgrind-2.0.0, a program super vision framewok for x86-linux.
==30882== Copyright (C) 2000-2003, and GNU GPL'd, by Julian Seward.
==30882== Estimated CPU clock rate is 1547 MHz
==30882== For more details, rerun with: -v
==30882==
==30882== Invalid write of size 1
==30882== ΠΠ΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ°Ρ Π·Π°ΠΏΠΈΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 1
==30882== at 0xC030DB: strcpy (mac_replace_strmem.Ρ:174)
==30882== by 0x8048409: broken (broken.Ρ:15)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: libc_start_main (in /lib/libc-2.3.2.so)
==30882== Address 0x650F029 is 0 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x80483F3: broken (broken.Ρ:14)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Conditional jump or move depends on uninitialised value(s)
==30882== Π£ΡΠ»ΠΎΠ²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ
Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΠΈΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ(ΠΉ)
==30882== at 0x863D8E: __GI_strlen (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so)
==30882== by 0x804841C: broken (broken.Ρ:16)
==30882== by 0x804851F: main (broken.Ρ:47)
1: 12345
==30882==
==30882== Invalid write of size 1
==30882== at 0xC030D0: strcpy (mac_replace_.Ρ: 173)
==30882== by 0x804844D: broken (broken.Ρ:21)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: _libc_start_main (in /lib/libc-2.3.2.so)
==30882== Address 0x650F061 is 0 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_ malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid write of size 1
==30882== at 0xC030DB: strcpy (mac_replace_strmem.Ρ:174)
==30882== by 0x804844D: broken (broken.Ρ:21)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: libc_start_main (in /lib/libc-2.3.2.so)
==30882== Address 0x650F064 is 3 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 4
==30882== ΠΠ΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 4
==30882== at 0x863D50: __GI_strlen (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so)
==30882== by 0x8048460: broken (broken.Ρ:22)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== Address 0x650F064 is 3 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 1
==30882== at 0x857A21: [email protected]@GLIBC_2.1 (in /lib/libc-2.3.2.so)
==30882== by 0x835309: _IO_vfprintf_internal (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf(in /lib/libc-2.3.2.so)
==30882== by 0x8048460: broken (broken.Ρ:22)
==30882== Address 0x650F063 is 2 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.c:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 1
==30882== at 0x857910: [email protected]@GLIBC_2.1 (in /lib/libc-2.3.2.so)
==30882== by 0x835309: _IO_vfprintf_internal (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so)
==30882== by 0x8048460: broken (broken.Ρ:22)
==30882== Address 0x650F061 is 0 bytes after a block of size 5'alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
2: 12345678
==30882==
==30882== Invalid write of size 1
==30882== at 0x8048468: broken (broken.Ρ:25)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882== by 0x8048354: (within /usr/src/d/lad2/code/broken)
==30882== Address 0x650F05B is 1 bytes before a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.c:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 4
==30882== at 0x863D50: __GI_strlen (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so)
==30882== by 0x804847A: broken (broken.c:2 6)
==30882== by 0x804851F: main (broken.c:47)
==30882== Address 0x650F064 is 3 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.c:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.c:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 1
==30882== at 0x857A21: [email protected]@GLIBC_2.1 (in /lib/libc-2.3.2.so)
==30882== by 0x835309: _IO_vfprintf_internal (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so)
==30882== by 0x804847A: broken (broken.c:2 6)
==30882== Address 0x650F063 is 2 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.c:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882==
==30882== Invalid read of size 1
==30882== at 0x857910: [email protected]@GLIBC_2.1 (in /lib/libc-2.3.2.so)
==30882== by 0x835309: _IO_vfprintf_internal (in /lib/libc-2.3.2.so)
==30882== by 0x83BC31: _IO_printf (in /lib/libc-2.3.2.so) ==30882== by 0x804847A: broken (broken.c:2 6)
==30882== Address 0x650F061 is 0 bytes after a block of size 5 alloc'd
==30882== at 0xC0C28B: malloc (vg_replace_malloc.Ρ:153)
==30882== by 0x8048437: broken (broken.Ρ:20)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
3: 12345678
4: 12345
==30882==
==30882== Invalid write of size 1
==30882== at 0x80484A6; broken (broken.c:3 2)
==30882== by 0x804851F: main (broken.Ρ:47)
==30882== by 0x802BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==30882== by 0x8048354: (within /usr/src/d/lad2/code/broken)
==30882== Address 0xBFF2D0FF is just below %esp. Possibly a bug in GCC/G++
==30882== v 2.96 or 3.0.X. To suppress, use: --workaround-gcc 296-bugs = yes
5: 12345
6: 12345
7: 12345
==30882==
==30882== ERROR SUMMARY: 22 ERRORS from 12 contexts (suppressed: 0 from 0)
==30882== malloc/free: in use at exit: 5 bytes in 1 blocks.
==30882== malloc/free: 2 allocs, 1 frees, 10 bytes allocated.
==30882== For a detailed leak analysis, rerun with: --leak-check=yes
==30882== For counts of detected ERRORS, rerun with: -v
==30882== ΠΠ’ΠΠΠ ΠΠ ΠΠ¨ΠΠΠΠΠ: 22 ΠΎΡΠΈΠ±ΠΊΠΈ Π² 12 ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Ρ (ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΎ: 0 ΠΈΠ· 0)
==30882== malloc/free: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ: 5 Π±Π°ΠΉΡ Π² 1 Π±Π»ΠΎΠΊΠ΅.
==30882== malloc/free: 2 ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, 1 ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, 10 Π±Π°ΠΉΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ.
==30882== ΠΠ»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΡΠ΅ΡΠ΅ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Ρ: --leak-check=yes
==30882== ΠΠ»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Ρ: -v
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Valgrind Π½Π°ΡΠ΅Π» Π²ΡΠ΅, ΠΊΡΠΎΠΌΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ Π½Π΅Π΄ΠΎΠ³ΡΡΠ·ΠΊΠΈ, ΠΈ ΡΠΊΠ°Π·Π°Π» Π½Π° ΠΎΡΠΈΠ±ΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎ, Π½Π΅ΠΆΠ΅Π»ΠΈ Π»ΡΠ±ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠ°Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ.
ΠΠΌΠ΅Π΅ΡΡΡ ΠΎΠΏΡΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΡΠ΅ΡΠ΅ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, Ρ ΡΠ°Π½ΡΡΠΈΠ΅ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΡΡΠΎ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠ°ΠΌΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΠΌΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ.
$ valgrind --leak-check=yes ./broken
...
==2292== searching for pointers to 1 not-freed blocks.
==2292== checked 5318724 bytes.
==2292== ΠΏΠΎΠΈΡΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° 1 Π½Π΅ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ.
==2292== ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ 5318724 Π±Π°ΠΉΡ.
==2292==
==2292== 5 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2292== 5 Π±Π°ΠΉΡ Π² 1 Π±Π»ΠΎΠΊΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ Π² ΠΏΠΎΡΠ΅ΡΡΠ½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ 1 ΠΈΠ· 1
==2292== at 0Ρ ΠΠ‘528Π: malloc (vg_replace_malloc.Ρ:153)
==2292== by 0x8048437: broken (broken.Ρ:20)
==2292== by 0x804851F: main (broken.Ρ:47)
==2292== by 0x126BAE: __libc_start_main (in /lib/libc-2.3.2.so)
==2292==
==2292== LEAK SUMMARY:
==2292== definitely lost: 5 bytes in 1 blocks.
==2292== possibly lost: 0 bytes in 0 blocks.
==2292== still reachable: 0 bytes in 0 blocks.
==2292== suppressed: 0 bytes in 0 blocks.
==2292== Reachable blocks (those to which a pointer was found) are not shown.
==2292== To see them, rerun with: --show-reachable=yes
==2292== ΠΠ’ΠΠΠ ΠΠ Π£Π’ΠΠ§ΠΠΠ:
==2292== ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ½ΠΎ: 5 Π±Π°ΠΉΡ Π² 1 Π±Π»ΠΎΠΊΠ΅.
==2292== Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ½ΠΎ: 0 Π±Π°ΠΉΡ Π² 0 Π±Π»ΠΎΠΊΠ΅.
==2292== ΠΏΠΎΠΊΠ° Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡ: 0 Π±Π°ΠΉΡ Π² 0 Π±Π»ΠΎΠΊΠ΅.
==2292== ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΎ: 0 Π±Π°ΠΉΡ Π² 0 Π±Π»ΠΎΠΊΠ΅.
==2292== ΠΠΎΡΡΠΈΠΆΠΈΠΌΡΠ΅ Π±Π»ΠΎΠΊΠΈ (Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ) Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ.
==2292== Π§ΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΈΡ , Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Ρ: --show-reachable=yes
ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Valgrind Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΄Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΡΠ²ΠΎΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Valgrind ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΌΡΠ»ΡΡΠΎΡ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² Π½Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. Π’ΠΎΡΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ Valgrind Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΡΡ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.