Кіріспе

Компьютерлік бағдарламалардың мінез-құлқын талдау процесі

Компьютерлік ғылымда бағдарламалық талдау – компьютерлік бағдарламалардың дұрыстығы, беріктігі, қауіпсіздігі және жұмысқа қабілеттілігі сияқты қасиеттеріне қатысты мінез-құлқын автоматты түрде талдау процесі. Бағдарламалық талдау екі негізгі салаға бағытталған: бағдарламаны оңтайландыру және бағдарламаның дұрыстығын тексеру. Біріншісі бағдарламаның өнімділігін жақсартуға және ресурстарды аз қолдануға, ал екіншісі бағдарламаның күтілгендей жұмыс істеуін қамтамасыз етуге бағытталған. Бағдарламалық талдау бағдарламаны іске қоспай (статикалық бағдарламалық талдау), жұмыс істеп тұрғанда (динамикалық бағдарламалық талдау) немесе екеуінің де комбинациясы арқылы жүзеге асырылуы мүмкін.

Статикалық бағдарламалық талдау

Бағдарламаның дұрыстығын қамтамасыз ету үшін статикалық талдау бағдарламаның даму кезеңінде осал жерлерді анықтауға мүмкіндік береді. Бұл осалдықтарды түзету сынақ кезеңінде анықталғандарға қарағанда оңай, өйткені статикалық талдау осалдықтың түп-тамырына жетелейді. Статикалық талдаудың көптеген түрлері есептеулік тұрғыдан шешілмейтіндіктен, оны жүзеге асыру механизмдері әрқашан дұрыс жауаппен аяқталмайды, себебі олар кейде жалған теріс ("проблемалар табылмады" – кодта шындығында проблемалар болған кезде) немесе жалған оңды нәтиже береді, немесе ешқашан дұрыс жауап бермейді, бірақ кейде аяқталмайды. Олардың шектеулілігіне қарамастан, бірінші типтегі механизмдер осалдықтардың санын азайтуға мүмкіндік береді, ал екіншісі кейде осалдықтардың белгілі бір класының жоқтығына берік кепілдік беруі мүмкін. Дұрыс емес оптимизациялар жолсыз. Сондықтан, бағдарламаны оңтайландыру контекстінде есептеулік тұрғыдан шешілмейтін талдауды басқарудың екі негізгі стратегиясы бар: салыстырмалы түрде қысқа уақыт ішінде аяқталуы күтілетін оптимизатор, мысалы, оңтайландырушы компилятордағы оптимизатор, шекті уақыт ішінде аяқталуы кепілдік берілген және тек дұрыс оптимизацияларды табуға кепілдік берілген талдаудың қысқартылған нұсқасын пайдалана алады. Үшінші тараптың оңтайландыру құралы дұрыс емес оптимизацияны ешқашан жасамайтын, сонымен қатар кейбір жағдайларда оны тапқанға дейін шексіз жалғастыра алатын (бірақ бұл ешқашан орын алмауы мүмкін) етіп жүзеге асырылуы мүмкін. Мұндай жағдайда, құралды пайдаланатын әзірлеуші құралды тоқтатып, осы кодқа қатысты құралды қайта іске қосудан аулақ болуы керек (немесе құралдың қате жұмыс істеуіне себеп болмас үшін кодты өзгертуі керек). Дегенмен, толыққанды спецификацияланбаған тілдер үшін, мысалы C үшін қолданылатын үшінші стратегия да бар. Оңтайландырушы компилятор, егер ол тіл стандартында семантикасы анықталмаған бастапқы кодты кездестірсе, тіпті құлап қалуы мүмкін, кез келген нәрсені жасайтын кодты жасауға құқылы.

Бақылау ағыны

Басқару ағынын талдаудың мақсаты – бағдарлама орындалу барысында әртүрлі жерлерде қандай функцияларды шақыруға болатыны туралы ақпарат алу. Жиналған ақпарат бақылау ағыны графигі (CFG) арқылы көрсетіледі, онда түйіндер бағдарламаның нұсқаулары, ал қабырғалар бақылау ағынын білдіреді. Код блоктары мен циклдарды анықтау арқылы CFG компилятор жасаған оңтайландырулардың бастапқы нүктесіне айналады.

Деректер ағынын талдау

Деректер ағынын талдау – бағдарламаның кез келген нүктесіндегі мәндер туралы және олардың уақыт өте қалай өзгеретіні туралы ақпарат жинауға бағытталған техника. Бұл техника компиляторлардың кодты оңтайландыруы үшін жиі қолданылады. Деректер ағынын талдаудың ең белгілі мысалы – ластануды тексеру, ол пайдаланушы берген деректерді қамтитын барлық айнымалыларды "ластанған" деп қарастырудан және олар тазартылғанға дейін осы айнымалыларды пайдалануға жол бермеуден тұрады. Бұл техника көбінесе SQL инъекциясы шабуылдарының алдын алу үшін қолданылады. Ластануды тексеру статикалық немесе динамикалық түрде жүзеге асырылуы мүмкін.

Абстрактілік түсіндірме

