Аппараттық және бағдарламалық қамтамасыз етуді орнату

Статикалық талдауды бағдарлама жасауда қолдану. Өнімнің сапасы мен даму тиімділігін арттыру үшін статикалық және динамикалық талдауды пайдалану Код түсінігі зерттеуде талданады

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

Александр Миноженко
Кодты талдау бөлімінің аға ғылыми қызметкері
ERPScan (Цифрлық қауіпсіздіктің еншілес кәсіпорны)

Статикалық кодтық талдау кезінде бағдарлама нақты орындалусыз талданады, ал динамикалық талдауда ол орындалу кезінде орындалады. Көп жағдайда статикалық талдау бастапқы немесе орындалатын кодтың автоматтандырылған құралдарын пайдаланып орындалатын талдауды білдіреді.

Тарихи тұрғыдан алғанда, алғашқы статикалық талдау құралдары (олар жиі өз атауында lint сөзін пайдаланады) бағдарламаның ең қарапайым ақауларын табу үшін пайдаланылды. Олар қарапайым қолтаңбаны іздеуді қолданды, яғни тексерулер базасында бар қолтаңбалармен сәйкестіктерді тапты. Олар әлі күнге дейін пайдаланылады және орындалған кезде бағдарламаның бұзылуына әкелуі мүмкін кодтағы «күдікті» құрылымдарды анықтауға мүмкіндік береді.

Бұл әдістің көптеген кемшіліктері бар. Ең бастысы, кодтағы көптеген «күдікті» құрылымдар әрқашан ақаулар емес. Көп жағдайда мұндай код синтаксистік тұрғыдан дұрыс және дұрыс жұмыс істей алады. «Шудың» нақты ақауларға қатынасы күні 100:1 жетуі мүмкін үлкен жобалар. Осылайша, әзірлеуші ​​оны нақты ақаулардан тазартуға көп уақыт жұмсауы керек, бұл автоматтандырылған іздеудің артықшылықтарын жоққа шығарады.

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

Статикалық талдау құралдарының екінші буыны қарапайым үлгі сәйкестендіруден басқа, бағдарламаларды оңтайландыру үшін компиляторларда бұрын қолданылған талдау технологияларымен жабдықталған. Бұл әдістер бастапқы кодты талдау арқылы бағдарламаның орындалу моделін және кейбір айнымалылардың басқаларға тәуелділік моделін көрсететін басқару ағынының және деректер ағынының графиктерін құрастыруға мүмкіндік берді. Деректерді ескере отырып, графиктерді бағдарламаның қалай орындалатынын анықтау арқылы модельдеуге болады (қандай жолда және қандай деректермен).

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

Талдағыштардың бұл түрінің басты артықшылығы - бағдарламаның орындалуын ішінара имитациялау және күрделірек ақауларды анықтау мүмкіндігіне байланысты «шудың» аз болуы.

Іс-әрекеттегі осалдықтарды табу процесі

Түсіндіру үшін кодты енгізу және SQL инъекциясының осалдықтарын іздеу процесі (1-сурет).

Оларды анықтау үшін бағдарламада сенімсіз деректер келетін орындар бар (2-сурет), мысалы, HTTP протоколының сұрауы.


Листингте (1-сурет) 1 5-жолда деректер веб-парақшаны сұраған кезде пайдаланушылардан келетін HTTP сұрауынан алынады. Мысалы, "http://example.com/main?name =' немесе 1='1" бетіне сұрау кезінде. Жол немесе 1='1 HTTP сұрауын қамтитын сұрау нысанынан деректер айнымалысына түседі.

Келесі 10-жолда алынған жолды өңдейтін деректер аргументі бар Process функциясына шақыру. 12-жолда – алынған деректер жолы мен дерекқор сұрауының конкатенциясы, қазірдің өзінде 15-жолда дерекқор сұрауының функциясы нәтиже сұрауымен шақырылады. Осы манипуляциялар нәтижесінде пішіннің деректер базасына сұраныс алынады: аты='' немесе '1'='1' болатын пайдаланушылардан * таңдаңыз.

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

Статикалық анализаторлар ұқсас жұмыс істейді: олар сенімсіз көзден келетін деректерді белгілейді, деректермен барлық манипуляцияларды бақылайды және деректердің маңызды функцияларға түсетінін анықтауға тырысады. Критикалық функциялар әдетте кодты орындайтын, дерекқор сұрауларын жасайтын, XML құжаттарын өңдейтін, файлдарға қатынасатын және т.б. функцияларды білдіреді, оларда функция параметрін өзгерту құпиялылыққа, тұтастыққа және қолжетімділікке зиян келтіруі мүмкін.

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

Мұндай талдаудың кемшіліктерінің бірі бағдарламаның орындалу жолындағы мәндерді сүзетін немесе тексеретін функцияларды анықтау қиындығы болып табылады. Сондықтан анализаторлардың көпшілігі тіл үшін стандартты жүйелік сүзгілеу функцияларының жиынтығын және мұндай функцияларды өзіңіз анықтау мүмкіндігін қамтиды.

Осалдықтарды автоматтандырылған іздеу

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


Статикалық талдау құралдарының үшінші буынының міндетті функционалдығы туралы ортақ пікір жоқ. Кейбір жеткізушілер деректерге байланысты бағдарламаның орындалу жолын дәл анықтау үшін SMT шешушілерін пайдалана отырып, әзірлеу процесіне неғұрлым тығыз интеграцияны ұсынады.

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

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

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

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

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

Технологияның дамуы жалғасып жатқанына қарамастан, автоматтандырылған құралдар әлі де қолмен код аудитін толығымен алмастыра алмайды. Логикалық, архитектуралық осалдықтар және өнімділік мәселелері сияқты ақаулардың санаттарын тек сарапшы анықтай алады. Дегенмен, құралдар жылдамырақ, процесті автоматтандырады және аудитордың жұмысына қарағанда арзанырақ. Статикалық кодты талдауды жүзеге асырған кезде бастапқы бағалау үшін қолмен тексеруді қолдануға болады, себебі бұл архитектураның күрделі мәселелерін анықтауға мүмкіндік береді. Ақауларды тез жою үшін автоматтандырылған құралдарды пайдалану керек. Мысалы, бағдарламалық құралдың жаңа нұсқасы шыққанда.

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

