Π.2.5. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Electric Fence
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Electric Fence, Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΡΡΡΠΎΠΌ ΠΠ΅ΡΠ΅Π½Π·ΠΎΠΌ (Bruce Perens), ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅, Π³Π΄Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π²ΡΡΠ²ΠΈΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π²Ρ ΠΎΠ΄ΠΈΡ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² Linux, Π° Π΅Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠ΄Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://www.perens.com/FreeSoftware.
ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ccmalloc, ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Electric Fence:
% gcc -g -Wall -pedantic malloc-use.o -o emalloc-use -lefence
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π ΡΠ»ΡΡΠ°Π΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
% ./emalloc-use 12
Electric Fence 2.0.5 Copyright (C) 1987-1998 Bruce Perens.
Please enter a command a 0 12
Please enter a command r 0 12
Segmentation fault
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Electric Fence Π²ΡΡΠ²Π»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π½Π°Ρ ΠΎΠ΄ΠΈΠ»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΠ°ΠΌ, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ Π½Π°ΡΠ°Π»Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, Π²Π²Π΅Π΄ΠΈΡΠ΅ ΡΠ°ΠΊΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
% export EF_PROTECT_BELOW=1
Π§ΡΠΎΠ±Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π»Π° Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡΠΌ ΠΎΠ±Π»Π°ΡΡΡΠΌ, Π·Π°Π΄Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ EF_PROTECT_FREE ΡΠ°Π²Π½ΠΎΠΉ 1. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π½Π° man-ΡΡΡΠ°Π½ΠΈΡΠ΅ libefence.
Π‘ ΡΠ΅Π»ΡΡ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Electric Fence Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π΄Π²Π΅ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½Π΅Ρ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΊΠΎΠ½Π΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡΡ ΠΎΠ΄ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΠ±Π»Π°ΡΡΠΈ, Ρ.Π΅. ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅, Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ EF_PROTECT_BELOW ΡΠ°Π²Π½Π° 1, Π½Π°ΡΠ°Π»ΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ Π½Π°ΡΠ°Π»Ρ Π²ΡΠΎΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ. Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ malloc() Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π²ΡΡ ΡΡΡΠ°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Electric Fence ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅.
Π.2.6. ΠΡΠ±ΠΎΡ ΡΡΠ΅Π΄ΡΡΠ² ΠΎΡΠ»Π°Π΄ΠΊΠΈ
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠ΅ΡΡΡΠ΅ ΡΠ°Π·Π½ΡΡ , Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠ΅Π΄ΡΡΠ² Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΎΡΠΈΠ±ΠΎΠΊ, Π½ΠΎ ΡΡΠΎ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ. Π§ΡΠΎΠ±Ρ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΠΏΠΎΠΈΡΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ, Π²ΡΠ΄Π΅Π»ΠΈΡΠ΅ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°Π±ΠΎΡΠ° Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ. ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΈΡΠ΅ΡΡΡ Π½Π° C++, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ»Π°ΡΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΉ Π²ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ ΠΏΠΎΡΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΏΠ°ΠΌΡΡΡ. Π’Π΅ΡΡΠΈΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π° Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ.
ΠΠ°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΈΠ· ΡΠ΅ΡΡΡΠ΅Ρ ΡΡΠ΅Π΄ΡΡΠ² Π²ΡΠ±ΡΠ°ΡΡ? ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π·Π°Π±ΡΠ²Π°ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π° Π½Π°ΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ°ΠΏΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π»ΡΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ mtrace. ΠΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π° Π²ΠΎ Π²ΡΠ΅Ρ Linux-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΈ Ρ ΠΎΡΠΎΡΠΎ ΡΠ΅Π±Ρ Π·Π°ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»Π°. ΠΡΠΎΠΉΠ΄Ρ Π΄Π°Π½Π½ΡΡ ΡΠ°Π·Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΡΠΈΠ»ΠΈΡΠΎΠΉ Electric Fence Π΄Π»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ. Π‘Π²ΡΠ·ΠΊΠ° Π΄Π²ΡΡ ΡΡΠΈΡ ΡΡΠΈΠ»ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΉΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ.
Π.2.7. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΡΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΡΠ»ΠΎ Π΄Π°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Π.2.1, "ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ".
ΠΠΈΡΡΠΈΠ½Π³ Π.2. (malloc-use.c) ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ/* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ. */
/* ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ
ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΡΠΎΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ
Π½Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ) Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π±ΡΡΠ΅ΡΡ ΠΏΠ°ΠΌΡΡΠΈ.
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ
ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ -- Π° <ΠΈΠ½Π΄Π΅ΠΊΡ> <ΡΠ°Π·ΠΌΠ΅Ρ_Π±ΡΡΠ΅ΡΠ°>
ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ -- d <ΠΈΠ½Π΄Π΅ΠΊΡ>
ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ -- r <ΠΈΠ½Π΄Π΅ΠΊΡ> <ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅>
Π·Π°ΠΏΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΡ -- w <ΠΈΠ½Π΄Π΅ΠΊΡ> <ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅>
Π²ΡΡ ΠΎΠ΄ -- q
ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Π΄ΠΎΡΡΡΠΏΠ°
ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π»Π΅ΠΆΠΈΡ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅. */
#ifdef MTRACE
#include <mcheck.h>
#endif /* MTRACE */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/* ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. */
void allocate(char** array, size_t size) {
*array = malloc(size);
}
/* ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ. */
void deallocate(char** array) {
free((void*)*array);
}
/* Π§ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ. */
void read_from_memory(char* array, int position) {
volatile char character = array[position];
}
/* ΠΠ°ΠΏΠΈΡΡ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ΅ΠΉΠΊΡ ΠΏΠ°ΠΌΡΡΠΈ. */
void write_to_memory(char* array, int position) {
array[position] = 'a';
}
int main{int argc, char* argv[]) {
char** array;
unsigned array_size;
char command[32];
unsigned array_index;
char command_letter;
int size_or_position;
int error = 0;
#ifdef MTRACE
mtrace();
#endif /* MTRACE */
if (argc != 2) {
fprintf(stderr, "%s: array-size\n", argv[0]);
return 1;
}
array_size = strtoul(argv[1], 0, 0);
array = (char**)calloc(array_size, sizeof(char*));
assert(array != 0);
/* ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄. */
while (!error) {
printf("Please enter a command: ");
command_letter = getchar();
assert(command_letter != EOF);
switch (command_letter) {
case 'a':
fgets(command, sizeof(command), stdin);
if (sscanf(command, "%u %i", &array_index,
&size_or_position) == 2 &&
array_index < array_size)
allocate(&(array[array_index]), size_or_position);
else
error = 1;
break;
case 'd':
fgets(command, sizeof(command), stdin);
if (sscanf(command, "%u", &array_index) == 1 &&
array_index < array_size)
deallocate(&(array[array_index]));
else
error = 1;
break;
case 'r':
fgets(command, sizeof(command), stdin);
if (sscanf(command, "%u %i", &array_index,
&size_or_position) == 2 &&
array_index < array_size)
read_from_memory(array[array_index], size_or_position);
else
error = 1;
break;
case 'w':
fgets(command, sizeof(command), stdin);
if (sscanf(command, "%u %i", &array_index,
&size_or_position) == 2 &&
array_index < array_size)
write_to_memory(array[array_index], size_or_position);
else
error = 1;
break;
case 'q':
free((void*)array);
return 0;
default:
error = 1;
}
}
free((void*)array);
return 1;
}
A.3. ΠΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΊΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , Π½Π°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΎΡΠ°ΠΉΠ»Π΅Ρ gprof ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ΅Π±ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΠ²Π»ΡΡΡΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°ΠΌΠΈ Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠΌΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ.
1. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΡΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
2. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΡΠΎΠ±Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠΈΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
3. ΠΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ gprof Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΡΠΈΠ»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
Π.3.1. ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ
ΠΠ»Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠ΅ΠΉΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ- ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π·Π°ΡΡΠ°Π²ΠΈΠΌ Π΅Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ½Π°ΡΠ½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ, ΡΠ΅Π³ΠΎ Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°Ρ . ΠΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΠ»ΠΎ 1 β ΡΡΠΎ "x", 2 β "xx", 3 β "xxx" ΠΈ Ρ.Π΄. ΠΠΌΠ΅ΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² "x" ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ»Π°. Π ΡΠ°ΠΉΠ»Π΅ number.c ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΈΡΠ»ΠΎ 0, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΊ ΡΠΈΡΠ»Ρ, Π²ΡΡΠΈΡΠ°ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΈΠ· ΡΠΈΡΠ»Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ, Π²ΡΡΠΈΡΠ°ΡΡ ΠΈ ΡΠΌΠ½ΠΎΠΆΠ°ΡΡ ΡΠΈΡΠ»Π°. ΠΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΡΡΠΎΠΊΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π² ΡΠ½Π°ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ. ΠΡΡΠ³Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ½Π°ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° int. Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ, Π²ΡΡΠΈΡΠ°Π½ΠΈΠ΅ β ΠΏΡΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ½ΠΈΠΌΠ°Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ, Π° ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΠΏΡΡΠ΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΠΈ even() ΠΈ odd() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ½Π°ΡΠ½ΡΠΉ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠΎΠ³Π΄Π° ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅ΡΠ½ΡΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ½Π°ΡΠ½ΡΠΉ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ Π½ΡΠ»Ρ. ΠΠ±Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΠ»ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ, Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΌΠ΅Π½ΡΡΠ΅Π΅, ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΠ΅ΡΠ½ΡΠΌ.