Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард

Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард
Санҷидани таҳлилгари рамзи статикӣ осон аст. Аммо барои ба амал баровардани он, махсусан дар тахияи лоихаи калони кухна махоратро талаб мекунад. Агар нодуруст анҷом дода шавад, анализатор метавонад кор илова кунад, рушдро суст кунад ва гурӯҳро аз кор барад. Биёед ба таври мухтасар дар бораи он ки чӣ гуна ба ҳамгироии таҳлили статикӣ ба раванди рушд дуруст муносибат кунем ва ба истифодаи он ҳамчун як қисми CI/CD оғоз кунем.

Муқаддима

Ба наздикӣ таваҷҷӯҳи ман ба нашрия ҷалб карда шуд "Оғоз кардан бо таҳлили статикӣ бидуни фишори даста". Аз як тараф, ин мақолаи хубест, ки сазовори шинос шудан аст. Аз тарафи дигар, ба ман чунин менамояд, ки он то ҳол дар бораи чӣ гуна бедард татбиқ кардани таҳлили статикӣ дар лоиҳа бо миқдори зиёд ҷавоби пурра намедиҳад. Дар мақола гуфта мешавад, ки шумо метавонед қарзи техникиро қабул кунед ва танҳо дар коди нав кор кунед, аммо баъдтар ҷавобе нест, ки бо ин қарзи техникӣ чӣ кор кардан лозим аст.

Дастаи мо PVS-Studio назари худро дар ин мавзӯъ пешниҳод мекунад. Биёед бубинем, ки чӣ гуна масъалаи ҷорӣ намудани таҳлилгари коди статикӣ дар навбати аввал ба миён меояд, ин мушкилотро чӣ гуна бояд бартараф кард ва қарзи техникиро чӣ гуна бедард бартараф кардан мумкин аст.

Масъалаҳо

Оғози кор кардан ва дидани он ки чӣ гуна анализатори статикӣ кор мекунад, одатан душвор нест [1]. Шумо метавонед хатогиҳои ҷолиб ё ҳатто осебпазирии эҳтимолии даҳшатоварро дар код бинед. Шумо ҳатто метавонед чизеро ислоҳ кунед, аммо баъдан бисёр барномасозон таслим мешаванд.

Ҳама анализаторҳои статикӣ мусбатҳои бардурӯғ медиҳанд. Ин як хусусияти методологияи таҳлили коди статикӣ аст ва дар ин бора ҳеҷ кор кардан мумкин нест. Дар сурати умумӣ, ин як масъалаи ҳалнашаванда аст, ки онро теоремаи Райс тасдиқ мекунад [2]. Алгоритмҳои омӯзиши мошинсозӣ низ кӯмак намекунанд [3]. Ҳатто агар шахс на ҳамеша бигӯяд, ки ин ё он код нодуруст аст, пас шумо набояд инро аз барнома интизор шавед :).

Агар анализатори статикӣ аллакай танзим шуда бошад, мусбатҳои бардурӯғ мушкил нестанд:

  • Маҷмӯи қоидаҳои номувофиқро ғайрифаъол кунед;
  • Баъзе ташхисҳои номатлуб ғайрифаъол карда шудаанд;
  • Агар сухан дар бораи C ё C++ равад, пас макросҳо қайд карда мешаванд, ки дорои конструксияҳои мушаххас мебошанд, ки боиси пайдо шудани огоҳиҳои бефоида дар ҳар ҷое, ки чунин макросҳо истифода мешаванд;
  • Функсияҳои худӣ қайд карда шудаанд, ки амалҳои шабеҳи функсияҳои системаро иҷро мекунанд (аналоги худ memcpy ё printf) [4];
  • Аломатҳои бардурӯғ махсусан бо истифода аз шарҳҳо ғайрифаъол карда мешаванд;
  • Ва ҳамин тавр.

Дар ин ҳолат, мо метавонем сатҳи пасти мусбати бардурӯғро тақрибан 10-15% интизор шавем [5]. Ба ибораи дигар, аз 9 огоҳии анализатор 10-тоаш мушкилоти воқеиро дар код ё ҳадди аққал "рамзи бӯи сахт" нишон медиҳад. Розӣ шавед, ин сенария бениҳоят гуворо аст ва анализатор дӯсти воқеии барномасоз аст.

Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард
Дар асл, дар як лоиҳаи калон, тасвири ибтидоӣ комилан дигар хоҳад буд. Анализатор барои коди кӯҳна садҳо ё ҳазорҳо огоҳӣ медиҳад. Ба зудӣ фаҳмидан ғайриимкон аст, ки кадоме аз ин огоҳиҳо мувофиқ асту кадоме не. Нишаста бо ин ҳама огоҳиҳо сару кор кардан ғайримантиқӣ аст, зеро кори асосӣ дар ин ҳолат рӯзҳо ё ҳафтаҳо қатъ мешавад. Одатан, як даста қодир ба чунин сенария нест. Инчунин шумораи зиёди фарқиятҳо мавҷуданд, ки таърихи тағиротро вайрон мекунанд. Ва таҳрири босуръати оммавии ин қадар порчаҳо дар код ногузир ба хатогиҳои нави чопӣ ва хатогиҳо оварда мерасонад.

