Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 65

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

А.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() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ эквивалСнт Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… СдинствСнный ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ являСтся соотвСтствСнно Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ числом. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ эквивалСнт нуля. ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎ рСкурсивны. НапримСр, число являСтся Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ, Ссли ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΈΠ»ΠΈ Ссли число, Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ мСньшСС, являСтся Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ.