ElectricFence
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ElectricFence Π±ΡΠ»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π° ΠΡΡΡΠΎΠΌ ΠΠ΅ΡΠ΅Π½ΡΠΎΠΌ (Bruce Perens). ΠΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°Ρ Linux, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Red Hat (Enterprise ΠΈ Fedora), SUSE ΠΈ openSUSE, ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅. ΠΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Linux Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ
mallocfreeΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.3.
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 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$ <b>cc -ΠΎ efence efence.Ρ</b>$ <b>./efence</b>$Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ Π²Ρ Π²ΠΎΠ·ΡΠΌΠ΅ΡΠ΅ ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΡΠΉΡΠ΅ Π΅Π΅ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ElectricFence (libefence.a), ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΠΎΡΠΊΠ»ΠΈΠΊ:
$ <b>cc -ΠΎ efence efence.Ρ -lefence</b>$ <b>./efence</b>Electric Fence 2.2.0 Copyright (Π‘) 1987-1999 Bruce Perens <[email protected]>Segmentation fault$ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΠΌ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ;
$ <b>cc -g -ΠΎ efence efence.Ρ -lefence</b>$ <b>gdb efence</b>(gdb) <b>run</b>Starting program: /home/neil/BLP4e/chapter10/efenceElectric 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:1010Β ptr[1024] = 0;(gdb)ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ElectricFence Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ
mallocvalgrind
Π‘ΡΠ΅Π΄ΡΡΠ²ΠΎ
valgrindΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
valgrindvalgrindΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 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);}ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
valgrindvalgrindΠΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ
valgrind$ <b>valgrind --leak-check=yes -v ./checker</b>==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