Ва муҳимтар аз ҳама, чунин кор дар мубориза бар зидди огоҳӣ каме маъно дорад. Розӣ шавед, ки азбаски лоиҳа солҳои зиёд бомуваффақият амал мекунад, аксари хатогиҳои муҳими он аллакай ислоҳ шудаанд. Бале, ин ислоҳҳо хеле гарон буданд, бояд ислоҳ карда шаванд, дар бораи хатогиҳо фикру мулоҳизаҳои манфии корбарон гирифтанд ва ғайра. Анализатори статикӣ барои ислоҳи бисёре аз ин хатогиҳо дар марҳилаи рамзгузорӣ, зуд ва арзон кӯмак мекунад. Аммо дар айни замон ин ё он тарз ин хатохо ислох карда шудаанд ва анализатор асосан хатогихои гайриканоатбахши коди кухнаро ошкор мекунад. Ин рамзро истифода бурдан мумкин нест, он метавонад хеле кам истифода шавад ва хато дар он метавонад ба оқибатҳои назаррас оварда расонад. Шояд дар ҷое соя аз тугма ранги нодуруст бошад, аммо ин ба истифодаи касе аз маҳсулот халал намерасонад.

Албатта, хатто хатохои хурд хам хатогй мебошанд. Ва баъзан хато метавонад осебпазирии воқеиро пинҳон кунад. Бо вуҷуди ин, даст кашидан аз ҳама чиз ва сарф кардани рӯзҳо/ҳафтаҳо бо камбудиҳо, ки базӯр зуҳур мекунанд, як идеяи шубҳанок ба назар мерасад.

Программйчиён нигаранд, бубинанд, ба хамаи ин огохкунихо дар бораи коди кухнаи коргарй нигох мекунанд... Ва онхо чунин мешуморанд: мо бе тахлили статикй кор карда метавонем. Биёед баъзе функсияҳои нави муфидро нависед.

Ба таври худ, онҳо дурустанд. Онҳо фикр мекунанд, ки аввал онҳо бояд аз ҳама ин огоҳиҳо халос шаванд. Танҳо дар он сурат онҳо метавонанд аз истифодаи мунтазами анализатори код баҳра баранд. Дар акси ҳол, огоҳиҳои нав танҳо дар пешинаи кӯҳна ғарқ мешаванд ва касе ба онҳо аҳамият намедиҳад.

Ин ҳамон аналогияест, ки бо огоҳиҳои компилятор. Бесабаб нест, ки шумораи ҳушдорҳои компиляторро дар 0 нигоҳ доштан тавсия медиҳанд. Агар 1000 огоҳӣ мавҷуд бошад, пас вақте 1001 бошад, касе ба он аҳамият намедиҳад ва маълум нест, ки ин огоҳии навтаринро аз куҷо ҷустуҷӯ кард.

Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард
Бадтарин чиз дар ин ҳикоя он аст, ки агар касе аз боло шуморо маҷбур кунад, ки таҳлили рамзи статикиро истифода баред. Ин танҳо дастаро беэътиноӣ мекунад, зеро аз нуқтаи назари онҳо мураккабии иловагии бюрократӣ вуҷуд хоҳад дошт, ки танҳо дар роҳ халал мерасонад. Ҳеҷ кас ба гузоришҳои анализатор нигоҳ намекунад ва ҳама истифода танҳо "дар рӯи коғаз" хоҳад буд. Онхое. Ба таври расмӣ, таҳлил дар раванди DevOps сохта шудааст, аммо дар амал ин ба касе фоида намеорад. Мо дар стендҳо аз иштироккунандагони конфронс ҳикояҳои муфассалро шунидем. Чунин таҷриба метавонад барномасозонро аз истифодаи абзорҳои таҳлили статикӣ барои муддати тӯлонӣ, агар абадӣ набошад, боздорад.

Татбик ва бархам додани карзи техникй

Дар асл, дар бораи ҷорӣ кардани таҳлили статикӣ ҳатто дар як лоиҳаи калони кӯҳна ҳеҷ чизи душвор ё даҳшатнок нест.