Сарапшы бағаны

Киберсоғыстар:кибер қарулар

Петр
Ляпин

«НИИ TNN» ЖШС (Транснефть) Ақпараттық қауіпсіздік қызметінің басшысы

Кибер қарулану жарысына қарап, ең алдымен осы саладағы бірқатар іргелі ережелерді түсіну керек.

Біріншіден, соғыс – екі немесе одан да көп мемлекеттер қатысатын халықаралық құбылыс. Соғыс өз заңдарына бағынады. Олардың бірінде: «Соғысушы тараптар жауға зиян келтіру құралдарын таңдауда шексіз құқықты пайдаланбайды» 1 .

Екіншіден, қақтығысушы тараптар соғыс пен бейбітшілік мәселелерін өз бетімен шеше алатын күндер артта қалды. Жаһандану жағдайында соғыс бүкіл халықаралық қауымдастықтың бизнесіне айналады. Оның үстіне тұрақтандырудың жеткілікті тиімді тетігі – БҰҰ Қауіпсіздік Кеңесі бар. Дегенмен, в қазіргі уақыттаоны киберкеңістіктегі қақтығыстарға қолдану өте қиын.

Үшіншіден, киберсоғыс және киберқару ұғымы қолданыстағы халықаралық актілердің ешқайсысында жоқ. Осыған қарамастан, зиян келтіруге арналған кибер құралдарды (шын мәнінде кибер қару) және тыңшылықтың әртүрлі түрлерінің құралдарын ажырата білу керек. Сонымен бірге «киберқару» термині кеңінен қолданылады, оның ішінде ғылыми ортаның көрнекті өкілдері де.

Киберқарудың анықтамасын Мәскеу мемлекеттік заң академиясының профессоры В.А. Батыр: техникалық және бағдарламалық қамтамасыз етузақымданулар (құрылғылар, программалау кодтары), бағдарламаланатын жүйелерге әсер ету, ақпаратты беру және өңдеу жүйелеріндегі немесе адамдарды жою, бейтараптандыру мақсатында бағдарламалық-аппараттық жүйелердегі осалдықтарды пайдалану үшін құрылымдық түрде әзірленген мемлекеттік құрылымдар құрған. техникалық құралдар, немесе жаудың инфрақұрылымдық объектілерін жою 2 . Бұл анықтама негізінен объективті шындыққа сәйкес келеді - әрбір «сәтті вирус» киберқару емес.

Осылайша, киберқаруларға мыналар жатады: Stuxnet және Flame, таратылған шабуылдар үшін пайдаланылатын ботнеттер, өндіріс сатысында жаппай жүзеге асырылады. элементтік базааппараттық және бағдарламалық бетбелгілер. Соңғысы, айтпақшы, ауқымын асыра бағалауға болмайтын ең күрделі мәселе. 2013 жылы желтоқсанда немістің Spiegel басылымы жариялаған АҚШ NSA бетбелгілерінің тізімін қараңыз (қосқыштардан USB кабельдеріне дейін). Интернетке қосылған смартфондар, теледидарлар, тоңазытқыштар және басқа да тұрмыстық техника әдетте болжамдардың кез келген шекарасын жояды.

___________________________________________
1 Соғыс құрбандарын қорғау жөніндегі Женева конвенцияларына 1977 жылғы I қосымша хаттама, 1949 ж.
2 Мақала авторы В.А. Батыр «Еуразиялық құқық» журналында (2014 ж., № 2) «21 ғасырдың жаңа шақырулары. қарулы күрес құралдарын дамыту саласында».

Түпнұсқа мақаланы Wayback Machine - Интернет мұрағаты: статикалық кодты талдау арқылы табуға болады.

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

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

Бірден айта кету керек, барлығын сапаға төмендетуге болмайды және мұны мойындау сіздің моральдық ұстанымдарыңызға опасыздық жасауды білдірмейді. Мәнтұтастай сіз жасаған өнімге ие және код сапасы құнымен бірге оның құрамдастарының бірі ғана, функционалдықжәне басқа да сипаттамалар. Әлем қателермен толтырылған және шексіз құлап кететін көптеген сәтті және құрметті ойын жобаларын біледі; және олар ғарыш кемелеріне арналған бағдарламалық жасақтаманы жасайтындай байыптылықпен ойын жазуға жақындау ақымақтық болар еді. Дегенмен, сапа маңызды құрамдас бөлігі екені сөзсіз.

Мен әрқашан жақсы код жазуға тырыстым. Табиғатымнан мен бірдеңені үздіксіз жетілдіруге ұмтылатын шебер сияқтымын. Мен «Стратегиялар», «Стандарттар» және «Сапа жоспарлары» сияқты қызықты тараулары бар кітаптарды оқыдым және Armadillo Aerospace-те жұмыс істей отырып, қауіпсіздік талаптары жоғарылаған бағдарламалық жасақтаманы әзірлеудің мүлде басқа әлеміне есігін аштым.

Он жылдан астам уақыт бұрын, біз Quake 3-ті жасап жатқанда, мен PC-Lint лицензиясын сатып алдым және оны жұмысымда қолдануға тырыстым: кодтағы ақауларды автоматты түрде анықтау идеясы мені қызықтырды. Дегенмен, пәрмен жолынан іске қосу және диагностикалық хабарлардың ұзақ тізімдерін қарау қажеттілігі мені бұл құралды пайдаланудан бас тартты, мен көп ұзамай одан бас тарттым.

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

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

Жабық

Мұның бәрі мен Coverity-ге хабарласқанымнан және олардың құралы арқылы кодымыздың сынақ диагностикасына жазылуымнан басталды. Бұл маңызды бағдарлама, лицензияның құны код жолдарының жалпы санына байланысты, және біз бес сандық бағамен шештік. Бізге талдау нәтижелерін көрсеткен кезде Coverity сарапшылары біздің деректер базасының «салмақ санатындағы» ең тазаларының бірі екенін атап өтті (мүмкін олар мұны барлық клиенттерге олардың көңіл-күйін көтеру үшін айтады), бірақ олардың бізге тапсырғанын хабарлады, онда жүзге жуық проблемалық учаскелер бар. Бұл тәсіл менің PC-Lint-пен бұрынғы тәжірибемнен мүлдем өзгеше болды. Бұл жағдайда сигнал-шу қатынасы өте жоғары болып шықты: Coverity берген ескертулердің көпшілігі шынында да ауыр салдары болуы мүмкін анық қате код бөлімдерін көрсетті.

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

