Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΈ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³ΠΈΡ .
15.5.2.1. GNU/Linux mtrace
Π‘ΠΈΡΡΠ΅ΠΌΡ GNU/Linux, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ GLIBC, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
#include <mcheck.h> /* GLIBC */
void mtrace(void);
void muntrace(void);
ΠΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ mtrace(), Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ MALLOC_TRACE. ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» (ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ). ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ (ΠΡΠ»ΠΈ ΡΠ°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ, Π·Π°ΠΏΠΈΡΡ Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ. Π€Π°ΠΉΠ» ΡΡΠ΅Π·Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.) ΠΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ muntrace(), Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ; Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π²ΡΠ΅. (ΠΡ Π½Π°ΡΠ»ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΆΡΡΠ½Π°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½Π°ΡΠ°Π»Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΡΠ΅, Π½ΠΎ ΡΡΠ° ΡΡ Π΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π³ΠΈΠ±ΠΊΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΎΡΠΎΡΠΎ ΠΈΠΌΠ΅ΡΡ.)
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ mtrace Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ°ΠΉΠ»Π° ΠΆΡΡΠ½Π°Π»Π°. (Π€Π°ΠΉΠ» ΠΆΡΡΠ½Π°Π»Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ASCII, Π½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ.) ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, gawk Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° TIDYMEM:
$ export TIDYMEM=1 MALLOC_TRACE=trace.out /* ΠΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ */
$ ./gawk 'BEGIN { print "hello, world" }' /* ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
hello, world
$ mtrace ./gawk mtrace.out /* Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΡΡΠ΅Ρ */
Memory not freed:
-----------------
Address Size Caller
0x08085858 0x20 at /home/arnold/Gnu/gawk/gawk-3.1.3/main.c:1102
0x08085880 0xc80 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:398
0x08086508 0x2 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086518 0x6 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086528 0x10 at /home/arnold/Gnu/gawk/gawk-3.1.3/eval.c:2082
0x08086550 0x3 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.Ρ:337
0x08086560 0x3 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x080865e0 0x4 at /home/arnold/Gnu/gawk/gawk-3.1.3/field.c:76
0x08086670 0x78 at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1369
0x08086700 0xe at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086718 0x1f at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1259
ΠΡΠ²ΠΎΠ΄ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠ΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ gawk Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ. ΠΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π·Π΄Π΅ΡΡ ΡΠ»ΡΡΠ°ΠΈ ΡΠ²Π»ΡΡΡΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡΠΌΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π°.
15.5.2.2. Electric Fence
Π ΡΠ°Π·Π΄Π΅Π»Π΅ 3.1 Β«ΠΠ΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Linux/UnixΒ» ΠΌΡ ΠΎΠΏΠΈΡΠ°Π»ΠΈ, ΠΊΠ°ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ°ΠΌΡΡΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΠ· ΠΊΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΈ ΠΈ ΡΠΎΠΊΡΠ°ΡΠ°ΡΡΡΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² brk() ΠΈΠ»ΠΈ sbrk(), ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 3.2.3 Β«Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ: brk() ΠΈ sbrk()Β»).
ΠΡ, ΠΊΠ°ΡΡΠΈΠ½Π°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ°ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ»ΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠΎΠ»Π΅Π΅ ΡΠ°Π·Π²ΠΈΡΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ (Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅, Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΌΠ΅ΠΆΠ½ΡΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΈ malloc() ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠΈ. ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΡΠΎΠΉ ΡΡ Π΅ΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΡΡΠΈΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ², Π³Π΅Π½Π΅ΡΠΈΡΡΡ ΡΠΈΠ³Π½Π°Π» SIGSEGV. ΠΡΠ° ΡΡ Π΅ΠΌΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΡΠΈΡ. 15.1.
Π ΠΈΡ. 15.1. ΠΠ΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Linux/Unix, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ
ΠΠ΅ΡΠ²ΡΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π²ΡΠΈΠΌ ΡΡΡ ΡΡ Π΅ΠΌΡ, Π±ΡΠ» Electric Fence. Electric Fence ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΌ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π»Π΅ΠΌ Π΄Π»Ρ malloc() ΠΈ Π΄Ρ. ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Unix ΠΈ GNU/Linux; ΠΎΠ½ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Ρ FTP Π°ΡΡ ΠΈΠ²Π° Π΅Π³ΠΎ Π°Π²ΡΠΎΡΠΎΠ².[178] ΠΠ½ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π°ΠΌΠΈ GNU/Linux, Ρ ΠΎΡΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΠ±ΡΠ°ΡΡ Π΅Ρ ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Electric Fence Π»ΡΠ±ΠΎΠΉ Π΄ΠΎΡΡΡΠΏ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ SIGSEGV. Electric Fence ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΆΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΡ ΠΏΡΠΎΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΎΠ±Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
1 /* ch15-badmem1.Ρ --- ΠΏΠ»ΠΎΡ ΠΎ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ Ρ ΠΏΠ°ΠΌΡΡΡΡ */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 int main(int argc, char **argv)
7 {
8 char *p;
9 int i;
10
11 p = malloc(30);
12
13 strcpy(p, "not 30 bytes");
14 printf("p = <%s>\n", p);
15
16 if (argc ==2) {
17 if (strcmp(argv[1], "-b") == 0)
18 p[42] = 'a'; /* ΠΊΠΎΡΠ½ΡΡΡΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π³ΡΠ°Π½ΠΈΡΡ */
19 else if (strcmp(argv[1], "-f") == 0) {
20 free(p); /* ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ, Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ */
21 p[0] = 'b';
22 }
23 }
24
25 /* ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ (p); */
26
27 return 0;
28 }
ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΏΠ»ΠΎΡ ΠΎ: -b Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π·Π° Π΅Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ, Π° -f ΠΏΡΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ. (Π‘ΡΡΠΎΠΊΠΈ 18 ΠΈ 21 ΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ.) ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π±Π΅Π· ΠΎΠΏΡΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ (ΡΡΡΠΎΠΊΠ° 25), Electric Fence Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Electric Fence, ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Unix ΠΈ GNU/Linux, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Ρ Π½ΠΈΠΌ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π·Π°ΠΏΡΡΠ΅Π½Π° ΠΈΠ· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°. (ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Electric Fence ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Electric Fence Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ Ρ Π΄Π²ΠΎΠΈΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ Π³ΠΎΡΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ·Π΄Π΅Π»ΠΈΡ.) Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π°Π½Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΎΠ±Π΅ΠΈΡ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ:
$ cc -g ch15-badmem1.c -lefence -ΠΎ ch15-badmem1 /* ΠΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ; ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ */
$ gdb ch15-badmem1 /* ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΈΠ· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° */
GNU gdb 5.3
...
(gdb) run -b /* ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -b */
Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -b
[New Thread 8192 (LWP 28021)]
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens < [email protected]>
p = <not 30 bytes>
Program received signal SIGSBGV, Segmentation fault.
SIGSBGV: GDB prints where
[Switching to Thread 8192 (LWP 28021)]
0x080485b6 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:18
18 p[42] = 'a'; /* ΠΊΠΎΡΠ½ΡΡΡΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π³ΡΠ°Π½ΠΈΡΡ */
(gdb) run -f /* Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ -f */
The program being debugged has been started already.
Start it from the beginning? (y or n) y /* ΠΠ° */
Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -f
[New Thread 8192 (LWP 28024)]
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens < [email protected]>
p = <not 30 bytes>
Program received signal SIGSEGV, Segmentation fault. /* Π‘Π½ΠΎΠ²Π° SIGSEGV */
[Switching to Thread 8192 (LWP 28024)]
0x080485e8 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:21
21 p[0] = 'b';
ΠΠ° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ LD_PRELOAD (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π½Π° GNU/Linux), Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ efence. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ef ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ.
Π₯ΠΎΡΡ ΠΌΡ Π½Π΅ ΠΎΠΏΠΈΡΠ°Π»ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, GNU/Linux (ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Unix) ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ (shared) Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΡΠΎΠ±ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Π½Π° Π΄ΠΈΡΠΊΠ΅, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΊΠΎΠ½ΠΎΠΌΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΊΠΎΠΏΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ»Π°ΡΠΎΠΉ Π·Π° ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π΄ΡΡΠ³ ΠΊ Π΄ΡΡΠ³Ρ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. (ΠΠ±ΡΡΠ½ΠΎ ΡΡΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π΄Π»Ρ Π²Π°Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.)
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ LD_PRELOAD Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ (ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π² ΠΏΠ°ΠΌΡΡΡ) ΡΠ²ΡΠ·Π°ΡΡΡΡ ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π΄ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ. Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ ef ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ Π½Π°Π±ΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ malloc() Π² Electric Fence.[179] Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΠΎΠ²ΡΠΎΡΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡΠΆΠ½Π°. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ef:
$ cc -g ch15-badmem1.c -ΠΎ ch15-badmem1 /* ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ */
$ ef ch15-badmem1 -b /* ΠΠ°ΠΏΡΡΡΠΈΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ef, ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄Π°ΠΌΠΏ ΡΠ΄ΡΠ° */
Electric Fence 2.2.0 Copyright (Π‘) 1987-1999 Bruce Perens < [email protected]>