CI / CD

Илова бар ин, анализатор метавонад фавран як қисми раванди рушди муттасил табдил дода шавад. Масалан, тақсимоти PVS-Studio дорои утилитаҳо барои бароҳат дидани ҳисобот дар формати ба шумо лозим ва огоҳиномаҳо ба таҳиягароне, ки қисмҳои мушкили кодро навиштаанд, дар бар мегирад. Барои онҳое, ки ба кушодани PVS-Studio аз системаҳои CI/CD таваҷҷӯҳи бештар доранд, ман тавсия медиҳам, ки шумо бо барномаҳои мувофиқ шинос шавед. ҷудокунӣ ҳуҷҷатҳо ва як қатор мақолаҳо:

Аммо биёед ба масъалаи шумораи зиёди мусбатҳои бардурӯғ дар марҳилаҳои аввали татбиқи воситаҳои таҳлили код баргардем.

Ислоҳи қарзи техникии мавҷуда ва мубориза бо огоҳиҳои нав

Анализаторҳои муосири тиҷории статикӣ ба шумо имкон медиҳанд, ки танҳо огоҳиҳои наверо, ки дар коди нав ё тағирёфта пайдо мешаванд, омӯзед. Татбиқи ин механизм гуногун аст, аммо моҳият як аст. Дар таҳлилгари статикии PVS-Studio, ин функсия ба таври зерин амалӣ карда мешавад.

Барои зуд оғоз кардани истифодаи таҳлили статикӣ, мо ба корбарони PVS-Studio тавсия медиҳем, ки механизми пахши оммавии огоҳиро истифода баранд [6]. Идеяи умумӣ чунин аст. Истифодабаранда анализаторро ба кор андохта, огоҳиҳои зиёд гирифт. Азбаски лоиҳае, ки солҳои тӯлонӣ дар ҳоли рушд аст, зинда аст, рушд мекунад ва пул кор мекунад, пас эҳтимоли зиёд дар гузориш огоҳиҳои зиёде мавҷуд нестанд, ки камбудиҳои ҷиддиро нишон медиҳанд. Ба ибораи дигар, хатогиҳои муҳим аллакай бо истифода аз усулҳои гаронтар ё ба шарофати фикру мулоҳизаҳои муштариён ислоҳ карда шудаанд. Аз ин рӯ, ҳама чизеро, ки анализатор дар айни замон пайдо мекунад, қарзи техникӣ ҳисобидан мумкин аст, ки кӯшиши фавран бартараф кардани он ғайриимкон аст.

Шумо метавонед ба PVS-Studio бигӯед, ки ин огоҳиҳоро дар ҳоли ҳозир номувофиқ мешуморад (қарзи техникиро барои дертар захира кунед) ва он дигар онҳоро нишон намедиҳад. Анализатор як файли махсус эҷод мекунад, ки дар он маълумот дар бораи хатогиҳое, ки ҳанӯз ҷолиб нестанд, захира мекунад. Ва акнун PVS-Studio танҳо барои рамзи нав ё тағирёфта огоҳӣ медиҳад. Зиёда аз ин, хамаи ин мохирона ба амал бароварда мешавад. Агар масалан, ба ибтидои файли коди ибтидоӣ сатри холӣ илова карда шавад, пас анализатор мефаҳмад, ки воқеан ҳеҷ чиз тағир наёфтааст ва хомӯширо идома медиҳад. Ин файли аломатгузорӣ метавонад ба системаи идоракунии версия гузошта шавад. Файл калон аст, аммо ин мушкилот нест, зеро аксар вақт нигоҳ доштани он маъно надорад.

Акнун ҳама барномасозон огоҳиҳое хоҳанд дид, ки танҳо бо рамзи нав ё тағирёфта алоқаманданд. Ҳамин тариқ, шумо метавонед аз рӯзи дигар, чунон ки мегӯянд, ба истифода аз анализатор шурӯъ кунед. Ва шумо метавонед баъдтар ба қарзи техникӣ баргардед ва хатогиҳоро тадриҷан ислоҳ кунед ва анализаторро танзим кунед.

Ҳамин тариқ, масъалаи аввалини татбиқи анализатор дар лоиҳаи калони кӯҳна ҳал карда шуд. Акнун биёед бифаҳмем, ки бо қарзи техникӣ чӣ кор кунем.

Ислоҳи хатогиҳо ва рефакторингҳо