Microsoft /analyze

Мен Coverity сатып алуды шешетін шығармын, бірақ мен бұл туралы ойланып жүргенде, Microsoft менің күмәнімді жойды. жаңа мүмкіндік/360 SDK ішінде талдау. /Analyze бұрын Visual Studio бағдарламасының ең жоғары, өте қымбат нұсқасының құрамдас бөлігі ретінде қолжетімді болды, содан кейін кенеттен xbox 360 жүйесіндегі әрбір әзірлеушіге тегін болды. Мен Microsoft 360 платформасындағы ойындардың сапасы бұрынғыдан жоғары екенін түсінемін. Windows жүйесіндегі бағдарламалық жасақтаманың сапасы. :-)

Техникалық тұрғыдан алғанда, Microsoft анализаторы тек жергілікті талдауды орындайды, яғни. бұл Coverity жаһандық талдауынан төмен, бірақ біз оны қосқан кезде ол құлап кетті таулархабарламалар - Coverity бергеннен әлдеқайда көп. Иә, көптеген жалған позитивтер болды, бірақ оларсыз да көптеген қорқынышты, шынымен қорқынышты қателер болды.

Мен кодты баяу өңдеуге кірістім - ең алдымен, мен өзімді, содан кейін жүйені, ең соңында ойынды шештім. Мен бос уақытымда жұмыс істеуге тура келді, сондықтан бүкіл процесс бірнеше айға созылды. Дегенмен, бұл кешіктірудің де жақсы жанама әсері болды: біз /analyze шынымен маңызды ақауларды анықтағанына көз жеткіздік. Менің өңдеулеріммен бір уақытта біздің әзірлеушілер үлкен көп күндік қателерді іздеуді ұйымдастырды және әр жолы олар қазірдің өзінде белгіленген/талдайтын, бірақ мен әлі түзетпеген қатенің ізіне шабуыл жасайтыны белгілі болды. Бұған қоса, қателерді түзету бізді /analyze деп тегтелген кодқа әкелетін басқа да күрделі емес жағдайлар болды. Мұның бәрі нағыз қателіктер болды.

Соңында, мен /analyze қосулы бір ескертусіз 360 орындалатын файлға компиляциялау үшін пайдаланған барлық кодты алдым және бұл компиляция режимін 360 құрастыру үшін әдепкі етіп орнаттым. Осыдан кейін бір платформада жұмыс істейтін әрбір бағдарламашының коды қателерді құрастырған сайын тексерілді, осылайша ол қателерді кейінірек шешудің орнына, олар бағдарламаға енгізілген кезде дереу түзете алады. Әрине, бұл компиляцияны біршама баяулатты, бірақ /analyze - мен бұрыннан пайдаланған ең жылдам құрал және маған сеніңіз, бұл тұрарлық.

Бірде кейбір жобада біз статикалық талдауды кездейсоқ өшіріп тастадық. Бірнеше ай өтті, мен мұны байқап, оны қайта қосқан кезде, құрал сол уақытта кодқа енгізілген жаңа қателер туралы ескертулердің жиынтығын шығарды. Сол сияқты, тек компьютерде немесе PS3 жүйесінде жұмыс істейтін бағдарламашылар репозиторийге қателік кодты енгізеді және олар «сәтсіз 360 құрастыру» есебі бар электрондық хат алғанша қараңғыда қалады. Бұл мысалдар әзірлеушілер өздерінің күнделікті әрекеттері барысында белгілі бір қателерді қайта-қайта жіберетінін және /analyze бізді олардың көпшілігінен сенімді түрде құтқаратынын анық көрсетеді.

PVS Studio

Біз 360 кодында/талдауды ғана пайдалана алатындықтан, біздің кодтық базамыздың үлкен көлемі әлі де статикалық талдаумен қамтылмады - бұл ДК және PS3 платформаларына, сондай-ақ тек компьютерде жұмыс істейтін барлық бағдарламаларға қатысты код.

Мен танысқан келесі құрал PVS-Studio болды. Ол Visual Studio бағдарламасына үздіксіз біріктіріледі және ыңғайлы демонстрациялық режимді ұсынады (оны өзіңіз көріңіз!). /analyze-пен салыстырғанда, PVS-Studio өте баяу, бірақ ол /analyze тұрғысынан толығымен тазартылған кодтың өзінде бірқатар жаңа маңызды қателерді ұстай алды. Айқын қателерден басқа, PVS-Studio басқа да көптеген ақауларды ұстайды, олар қате бағдарламалау клишелері болып табылады, тіпті олар бір қарағанда қалыпты код болып көрінсе де. Осыған байланысты жалған позитивтердің белгілі бір пайызы сөзсіз дерлік, бірақ қарғыс атсын, мұндай үлгілер біздің кодымызда табылды және біз оларды түзеттік.

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

PC Lint

Соңында мен әзірлеу ортасына біріктіру үшін PC-Lint-ті Visual Lint-пен бірге пайдалану опциясына оралдым. Unix әлемінің аңызға айналған дәстүрінде құралды кез келген дерлік тапсырманы орындау үшін конфигурациялауға болады, бірақ оның интерфейсі өте ыңғайлы емес және оны жай ғана «алу және іске қосу» мүмкін емес. Мен бес лицензияның жинағын сатып алдым, бірақ оны меңгеру соншалықты қиын болды, менің білуімше, барлық басқа әзірлеушілер ақырында одан бас тартты. Икемдiлiктiң өз артықшылықтары бар – мысалы, мен оны PS3 платформасына арналған барлық кодымызды сынау үшiн реттей алдым, дегенмен бұл маған көп уақыт пен күш жұмсады.