Абстрактілік интерпретация бағдарламаны нақты орындамай, оның мүмкін болатын орындалуы туралы мәліметтерді алуға мүмкіндік береді. Бұл мәліметтер компиляторларға мүмкін болатын оптимизацияларды табуға немесе бағдарламаны белгілі бір қателер класына қарсы растауға пайда болады.

Жүйелер түрінің

Типтік жүйелер белгілі бір талаптарды орындайтын бағдарламаларға типтерді байланыстырады. Олардың мақсаты – белгілі бір қасиетке сәйкес дұрыс деп есептелетін тілдің бағдарламаларының ішкі жиынын таңдау. Типті тексеру – бағдарламаның типтік жүйеге қабылдануын растау. Типті тексеру бағдарламалауда бағдарламалау объектілерінің қалай қолданылатынын және олардың не істей алатынын шектеу үшін пайдаланылады. Бұл компилятор немесе интерпретатор арқылы жүзеге асырылады. Типті тексеру, сондай-ақ, қол қойылған (signed) мәннің қол қоймаған (unsigned) айнымалыға тағайындалмауын қамтамасыз ету арқылы қауіпсіздік бұзушылықтарын (vulnerabilities) алдын алуға көмектеседі. Типті тексеру статикалық (компиляция кезінде), динамикалық (орындалу кезінде) немесе олардың комбинациясы арқылы жасалуы мүмкін. Статикалық типтік ақпарат (көздік кодтағы типтік белгілер арқылы анықталған немесе тікелей берілген) оптимизациялау үшін де қолданылуы мүмкін, мысалы, қорапталған массивтерді қорапталмаған массивтерге ауыстыру үшін.

Эффект жүйелері

Эффекті жүйелер – функция немесе әдіс орындалғанда туындайтын әсерлерді бейнелеуге арналған формалды жүйелер. Эффект не істеліп жатқанын және немен істеліп жатқанын жазады, олар тиісінше эффект түрі және эффект аймағы деп аталады.

Үлгілерді тексеру

Модельді тексеру – бұл модельдің (бұл жағдайда кодтың формалды үлгісі, ал басқа жағдайларда ол аппараттың үлгісі болуы мүмкін) белгілі бір талаптарға сәйкес келетінін қатаң, формалды және автоматтандырылған түрде тексерудің әдісі. Кодтың өзінің шекті күйге ие болуы және талаптар мен кодты логикалық формулаларға түрлендіруге болатындықтан, жүйенің талаптарды бұзатынын тиімді алгоритмдік әдістер арқылы тексеру мүмкін.

Динамикалық бағдарламаны талдау

Динамикалық талдау бағдарламаның жұмыс істеу кезіндегі ақпаратын талдаудың нақтылығын арттыруға мүмкіндік береді, сонымен қатар жұмыс істеу кезінде қорғауды қамтамасыз етеді, бірақ ол тек мәселенің бір рет орындалуын талдай алады және жұмыс істеу кезіндегі тексерулердің нәтижесінде бағдарламаның жылдамдығын төмендетуі мүмкін.

Сынау

Бағдарламалық жасақтаманың сапасын, сенімді жұмыс істеуін және оныңмен бірге жұмыс істейтін басқа бағдарламалық жасақтамалармен келіспеушіліктер тудырмауын қамтамасыз ету үшін оны тексеру қажет. Тестілеу бағдарламаны кіріс деректерімен іске қосу және оның әрекеттерін және нәтижесін бағалау арқылы жүзеге асырылады. Егер қауіпсіздік талаптары нақты көрсетілмесе де, бағдарламалық жасақтамаға зиян келтіріп, ақпаратты ұрлап алуға, оның қалыпты жұмысын тоқтатуға немесе оны пайдаланушыларға қарсы шабуыл үшін пайдалануға ешкімнің мүмкіндігі болмайтынына көз жеткізу үшін қосымша қауіпсіздік тестілеуі жүргізілуі тиіс.

Бақылау

Бағдарламаны бақылау бағдарлама туралы түрлі ақпаратты, мысалы, ресурстарды қолдану, оқиғалар және өзара әрекеттесулерді жазады, осылайша оның қалыпты емес мінез-құлқының себептерін табуға немесе нақты анықтауға болады. Бұдан әрі, бұл қауіпсіздік аудитін жүргізу үшін қолданылуы мүмкін. Бағдарламалардың автоматты мониторингісі кейде орындалу кезіндегі тексеру деп аталады.

Бағдарламаны кесу

Бағдарламаның мінез-құлқының белгілі бір ішкі жиыны үшін, бағдарламаны кесу – таңдалған мінез-құлқыны сақтайтын бағдарламаны ең минималды түрге дейін азайтудан тұрады. Азайтылған бағдарлама "кесінді" деп аталады және ол көрсетілген мінез-құлқы жиынының саласында бастапқы бағдарламаның нақты бейнесі болып табылады. Көбінесе, кесіндіні табу шешілмейтін мәселе, бірақ мақсатты мінез-құлқы жиынын айнымалылар жиынының мәндері арқылы анықтау арқылы, дерек ағыны алгоритмін қолданып, шамамен кесінділер алуға болады. Бұл кесінділерді әдетте бағдарламашылар қателердің бастауын анықтау үшін жөндеу кезінде пайдаланады.