ΠΠ±ΡΡΠ½ΠΎ Π±Π»ΠΎΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ Π²ΡΠ΄Π΅Π»ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ malloc ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΈ Π½Π΅Ρ Π΄ΡΡΠ³ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΡ Π½Π° Π±Π»ΠΎΠΊ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΠ½ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ. ΠΡΠΎ ΡΡΠ΅ΡΠΊΠ° ΠΏΠ°ΠΌΡΡΠΈ, Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠ΅ΡΡΠ΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΡΠ½ΠΈΠ·ΠΈΡΡΡ, ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΉΠ΄Π΅Ρ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΡΠ»ΠΈ Π²Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ Π² ΠΎΠ±Π»Π°ΡΡΡ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠ½ΡΠ° Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ Π±Π»ΠΎΠΊΠ°), Π²Ρ Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π΄ΠΎΠ»Π΅ΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ malloc, ΡΠ»Π΅Π΄ΡΡΠ΅ΠΉ Π·Π° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠ·ΠΎΠ² malloc ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ free ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΈ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΠ±ΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π·Π°Π΄ΠΎΠ»Π³ΠΎ Π΄ΠΎ ΡΠΎΠ±ΡΡΠΈΡ, Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠ΅ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠ΅ ΠΈ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠ΅ ΠΏΠΎΠΌΠΎΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠΈΠΏΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ malloc ΠΈ free, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΡΡΠ°ΡΡΡΡ ΡΡΠ΅ΡΡΡ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠΏΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ.
ElectricFence
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ElectricFence Π±ΡΠ»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π° ΠΡΡΡΠΎΠΌ ΠΠ΅ΡΠ΅Π½ΡΠΎΠΌ (Bruce Perens). ΠΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°Ρ Linux, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Red Hat (Enterprise ΠΈ Fedora), SUSE ΠΈ openSUSE, ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅. ΠΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Linux Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ malloc ΠΈ free, ΠΈ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.3.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.3. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ElectricFenceΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° efence.c, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ malloc ΠΈ ΠΏΠΈΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΎΠΌ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. ΠΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ Π½Π΅ΠΉ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ.
#include <stdio.h>
#include <stdlib.h>
int main() {
char *ptr = (char *)malloc(1024);
ptr[0] = 0;
/* Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΈΡΠ΅Ρ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ Π±Π»ΠΎΠΊΠ° */
ptr[1024] = 0;
exit(0);
}
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΠ΅ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ Π½Π΅ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½Π°Ρ malloc, ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½Π°, ΠΈ Π²Ρ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΏΠΎΠΏΠ°Π΄Π΅ΡΠ΅ Π² Π±Π΅Π΄Ρ.
$ cc -ΠΎ efence efence.Ρ
$ ./efence
$
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ Π²Ρ Π²ΠΎΠ·ΡΠΌΠ΅ΡΠ΅ ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΡΠΉΡΠ΅ Π΅Π΅ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ElectricFence (libefence.a), ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΠΎΡΠΊΠ»ΠΈΠΊ:
$ cc -ΠΎ efence efence.Ρ -lefence
$ ./efence
Electric Fence 2.2.0 Copyright (Π‘) 1987-1999 Bruce Perens < [email protected]>
Segmentation fault
$
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ;
$ cc -g -ΠΎ efence efence.Ρ -lefence
$ gdb efence
(gdb) run
Starting program: /home/neil/BLP4e/chapter10/efence
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens [email protected]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 1869)]
0x08048512 in main () at efence.c:10
10 ptr[1024] = 0;
(gdb)
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ElectricFence Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ malloc ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π½Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠΈΠΌΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ Π½Π΅ΡΠ°Π½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΡΠΈΠ³Π½Π°Π» Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ.
valgrind
Π‘ΡΠ΅Π΄ΡΡΠ²ΠΎ valgrind ΡΠΏΠΎΡΠΎΠ±Π½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠΈΡ ΡΡ Π½Π°ΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ (ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.4). ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ½ΠΎ ΡΠΌΠ΅Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ°, ΠΊ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΈ ΡΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² Π²Π°Ρ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² Linux, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π½Π° Web-ΡΠ°ΠΉΡΠ΅ http://valgrind.org.
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ valgrind Π΄Π°ΠΆΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π² Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΉΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠ°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ; ΠΎΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°Ρ , Π²ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ΅Π΄Ρ KDE Π²Π΅ΡΡΠΈΠΈ 3.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.4. Π‘ΡΠ΅Π΄ΡΡΠ²ΠΎ valgrindΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° checker.c, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠΈΡΠ°Π΅Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΊΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π°Π΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΡΠ°ΡΡΠΎΠΊ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ.
#include <stdio.h>
#include <stdlib.h>
int main() {
char *ptr = (char *)malloc(1024);
char ch;
/* ΠΠ΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ */
ch = ptr[1024];
/* ΠΠ°ΠΏΠΈΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π±Π»ΠΎΠΊΠ° */
ptr[1024] = 0;
/* ΠΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠ° */
ptr = 0;
exit(0);
}
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ valgrind Π²Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ valgrind, ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ ΠΎΠΏΡΠΈΠΈ, Π·Π°Π΄Π°ΡΡΠΈΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π²ΠΈΠ΄Ρ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΠΈ Π΄Π°Π»Π΅Π΅ ΡΠΊΠ°Π·Π°Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Ρ Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ (Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ Π΅ΡΡΡ).
ΠΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ valgrind Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
$ valgrind --leak-check=yes -v ./checker
==4780== Memcheck, a memory error detector.
==4780== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==4780== Using LibVEX rev 1732, a library for dynamic binary translation.
==4780== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==4780== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==4780== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==4780==
--4780-- Command line
--4780-- ./checker
--4780-- Startup, with flags:
--4780-- --leak-check=yes
--4780-- -v
--4780-- Contents of /Ρroc/version:
--4780-- Linux version 2-6.20.2-2-default ( [email protected]) (gcc version 4.1.3 20070218 (prerelease) (SUSE Linux)) #1 SMP Fri Mar 9 21:54:10 UTC 2007
--4780-- Arch and hwcaps: X86, x86-sse1-sse2
--4780-- Page sizes: currently 4096, max supported 4096
--4780-- Valgrind library directory: /usr/lib/valgrind
--4780-- Reading syms from /lib/ld-2.5.so (0x4000000)
--4780-- Reading syms from /home/neil/BLP4e/chapter10/checker (0x8048000)
--4780-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000)
--4780-- object doesn't have a symbol table
--4780-- object doesn't have a dynamic symbol table
--4780-- Reading suppressions file: /usr/lib/valgrind/default.supp
--4780-- REDIR: 0x40158B0 (index) redirected to 0x38027EDB (???)
--4780-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x401E000)
--4780-- object doesn't have a symbol table
--4780-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x4021000)
--4780-- object doesn't have a symbol table
==4780= WARNING: new redirection conflicts with existing -- ignoring it
--4780-- new: 0x040158B0 (index ) R-> 0x04024490 index
--4780-- REDIR: 0x4015A50 (strlen) redirected to 0x4024540 (strlen)
--4780-- Reading syms from /lib/libc-2.5.so (0x4043000)
--4780-- REDIR: 0x40ADFF0 (rindex) redirected to 0x4024370 (rindex)
--4780-- REDIR: 0x40AAF00 (malloc) redirected to 0x4023700 (malloc)
==4780== Invalid read of size 1
==4780== at 0x804842C: main (checker.Ρ: 10)
==4780== Address 0x4170428 is 0 bytes after a block of size 1,024 alloc'd
==4780== at 0x4023785: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==4780== by 0x8048420: main (checker.c: 6)
=4780=
==4780== Invalid write of size 1
==4780== at 0x804843A: main (checker.Ρ: 13)
==4780== Address 0x4170428 is 0 bytes after a block of size 1,024 alloc'd
==4780== at 0x4 023785: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==4780== by 0x8048420: main (checker.c: 6)
--4780-- REDIR: 0x40A8BB0 (free) redirected to 0x402331A (free)
--4780-- REDIR: 0x40AEE70 (memset) redirected to 0x40248A0 (memset)
==4780==
==4780== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 3 from 1)
==4780==
==4780== 1 errors in context 1 of 2:
==4780== Invalid write of size 1
==4780== at 0x804843A: main (checker.Ρ: 13)
==4780== Address 0x4170428 is 0 bytes after a block of size 1,024 alloc'd
==4780== at 0x4023785: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==4780== by 0x80484 20: main (checker.c: 6)
==4780==
==4780== 1 errors in context 2 of 2:
==4780== Invalid read of size 1
==4780== at 0x804842C: main (checker.c:10)
==4780== Address 0x4170428 is 0-bytes after a block of size 1,024 alloc'd
==4780== at 0x4023785: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==4780== by 0x8048420: main (checker.Ρ: 6)
--4780--
--4780-- supp: 3 dl-hack3
==4780==
==4780== IN SUMMARY: 2 errors from 2 contexts (suppressed: 3 from 1)
==4780==
==4780== malloc/free: in use at exit: 1,024 bytes in 1 blocks.
==4780== malloc/free: 1 allocs, 0 frees, 1,024 bytes allocated.
==4780==
==4780== searching for pointers to 1 not-freed blocks.
==4780== checked 65,444 bytes.
==4780==
==4780==
==4780== 1,024 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4780== at 0x4023785: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==4780== by 0x8048420: main (checker.c: 6)
==4780==
==4780== LEAK SUMMARY:
==4780== definitely lost: 1,024 bytes in 1 blocks.
==4780== possibly lost: 0 bytes in 0 blocks.