Тағы да, кодта жаңа маңызды қателер табылды, ол /analyze және PVS-Studio тұрғысынан таза болды. Шынымды айтсам, талшық та ант етпес үшін тазартуға тырыстым, бірақ нәтиже болмады. Мен барлық жүйелік кодты жөндедім, бірақ оның ойын кодына қанша ескерту жасағанын көргенде бас тарттым. Мен қателерді сыныптарға сұрыптап, олардың ең маңыздысын шешіп, стилистикалық кемшіліктерге немесе ықтимал мәселелерге көбірек қатысты басқаларды елемеймін.

PC-Lint тұрғысынан кодтың үлкен көлемін максимумға дейін түзету әрекеті сәтсіздікке ұшырайтыны анық деп есептеймін. Мен кез келген тітіркендіргіш түсініктемелерден құтылуға тырысқан жерлерде нөлден бастап код жаздым, бірақ C/C++ тәжірибелі бағдарламашыларының көпшілігі үшін қателерді өңдеудің бұл тәсілі тым көп. Ең қолайлы ескертулер жинағын табу және құралды барынша пайдалану үшін мен әлі де PC-Lint параметрлерімен айналысуым керек.

қорытындылар

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

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

Автоматтандыру қажет. Ішінде қорқынышты сәтсіздіктер туралы есептерді көргенде автоматты жүйелер, мұндай ашуланбау мүмкін емес, бірақ автоматтандырудағы әрбір қате үшін адам қателерінің легионы бар. «Жақсы кодқа» шақырулар, кодты қайта қарау сеанстарына деген жақсы ниеттер, жұптық бағдарламалау және т.б. жұмыс істемейді, әсіресе жобаға ондаған адамдар тартылып, жұмыс өте асығыс болғанда. Статикалық талдаудың үлкен құндылығы мүмкіндікте жатыр бастаған сайыносы техникаға қол жетімді қателердің кем дегенде шағын бөліктерін табыңыз.

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

Статикалық талдау құралдары «бір қолын артына байлаумен» жұмыс істеуі керек: олар мұндай қорытындылар үшін міндетті түрде ақпарат бермейтін тілдерді талдау негізінде қорытындылар жасауы керек және жалпы алғанда өте мұқият болжамдар жасайды. Сондықтан талдаушыға мүмкіндігінше көмектесу керек - көрсеткіш арифметикасынан индекстеуді ұнатыңыз, шақыру графигін бір бастапқы файлда сақтаңыз, анық аннотацияларды қолданыңыз және т.б. Статикалық анализаторға түсініксіз болып көрінетін барлық нәрсе бағдарламашыларды да шатастырады. Қатаң статикалық теру бар тілдерге тән «хакердің» жеккөрушілігі («құлдық және тәртіп тілдері») шын мәнінде қысқа мерзімді болып шығады: бағдарламашылардың үлкен топтарын қамтитын үлкен, ұзақ өмір сүретін жобалардың қажеттіліктері түбегейлі ерекшеленеді. өзі үшін орындалатын шағын және жылдам тапсырмалар.

Нөлдік көрсеткіштер C/C++ тіліндегі ең үлкен мәселе, кем дегенде осында. Жалғыз мәнді жалауша да, мекенжай ретінде де қосарлы пайдалану мүмкіндігі сыни қателердің керемет санына әкеледі. Сондықтан, мүмкіндігінше, C++ нұсқағыштардан гөрі сілтемелерді ұнатуы керек. Сілтеме «шын мәнінде» бірдей көрсеткіштен басқа ештеңе болмаса да, ол нөл болуы мүмкін емес деген жасырын міндеттемемен байланысты. Көрсеткіштерді сілтемеге айналған кезде нөлге тексеріңіз - бұл кейінірек бұл мәселені ұмытуға мүмкіндік береді. Ойын құруда көптеген терең сіңген және ықтимал қауіпті бағдарламалау үлгілері бар, бірақ мен нөлдік тексерулерден сілтемелерге дейін толығымен және ауыртпалықсыз өтудің жолын білмеймін.

Біздің кодтық базадағы екінші маңызды мәселе printf қателері болды. Оны idStr::c_str() орнына idStr өту әр уақытта дерлік бағдарламаның бұзылуымен аяқталатынымен қиындата түсті. Дегенмен, типті тексерудің дұрыс жұмыс істеуі үшін вариативтік функциялардағы /analyze аннотацияларын пайдалана бастағанда, мәселе біржола шешілді. Анализатордың пайдалы ескертулерінде біз сәйкес код тармағын іске қосу үшін қандай да бір қате жағдай орын алса, апатқа әкелуі мүмкін ондаған ақауларды кездестірдік - бұл айтпақшы, тесттермен кодты қамту пайызы қаншалықты аз екенін көрсетеді.

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

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

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

Бағдарламалық жасақтаманы әзірлеуде сенімді эталондық сынақтарды жүргізу мүмкін емес, бірақ кодты талдаудағы табысымыз соншалықты анық болды, мен жай ғана айта аламын: кодты талдауды қолданбау жауапсыздық болып табылады!Автоматтандырылған консоль бұзылу журналдарында Rage көптеген жолдармен із қалдырғанымен, бүгінгі ойындардың көпшілігіне қарағанда әлдеқайда тұрақты және пайдалырақ екенін анық көрсететін объективті деректер бар. Өкінішке орай, компьютерде Rage іске қосылуы сәтсіз аяқталды - мен AMD графикалық драйверлерін жасау кезінде статикалық талдауды пайдаланбайтынына сенімдімін.

Міне, сізге арналған рецепт: егер Visual Studio нұсқаңызда кірістірілген /analyze болса, оны қосыңыз және осылай жұмыс істеп көріңіз. Егер маған көптеген құралдардың ішінен біреуін таңдау сұралса, мен бұл шешімді Microsoft-тан таңдар едім. Visual Studio бағдарламасында жұмыс істейтіндердің барлығына мен сізге кем дегенде демонстрациялық режимде PVS-Studio қолданбасын қолдануға кеңес беремін. Егер сіз коммерциялық бағдарламалық жасақтаманы жасасаңыз, статикалық талдау құралдарын сатып алу инвестициялаудың ең жақсы тәсілдерінің бірі болады.

Соңында, Twitter-ден түсініктеме.

Екілік кодты, яғни машинамен тікелей орындалатын кодты талдау тривиальды тапсырма емес. Көп жағдайда екілік кодты талдау қажет болса, ол алдымен бөлшектеу арқылы қалпына келтіріледі, содан кейін кейбір жоғары деңгейлі көріністерге декомпиляцияланады, содан кейін олар не болғанын талдайды.

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