Оддӣ ва табиитарин чиз ин аст, ки барои таҳлили огоҳиҳои оммавии анализатор ва тадриҷан бо онҳо кор кардан каме вақт ҷудо кунед. Дар ҷое шумо бояд хатогиҳои кодро ислоҳ кунед, дар ҷое шумо бояд рефактор кунед, то ба анализатор бигӯед, ки код мушкил нест. Мисоли оддӣ:

if (a = b)

Аксари компиляторҳо ва анализаторҳои C++ аз чунин код шикоят мекунанд, зеро эҳтимолияти зиёд вуҷуд дорад, ки онҳо воқеан навиштан мехоҳанд. (а == б). Аммо як тавофуқи ногуфта вуҷуд дорад ва ин одатан дар ҳуҷҷатҳо қайд карда мешавад, ки агар қавсҳои иловагӣ вуҷуд дошта бошанд, пас чунин мешуморанд, ки барномасоз дидаву дониста чунин код навиштааст ва ҳоҷат ба дашном додан нест. Масалан, дар ҳуҷҷатҳои PVS-Studio барои ташхис V559 (CWE-481) равшан навишта шудааст, ки сатри зерин дуруст ва бехатар дониста мешавад:

if ((a = b))

Мисоли дигар. Оё дар ин рамзи C++ фаромӯш шудааст? танаффус ё не?

case A:
  foo();
case B:
  bar();
  break;

Дар ин ҷо таҳлилгари PVS-Studio огоҳӣ медиҳад V796 (CWE-484). Ин метавонад хато набошад, дар ин ҳолат шумо бояд бо илова кардани атрибут ба таҳлилгар маслиҳат диҳед [[афтидан]] ё масалан __атрибут__((афтидан)):

case A:
  foo();
  [[fallthrough]];
case B:
  bar();
  break;

Гуфтан мумкин аст, ки чунин тағйироти код хатогиро ислоҳ намекунад. Бале, ин дуруст аст, аммо он ду кори фоиданок мекунад. Аввалан, гузориши анализатор аз мусбатҳои бардурӯғ халос мешавад. Дуюм, кодекс барои одамоне, ки дар нигоҳдории он иштирок мекунанд, фаҳмотар мегардад. Ва ин хеле муҳим аст! Танҳо барои ин, анҷом додани рефакторингҳои ночиз бамаврид аст, то кодро равшантар ва нигоҳ доштани он осонтар кунад. Азбаски анализатор намефаҳмад, ки оё "танаффус" лозим аст ё не, барои ҳамкорони барномасоз низ норавшан хоҳад буд.

Илова ба ислоҳи хатогиҳо ва рефакторингҳо, шумо метавонед махсусан огоҳиҳои бардурӯғи таҳлилгари бардурӯғро пахш кунед. Баъзе ташхисҳои номатлубро ғайрифаъол кардан мумкин аст. Масалан, касе фикр мекунад, ки огоҳӣ бемаънӣ аст V550 дар бораи муқоисаи шинокунанда / арзишҳои дучандон. Ва баъзеҳо онҳоро муҳим ва шоистаи омӯзиш тасниф мекунанд [7]. Кадом огоҳиҳо муҳим ҳисобида мешаванд ва кадомашон не, ба гурӯҳи таҳиягарон вобаста аст.

Роҳҳои дигари рафъ кардани огоҳиҳои бардурӯғ вуҷуд доранд. Масалан, аломатгузории макрос қаблан зикр шуда буд. Ҳамаи ин дар ҳуҷҷатҳо муфассалтар тасвир шудааст. Муҳимтар аз ҳама он аст, ки фаҳмед, ки агар шумо тадриҷан ва мунтазам ба кор бо мусбатҳои бардурӯғ наздик шавед, дар онҳо ҳеҷ бадӣ нест. Аксарияти зиёди огоҳиҳои ҷолиб пас аз конфигуратсия нопадид мешаванд ва танҳо ҷойҳое боқӣ мемонанд, ки воқеан омӯзиши бодиққат ва баъзе тағйирот дар кодро талаб мекунанд.

Инчунин, мо ҳамеша ба мизоҷони худ дар ташкили PVS-Studio кӯмак мерасонем, агар ягон мушкилот ба миён ояд. Гузашта аз ин, ҳолатҳое буданд, ки мо худамон огоҳиҳои бардурӯғро бартараф карда, хатогиҳоро ислоҳ кардем [8]. Дар ҳар сурат, ман қарор додам, ки ин вариант барои ҳамкории васеъ низ имконпазир аст :).

Усули рахна

Боз як равиши ҷолиб барои тадриҷан беҳтар кардани сифати код тавассути бартараф кардани огоҳии анализатори статикӣ вуҷуд дорад. Хулоса ин аст, ки шумораи огоҳиҳо танҳо метавонад кам шавад.

Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард

