...ΠΠ° ΡΡΠΎΡ ΡΠ°Π· Π² ΠΎΡΡΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ Π±ΡΠ»Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½Π° Π² ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΡΡΠΎ Π²ΡΠ·ΠΎΠ²
free()ch15-badmem1.cΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π±Π΅Π· ΠΎΠΏΡΠΈΠΉ
ch15-badmem1.cleak-check=yes$ <b>valgrind --leak-check=yes ch15-badmem1</b>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 118 ==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.c1 Β /* ch15-badmem3.c --- ΠΏΠ»ΠΎΡ
ΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ Ρ Π½Π΅Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ */23 Β #include <stdio.h>4 Β #include <stdlib.h>56 Β int main(int argc, char **argv)7 Β {8 Β int a_var; /* ΠΠ±Π΅ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ */9Β Β int b_var;1011 Β /* Valgrind Π½Π΅ ΠΎΡΠΌΠ΅ΡΠΈΡ ΡΡΠΎ; ΡΠΌ. ΡΠ΅ΠΊΡΡ. */12 Β a_var = b_var;1314Β /* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ; ΡΡΠΎ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ. */15 Β printf("a_var = %d\n", a_var);1617 Β 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_varb_varmemcheck_IO_vfprintf_internal()Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ ΠΎΡΡ Valgrind ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ Π±ΠΈΡΠΎΠ², ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΡΠ°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . (Valgrind ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π³ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΡΠ°ΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΡΡ ΠΏΠ°ΠΌΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π½Π°Π΅Ρ ΠΎ Π½Π°ΡΠ°Π»Π΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.)
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Valgrind ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π² ΡΠ°ΠΊΠΈΡ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ , ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΠΊΠ°ΠΊ KDE 3, OpenOffice ΠΈ Π²Π΅Π±-Π±ΡΠ°ΡΠ·Π΅Ρ Konqueror. ΠΠ½ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΠ΅Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ, Π° Π΄ΡΡΠ³Π°Ρ Π΅Π³ΠΎ Π²Π΅ΡΡΠΈΡ Π±ΡΠ»Π° Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° (ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΡΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ WINE [182]) Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π΄Π»Ρ Microsoft Windows Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Visual Π‘++! ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Valgrind Ρ Π΅Π³ΠΎ Π²Π΅Π±-ΡΠ°ΠΉΡΠ° [183].