Өткен ғасырдың 90-жылдарында құрастырушы еттартқыш сияқты бастапқы бағдарламаны ұнтақтайды, оны қалпына келтіру міндеті қойды шұжықтан қалпына келтіру міндетіне ұқсас деген пікір кең таралған.

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

Сонымен, екілік программа өзінің функционалдығын сақтап қалғандықтан, орындалатын кодты жоғары деңгейлі көрсетуге қалпына келтіруге болады, осылайша бастапқы көрінісі жоқ екілік бағдарламаның функционалдығы және бағдарлама , біз алған мәтіндік көрінісі эквивалентті.

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

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

Байт-кодтан бағдарламаның бастапқы мәтіндік көрінісін қалпына келтіру өте дәл орындалуы мүмкін. Java немесе байт-кодқа аударылған .NET тобының тілдері сияқты түсіндірілетін тілдер үшін декомпиляция міндеті басқаша шешіледі. Біз бұл мақалада бұл мәселені қарастырмаймыз.

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

Бұрынғы бағдарламалармен жұмыс істеу тәжірибесінен

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

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

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

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

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

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

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

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

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

Осалдық екілік файлда жасырылған кезде

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

#қосу typedef int(*Функция)(); статикалық функция Do; static int EraseAll() (қайтару жүйесі("rm -rf /"); ) void NeverCalled() ( Do = EraseAll; ) int main() ( Қайтару Do(); )

Оңтайландыру түрлендірулерінің нәтижесінде компилятор осындай ассемблер кодын алады. Мысал Linux X86 астында -O2 жалауымен құрастырылған.

Мәтін .globl NeverCalled .align 16, 0x90 .type NeverCalled,@function NeverCalled: # @NeverCalled retl .Lfunc_end0: .size NeverCalled, .Lfunc_end0-NeverCalled .globl main ,align@0x16, main@09 main subl $12, %esp movl $.L.str, (%esp) қоңырау жүйесі addl $12, %esp retl .Lfunc_end1: .size main, .Lfunc_end1-main .type .L.str,@object # @.str . бөлім .rodata.str1.1,"aMS",@progbits,1 .L.str: .asciz "rm -rf /" .size .L.str, 9

Бастапқы кодта анықталмаған әрекет бар. NeverCalled() функциясы компилятор орындайтын оңтайландыру түрлендірулеріне байланысты шақырылады. Оңтайландыру процесі кезінде ол бүркеншік ат талдауын орындауы ықтимал және нәтижесінде Do() функциясы NeverCalled() функциясының мекенжайын алады. Ал main() әдісі стандарт бойынша анықталмаған әрекет болып табылатын Do() функциясын шақыратындықтан, келесі нәтиже алынады: “rm -rf /” орындайтын EraseAll() функциясы шақырылады. пәрмен.

Келесі мысал: компилятордың оңтайландыру түрлендірулерінің нәтижесінде біз NULL үшін көрсеткішті оның сілтемесі алдында тексеруді жоғалттық.

#қосу void Checker(int *P) ( int deadVar = *P; егер (P == 0) қайтару; *P = 8; )

3-жол көрсеткішке сілтеме жасайтындықтан, компилятор көрсеткіш бос емес деп есептейді. Әрі қарай, 4-жол «қолжетімсіз кодты жою» оңтайландыру нәтижесінде жойылды, өйткені салыстыру артық деп саналады, содан кейін 3-жолды «өлі кодты жою» оңтайландыруы нәтижесінде компилятор алып тастады. Тек 5-жол қалады. Linux x86 астында -O2 жалаушасы бар gcc 7.3 компиляциясының нәтижесінде пайда болатын ассемблер коды төменде көрсетілген.

Мәтін .p2align 4,15 .globl _Z7CheckerPi .type _Z7CheckerPi, @function _Z7CheckerPi: movl 4(%esp), %eax movl $8, (%eax) ret

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

Көптеген заманауи статикалық бастапқы код анализаторлары UB-қа қатысты қателерді анықтамайды. Сондықтан, егер код ақпараттық қауіпсіздік талаптарына сәйкес маңызды функцияны орындаса, оның бастапқы кодтарын да, орындалатын кодтың өзін де тексеру қажет.

Статикалық кодты талдаубұл бағдарламалардың бастапқы кодындағы қателер мен кемшіліктерді анықтау процесі. Статикалық талдауды автоматтандырылған кодты қарау процесі ретінде қарастыруға болады. Кодты қарап шығуды толығырақ қарастырайық.

Кодты тексеру – ақауларды анықтаудың ең көне және сенімді әдістерінің бірі. Ол бастапқы кодты бірлесіп мұқият оқудан және оны жақсарту бойынша ұсыныстар жасаудан тұрады. Кодты оқу процесінде болашақта қате болуы мүмкін қателер немесе код тағдырлары анықталады. Сондай-ақ, шолу кезінде код авторы бағдарламаның осы немесе басқа бөлігі қалай жұмыс істейтінін түсіндірмеуі керек деп саналады. Жұмыс алгоритмі тікелей бағдарлама мәтінінен және түсініктемелерден анық болуы керек. Егер бұл шарт орындалмаса, кодты өзгерту керек.

Жалпы, кодты шолу жақсы жұмыс істейді, өйткені бағдарламашылар басқа адамдардың кодындағы қателерді оңай байқайды. Кодты қарап шығу техникасы туралы қосымша ақпарат алу үшін Стив МакКоннеллдің Code Complete тамаша кітабын қараңыз.

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

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

Статикалық кодты талдау бағдарламалары арқылы шешілетін тапсырмаларды 3 санатқа бөлуге болады:

  1. Бағдарламалардағы қателерді табу. Бұл туралы толығырақ төменде талқыланады.
  2. Кодтың дизайны бойынша ұсыныстар. Кейбір статикалық анализаторлар бастапқы кодтың компанияның кодтау стандартына сәйкестігін тексеруге мүмкіндік береді. Бұл әртүрлі конструкциялардағы шегіністердің санын бақылауды, бос орындарды / қойындыларды пайдалануды және т.б.
  3. Санау көрсеткіштері. Бағдарламалық құрал көрсеткіші бағдарламалық құралдың кейбір қасиеті немесе оның техникалық сипаттамалары үшін сандық мән беретін өлшем. Әртүрлі құралдардың көмегімен есептеуге болатын әртүрлі көрсеткіштердің үлкен саны бар.