Шумораи огоҳиҳои аз ҷониби анализатори статикӣ додашуда сабт карда мешавад. Дарвозаи сифат тавре танзим карда шудааст, ки акнун шумо метавонед танҳо кодеро ворид кунед, ки шумораи амалиётҳоро зиёд намекунад. Дар натича процесси тадричан кам кардани шумораи сигналхо аз танзими анализатор ва ислохи хатогихо огоз меёбад.

Ҳатто агар шахс каме фиреб кардан мехоҳад ва қарор кунад, ки аз дарвозаи сифат на бо бартараф кардани огоҳиҳо дар рамзи нави худ, балки бо такмил додани коди кӯҳнаи тарафи сеюм гузарад, ин даҳшатнок нест. Хамин тавр, ратчет ба як самт давр мезанад ва охиста-охиста шумораи нуксонхо кам мешавад. Ҳатто агар шахс намехоҳад, ки камбудиҳои нави худро ислоҳ кунад, ӯ бояд дар коди ҳамсоя чизеро такмил диҳад. Дар баъзе мавридҳо, роҳҳои осони кам кардани шумораи огоҳиҳо ба охир мерасад ва вақте ки хатогиҳои воқеӣ ислоҳ карда мешаванд.

Ин методология дар мақолаи хеле ҷолиби Иван Пономарев муфассалтар тасвир шудааст "Таҳлили статикиро дар раванд татбиқ кунед, на аз он барои дарёфти хатогиҳо", ки ман тавсия медиҳам, ки ба ҳар касе, ки ба беҳтар кардани сифати код манфиатдор аст, хонед.

Муаллифи мақола низ дар ин мавзӯъ гузорише дорад: "Таҳлили доимии статикӣ".

хулоса

Умедворам, ки пас аз ин мақола хонандагон абзорҳои таҳлили статикиро бештар қабул мекунанд ва мехоҳанд онҳоро дар раванди таҳия татбиқ кунанд. Агар шумо ягон савол дошта бошед, мо ҳамеша омодаем маслиҳат диҳед истифодабарандагони таҳлилгари статикии мо PVS-Studio ва кӯмак дар татбиқи он.

Шубҳаҳои маъмулии дигар вуҷуд доранд, ки оё таҳлили статикӣ воқеан қулай ва муфид буда метавонад. Ман кӯшиш кардам, ки аксари ин шубҳаҳоро дар нашрияи "Сабабҳои ворид кардани таҳлилгари коди статикии PVS-Studio ба раванди таҳия" бартараф кунам.9].

Ташаккур барои таваҷҷуҳ ва омадед скачать ва таҳлилгари PVS-Studio -ро санҷед.

Истинодҳои иловагӣ

  1. Андрей Карпов. Чӣ тавр ман метавонам зуд огоҳиҳои ҷолибро бинам, ки таҳлилгари PVS-Studio барои коди C ва C++ истеҳсол мекунад?
  2. Википедия Теоремаи Райс.
  3. Андрей Карпов, Виктория Ханиева. Истифодаи омӯзиши мошинсозӣ дар таҳлили статикии коди сарчашмаи барнома.
  4. PVS-Studio. Ҳуҷҷатгузорӣ. Танзимоти иловагии ташхис.
  5. Андрей Карпов. Хусусиятҳои анализатори PVS-Studio бо истифода аз мисоли EFL Core Libraries, 10-15% мусбатҳои бардурӯғ.
  6. PVS-Studio. Ҳуҷҷатгузорӣ. Қатъи оммавии паёмҳои анализатор.
  7. Иван Андряшин. Дар бораи чӣ гуна мо таҳлили статикиро дар лоиҳаи симулятори таълимии ҷарроҳии рентгении эндоваскулярӣ озмоиш кардем.
  8. Павел Еремеев, Святослав Размыслов. Чӣ тавр дастаи PVS-Studio рамзи Unreal Engine-ро такмил дод.
  9. Андрей Карпов. Сабабҳои ҷорӣ намудани таҳлилгари коди статикии PVS-Studio ба раванди таҳия.

Чӣ гуна бояд таҳлилгари коди статикиро дар лоиҳаи кӯҳна бидуни рӯҳбаланд кардани даста татбиқ кард

Агар шумо хоҳед, ки ин мақоларо бо шунавандагони англисзабон мубодила кунед, лутфан истиноди тарҷумаро истифода баред: Андрей Карпов. Чӣ гуна бояд таҳлилгари рамзи статикиро дар лоиҳаи кӯҳна ҷорӣ кард ва дастаро рӯҳафтода накунад.

Манбаъ: will.com

Илова Эзоҳ