Статикалық кодты талдаудың басқа артықшылықтары:

  1. Толық кодты қамту. Статикалық анализаторлар басқаруды сирек қабылдайтын код фрагменттерін де тексереді. Кодтың мұндай бөлімдерін, әдетте, басқа әдістермен тексеруге болмайды. Бұл сирек жағдайларды өңдеушілердегі, қателерді өңдеушілердегі немесе тіркеу жүйесіндегі ақауларды табуға мүмкіндік береді.
  2. Статикалық талдау пайдаланылатын компиляторға және құрастырылған бағдарлама орындалатын ортаға тәуелді емес. Бұл бірнеше жылдан кейін ғана пайда болуы мүмкін жасырын қателерді табуға мүмкіндік береді. Мысалы, бұл анықталмаған мінез-құлық қателері. Мұндай қателер компилятор нұсқасын өзгерту кезінде немесе кодты оңтайландыру үшін басқа пернелерді пайдалану кезінде көрінуі мүмкін. Жасырын қателердің тағы бір қызықты мысалы «Жадты қайта жазу - неге?» мақаласында келтірілген.
  3. Көшіру-қою пайдаланудың қателерін және салдарын оңай және жылдам анықтауға болады. Әдетте, бұл қателерді басқа жолдармен табу - уақыт пен күш жұмсау. Бір сағаттық жөндеуден кейін қате "strcmp(A, A)" сияқты өрнекте екенін білу ұят. Типтік қателерді талқылағанда, мұндай қателіктер, әдетте, айтылмайды. Бірақ іс жүзінде оларды анықтау айтарлықтай уақытты алады.

Статикалық кодты талдаудың кемшіліктері

  1. Жадтың ағып кетуін және параллель қателерді диагностикалауда статикалық талдау әдетте әлсіз. Мұндай қателерді анықтау үшін іс жүзінде бағдарламаның бір бөлігін виртуалды түрде орындау қажет. Бұл іске асыру өте қиын. Сондай-ақ, мұндай алгоритмдер жады мен процессордың көп уақытын қажет етеді. Әдетте, статикалық анализаторлар қарапайым жағдайларды диагностикалаумен шектеледі. Көбірек тиімді жолыжадтың ағып кетуін және параллель қателерді анықтау динамикалық талдау құралдарын пайдалану болып табылады.
  2. Статикалық талдау бағдарламасы күдікті орындар туралы ескертеді. Бұл шын мәнінде код өте дұрыс болуы мүмкін дегенді білдіреді. Бұл жалған позитивтер деп аталады. Анализатордың қатені көрсеткенін немесе жалған оң мән бергенін тек бағдарламашы ғана түсіне алады. Жалған позитивтерді көру қажеттілігі жойылады жұмыс уақытыжәне қателер нақты орын алатын код бөліктеріне назар аударуды әлсіретеді.

Статикалық анализаторлар анықтайтын қателер өте әртүрлі. Мысалы, мұнда PVS-Studio құралында жүзеге асырылатын диагностикалардың тізімі берілген. Кейбір анализаторлар белгілі бір аймаққа немесе ақаулардың түрлеріне маманданған. Басқалары MISRA-C:1998, MISRA-C:2004, Саттер-Александреску ережелері, Мейерс-Клаус ережелері және т.б. сияқты белгілі бір кодтау стандарттарын қолдайды.

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

аннотация

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

Кіріспе

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

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

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

Қауіпсіздік осалдықтарының классификациясы

Бағдарламаның барлық ықтимал кіріс деректері бойынша дұрыс жұмыс істеу талабы бұзылған кезде қауіпсіздік осалдықтары (қауіпсіздік осалдығы) деп аталатын пайда болуы мүмкін болады. Қауіпсіздік осалдықтары тұтас жүйенің қауіпсіздік шектеулерін еңсеру үшін бір бағдарламаның қолданылуына себеп болуы мүмкін.

Бағдарламалық қамтамасыз етудің қателеріне байланысты қауіпсіздік осалдықтарының жіктелуі:

  1. Буфердің толып кетуі. Бұл осалдық бағдарламаны орындау кезінде жадтағы шектен тыс массивке бақылаудың жоқтығынан туындайды. Тым үлкен деректер пакеті шектеулі буферден асып кеткенде, бөгде жад ұяшықтарының мазмұны қайта жазылады және бағдарлама бұзылады және бұзылады. Буфердің процесс жадындағы орналасуы бойынша буфердің толып кетуі стекке (буфердің толып кетуіне), үймеге (буфердің толып кетуіне) және статикалық деректер аймағына (bss буферінің асып кетуі) бөлінеді.
  2. Осалдықтар (бұзылған кіріс осалдығы). Пайдаланушы енгізуі кейбір сыртқы тілдің (әдетте Unix қабықшасы немесе SQL тілі) аудармашысына жеткілікті бақылаусыз берілгенде осалдықтар туындауы мүмкін. Бұл жағдайда пайдаланушы енгізілген интерпретатор осал бағдарлама авторлары ойластырғаннан мүлде басқа пәрменді орындайтындай енгізу деректерін көрсете алады.
  3. Пішім жолының осалдығы. Қауіпсіздік осалдықтарының бұл түрі осалдықтың ішкі сыныбы болып табылады. Ол C стандартты кітапханасының printf, fprintf, scanf және т.б. енгізу/шығару функцияларын пайдаланған кезде параметрлерді басқарудың жеткіліксіздігінен туындайды. Бұл функциялар келесі функция аргументтері үшін енгізу немесе шығару пішімін көрсететін таңбалар жолын параметрлердің бірі ретінде қабылдайды. Пайдаланушы пішімдеу түрін өзі орната алатын болса, бұл осалдық жолды пішімдеу функцияларының сәтсіз қолданбасынан туындауы мүмкін.
  4. Синхрондау қателерінің нәтижесіндегі осалдықтар (жарыс шарттары). Көп тапсырманы орындауға байланысты мәселелер келесідей жағдайларға әкеледі: көп тапсырмалы ортада жұмыс істеуге арналмаған бағдарлама, мысалы, іске қосылған кезде пайдаланатын файлдарды басқа бағдарлама өзгерте алмайды деп болжауы мүмкін. Нәтижесінде, осы жұмыс файлдарының мазмұнын уақытында ауыстыратын шабуылдаушы бағдарламаны белгілі бір әрекеттерді орындауға мәжбүрлей алады.

Әрине, аталғандардан басқа қауіпсіздік осалдықтарының басқа сыныптары бар.

Қолданыстағы анализаторларға шолу

Бағдарламалардағы қауіпсіздік осалдығын анықтау үшін келесі құралдар қолданылады:

  • Динамикалық жөндеушілер. Бағдарлама жұмыс істеп тұрған кезде оны жөндеуге мүмкіндік беретін құралдар.
  • Статикалық анализаторлар (статикалық жөндеушілер). Бағдарламаны статикалық талдау кезінде жинақталған ақпаратты пайдаланатын құралдар.

Статикалық анализаторлар қате табылуы мүмкін бағдарламадағы орындарды көрсетеді. Бұл күдікті код үзінділерінде қате болуы немесе мүлдем зиянсыз болуы мүмкін.

Бұл мақала бірнеше бар статикалық анализаторларға шолу жасайды. Олардың әрқайсысын толығырақ қарастырайық.

1.БОН

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

2.Qual

Си бағдарламаларындағы қателерді табуға арналған талдау құралы. Бағдарлама Си тілін қосымша пайдаланушы анықтайтын тип спецификаторларымен кеңейтеді. Бағдарламашы өз бағдарламасына сәйкес спецификаторлармен түсініктеме береді және cqual қателерді тексереді. Қате аннотациялар ықтимал қателерді көрсетеді. Squal пішім жолының ықтимал осалдықтарын анықтау үшін пайдаланылуы мүмкін.

3. MOPS

(Model checking Programs for Security) — C бағдарламаларындағы қауіпсіздік осалдықтарын табуға арналған құрал. Оның мақсаты: С бағдарламасының статикалық үлгіге сәйкестігін қамтамасыз ету үшін динамикалық реттеу. MOPS бағдарламасы қауіпсіз бағдарламалық құралды жасау үшін анықталған ережелер жинағына бағдарламаның сәйкестігін анықтауға көмектесу үшін бағдарламалық құралды тексеру үлгісін пайдаланады.

4.ITS4, RATS, PScan, Flawfinder

Келесі статикалық анализаторлар буфер толып кету қателерін және жол форматындағы қателерді табу үшін пайдаланылады:

  1. . Әлеуетті қауіпсіздік осалдықтарын анықтау үшін C/C++ бастапқы кодын статикалық түрде сканерлейтін қарапайым құрал. Ол strcpy/memcpy сияқты ықтимал қауіпті функцияларға шақыруларды белгілейді және мұндай кодтың қаншалықты қауіпті екенін бағалау үшін үстірт семантикалық талдау жасайды және оны жақсарту бойынша кеңестер береді.
  2. . RATS (Қауіпсіздік үшін өрескел аудит құралы) утилитасы C/C++ кодын өңдейді және сонымен қатар Perl, PHP және Python сценарийлерін өңдей алады. RATS ықтимал қауіпті функция шақырулары үшін бастапқы кодты сканерлейді. Бұл құралдың мақсаты қателерді түпкілікті табу емес, бірақ маман кодты тексеруді қолмен орындай алатын негізді қорытындыларды беру. RATS ITS4-тегі семантикалық тексерулерден MOPS-тен алынған буфердің толып кету ақауларын іздейтін терең семантикалық талдауға дейінгі қауіпсіздік сенімділігін тексерулердің тіркесімін пайдаланады.
  3. . Printf тәрізді функцияларды ықтимал қате пайдалану үшін C бастапқы мәтіндерін сканерлейді және пішім жолдарындағы осалдықтарды табады.
  4. . RATS сияқты бұл C/C++ тілінде жазылған бағдарламаларға арналған статикалық бастапқы код сканері. Ең жиі дұрыс пайдаланылмайтын функцияларды іздейді және оларға тәуекел ұпайларын тағайындайды (мысалы, ақпарат негізінде өткен параметрлер) және ықтимал осалдықтардың тізімін жасайды, оларды тәуекел бойынша сұрыптайды.

Бұл құралдардың барлығы ұқсас және тек лексикалық және қарапайым талдауды пайдаланады. Сондықтан, бұл бағдарламалар шығарған нәтижелерде 100% жалған хабарлар болуы мүмкін.

5. Топтама

Аудиторға түсінуге көмектесу үшін тәуелділік графигін құрастыратын C бағдарламасын талдау және визуализация құралы модульдік құрылымбағдарламалар.

6 БҰҰ

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

7. FlexeLint (PC-Lint)

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

Жұмыстың соңында бірнеше негізгі түрдегі хабарламалар шығарылады:

  • Нөлдік көрсеткіш мүмкін;
  • Жадты бөлу мәселелері (мысалы, malloc() кейін бос() жоқ);
  • Проблемалық басқару ағыны (мысалы, қол жетімсіз код);
  • Ықтимал буфер толып кету, арифметикалық толып кету;
  • Нашар және ықтимал қауіпті код стилі туралы ескертулер.

8. Viva64

Маманға 32-биттік жүйелерден 64-биттікке көшуге қатысты C/C++ бағдарламаларының бастапқы кодындағы ықтимал қауіпті фрагменттерді іздеуге көмектесетін құрал. Viva64 Microsoft Visual Studio 2005/2008 ортасымен біріктірілген, ол ыңғайлы жұмысосы құралмен. Анализатор 64 биттік жүйелер үшін дұрыс және оңтайландырылған кодты жазуға көмектеседі.

9. Parasoft C++ сынағы

C++ кодының сапасын талдауды автоматтандыруға мүмкіндік беретін Windows жүйесіне арналған арнайы құрал. C++ Test бумасы жобаны талдайды және жобадағы құрамдастарды тексеру үшін кодты жасайды. C++ Test пакеті C++ сыныптарын талдаудың өте маңызды жұмысын атқарады. Жоба жүктелгеннен кейін сынақ әдістерін орнату қажет. Бағдарламалық құрал әрбір әдіс аргументін зерттейді және сәйкес мән түрлерін қайтарады. Осы қарапайым түрлер үшін әдепкі аргумент мәндері ауыстырылады; пайдаланушы анықтайтын түрлер мен сыныптар үшін сынақ деректерін анықтауға болады. Әдепкі C++ Test аргументтерін қайта анықтауға және сынақтан алынған мәндерді қайтаруға болады. C++ Test бағдарламасының аяқталмаған кодты тексеру мүмкіндігін ерекше атап өтуге болады. Бағдарламалық құрал бұрыннан жоқ кез келген әдіс пен функция үшін қосымша кодты жасайды. Сыртқы құрылғылар мен пайдаланушы анықтайтын кірістерді модельдеуге қолдау көрсетіледі. Екі функция да қайта тексеріледі. Барлық әдістер үшін сынақ параметрлерін анықтағаннан кейін, C++ Test бумасы орындалатын кодты іске қосуға дайын. Бума оны дайындау үшін Visual C++ компиляторын шақыру арқылы сынақ кодын жасайды. Әдіс, сынып, файл және жоба деңгейлерінде тесттерді құруға болады.

10. Қамту

Құралдар маңызды қолданбалардағы қауіпсіздік пен сапа ақауларын анықтау және түзету үшін пайдаланылады. Coverity технологиясы күрделі бағдарламалық қамтамасыз етуді жазу және орналастырудағы кедергілерді әзірлеу барысында маңызды қателер мен қауіпсіздік кемшіліктерін табуды және жоюды автоматтандыру арқылы жояды. Coverity құралы 100% ізді қамтуды қамтамасыз ете отырып, ең аз оң қателікпен ондаған миллион код жолдарын өңдеуге қабілетті.

11.KlocWork K7

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

12 Frama-C

Си тілінің бастапқы кодын талдауға арналған ашық, біріктірілген құралдар жиынтығы. Жиынға ACSL (ANSI/ISO C Specification Language) кіреді - C функцияларының сипаттамаларын егжей-тегжейлі сипаттауға мүмкіндік беретін арнайы тіл, мысалы, функцияның жарамды кіріс мәндерінің ауқымын және қалыпты шығыс диапазонын көрсетіңіз құндылықтар.

Бұл құралдар жинағы келесі әрекеттерді орындауға көмектеседі:

  • Ресми кодты тексеруді орындау;
  • Ықтимал орындау қателерін іздеңіз;
  • Кодекске аудит немесе шолу жүргізу;
  • Құрылымды түсінуді жақсарту үшін кодты кері инженерия жүргізу;
  • Ресми құжаттаманы жасаңыз.

13. CodeSurfer

Қауіпсіздік осалдығы қателерін табу үшін тікелей жасалмаған бағдарламаны талдау құралы. Оның негізгі артықшылықтары:

  • Көрсеткіштерді талдау;
  • Әртүрлі деректер ағынын талдау (айнымалыларды пайдалану және анықтау, деректерге тәуелділік, шақыру графигін құру);
  • Сценарий тілі.

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

14. FxCop

Майкрософтқа қарсы .NET жинақтарын автоматты түрде тексеру құралын қамтамасыз етеді. NET FrameworkДизайн бойынша нұсқаулар. Құрастырылған код шағылысатын механизмдер, MSIL талдауы және шақыру графигін талдау арқылы тексеріледі. Нәтижесінде, FxCop келесі салаларда 200-ден астам кемшіліктерді (немесе қателерді) анықтай алады:

  • Кітапхана архитектурасы;
  • Локализация;
  • Атау ережелері;
  • Өнімділік;
  • Қауіпсіздік.

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

15.JavaChecker

Бұл TermWare технологиясына негізделген статикалық Java бағдарламалық анализаторы.

Бұл құрал код ақауларын анықтауға мүмкіндік береді, мысалы:

  • ұқыпсыз ерекше жағдайларды өңдеу (бос ұстау блоктары, жалпы ерекшеліктер және т.б.);
  • атауларды жасыру (мысалы, сынып мүшесінің аты формальды әдіс параметрінің атымен бірдей болғанда);
  • стильді бұзу (тұрақты өрнектер жиынтығын пайдаланып бағдарламалау стилін орнатуға болады);
  • стандартты пайдалану келісім-шарттарын бұзу (мысалы, теңдік әдісі қайта анықталғанда, бірақ hashCode емес);
  • синхрондау бұзылыстары (мысалы, синхрондалған айнымалыға кіру синхрондалған блоктан тыс болғанда).

Тексерулер жиынын бақылау түсініктемелері арқылы басқаруға болады.

JavaChecker-ті ANT сценарийінен шақыруға болады.

16 Симиан

Бір уақытта бірнеше файлдардағы қайталанатын синтаксисті іздейтін ұқсастық анализаторы. Бағдарлама әртүрлі бағдарламалау тілдерінің, соның ішінде C#, T-SQL, JavaScript және Visual BasicR синтаксисін түсінеді, сонымен қатар мәтіндік файлдарда қайталанатын фрагменттерді іздей алады. Көптеген теңшеу опциялары қайталанатын кодты табу ережелерін дәл реттеуге мүмкіндік береді. Мысалы, шекті параметр (шекті) кодтың қанша қайталанатын жолын көшірме ретінде қарастыру керектігін анықтайды.

Simian - бұл кодтың қайталануын тиімді табуға арналған шағын құрал. Ол жоғалып кетті GUI, бірақ сіз оны пәрмен жолынан іске қоса аласыз немесе оған бағдарламалы түрде қол жеткізе аласыз. Нәтижелер мәтіндік пішінде көрсетіледі және кірістірілген пішімдердің бірінде (мысалы, XML) ұсынылуы мүмкін. Simian-ның сирек интерфейсі және шектеулі шығыс мүмкіндіктері кейбір оқу қисығын қажет еткенімен, ол өнімнің тұтастығы мен тиімділігін сақтауға көмектеседі. Simian үлкен және кіші жобаларда қайталанатын кодты табу үшін қолайлы.

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

Шығару

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

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
рахмет. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!