Таҳлили статикӣ - аз муқаддима то ҳамгироӣ

Аз баррасии беохири код ё ислоҳи хатогиҳо хаста шуда, баъзан шумо фикр мекунед, ки чӣ тавр ҳаёти худро соддатар кунед. Ва пас аз каме чустучу ва ё тасодуфан ба он пешпо хӯрдан, шумо ибораи ҷодугарро мебинед: «Таҳлили статикӣ». Биёед бубинем, ки он чӣ гуна аст ва он бо лоиҳаи шумо чӣ гуна муносибат карда метавонад.

Таҳлили статикӣ - аз муқаддима то ҳамгироӣ
Дарвоқеъ, агар шумо бо ягон забони муосир менависед, пас, шумо онро ҳатто дарк накардаед, шумо онро тавассути анализатори статикӣ мегузаронед. Гап дар он аст, ки ҳама гуна компилятори муосир, ҳарчанд ночиз, маҷмӯи огоҳиҳо дар бораи мушкилоти эҳтимолии кодро таъмин мекунад. Масалан, ҳангоми тартиб додани рамзи C++ дар Visual Studio шумо метавонед инҳоро бинед:

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

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

Чаро шумо ба таҳлили статикӣ ниёз доред?

Хулоса: суръатбахшӣ ва соддагардонӣ.

Таҳлили статикӣ ба шумо имкон медиҳад, ки дар код бисёр мушкилоти гуногун пайдо кунед: аз истифодаи нодурусти сохторҳои забонӣ то хатогиҳои ҳарф. Масалан, ба ҷои

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Шумо рамзи зеринро навиштед:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Тавре ки шумо мебинед, дар сатри охир хатои хаттӣ вуҷуд дорад. Масалан, PVS-Studio огоҳии зеринро медиҳад:

V537 Баррасии дурустии истифодаи банди "y"-ро баррасӣ кунед.

Агар шумо хоҳед, ки дастони худро ба ин хато водор кунед, дар Compiler Explorer мисоли тайёрро санҷед: *гиря кардан*.

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

Бо вуҷуди ин, ин як хато аст. Чӣ мешавад, агар таҳиякунанда рамзи нозукро навишт, зеро ӯ нозукиҳои забонро фаромӯш кардааст? Ё ҳатто онро дар код иҷозат дод рафтори номуайян? Мутаассифона, чунин ҳолатҳо комилан маъмуланд ва қисми зиёди вақт барои ислоҳи коди махсуси корӣ, ки дорои хатогиҳо, хатогиҳои маъмулӣ ё рафтори номуайян аст, сарф мешавад.

Маҳз барои ин ҳолатҳо таҳлили статикӣ пайдо шуд. Ин як ёвари таҳиягар аст, ки мушкилоти гуногунро дар код нишон медиҳад ва дар ҳуҷҷатҳо шарҳ медиҳад, ки чаро ин тавр навиштан лозим нест, он ба чӣ оварда мерасонад ва чӣ гуна онро ислоҳ кардан мумкин аст. Ин аст мисоли он, ки он чӣ гуна буда метавонад: *гиря кардан*.

Шумо метавонед хатогиҳои ҷолибтареро, ки анализатор дар мақолаҳо ошкор карда метавонад, пайдо кунед:

Акнун, ки шумо ин маводро хондаед ва ба манфиатҳои таҳлили статикӣ боварӣ доред, шумо метавонед онро санҷед. Аммо аз куҷо оғоз кардан лозим аст? Чӣ тавр як асбоби навро ба лоиҳаи кунунии худ ворид кардан мумкин аст? Ва коллективро бо у чй тавр шинос кардан мумкин аст? Шумо ба ин саволҳо дар поён ҷавоб хоҳед ёфт.

Эзоҳ: Таҳлили статикӣ чунин чизи муфидро ба монанди баррасиҳои код иваз намекунад ё бекор намекунад. Он ин равандро пурра карда, барои огоҳ кардан ва ислоҳ кардани хатогиҳо, хатогиҳо ва тарҳҳои хатарнок кӯмак мекунад. Таваҷҷӯҳ ба баррасиҳои кодҳо дар бораи алгоритмҳо ва возеҳи кодҳо самараноктар аст, на ҷустуҷӯи қавси нодуруст ё хондани вазифаҳои муқоисаи дилгиркунанда.

0. Шинос шудан бо асбоб

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

Он чизеро, ки шумо дар ин марҳила меомӯзед:

  • Усулҳои муошират бо анализатор кадомҳоянд;
  • Оё анализатор бо муҳити рушди шумо мувофиқ аст?
  • Ҳоло дар лоиҳаҳои шумо кадом мушкилот вуҷуд дорад?

Пас аз он ки шумо ҳама чизеро, ки ба шумо лозим аст, насб кардед, аввалин чизе, ки шумо бояд анҷом диҳед, таҳлили тамоми лоиҳа (Windows, Linux, MacOS). Дар мавриди PVS-Studio дар Visual Studio шумо тасвири шабеҳро хоҳед дид (клик кардан мумкин аст):

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

Таҳлили статикӣ - аз муқаддима то ҳамгироӣ
Дарвоқеъ, дидани 178 огоҳӣ нисбат ба чанд ҳазор...

Дар ҷадвалҳо миёна и паст Аксар вақт огоҳиҳои хуб мавҷуданд, аммо ба ин категорияҳо он ташхисҳое дохил мешаванд, ки дақиқии камтар доранд (эътимоднокӣ). Маълумоти бештарро дар бораи сатҳҳои огоҳӣ ва имконоти кор дар Windows дар ин ҷо пайдо кардан мумкин аст: *гиря кардан*.

Бомуваффақият баррасии хатогиҳои ҷолибтарин (ва бомуваффақият ислоҳ кардани онҳо) арзанда аст огоҳиҳои боқимондаро пахш кунед. Ин барои он зарур аст, ки огоҳиҳои нав дар байни огоҳиҳои кӯҳна гум нашаванд. Илова бар ин, анализатори статикӣ ёвари барномасоз аст, на рӯйхати хатогиҳо. 🙂

1. Автоматикунонӣ

Пас аз шиносоӣ, вақти танзим кардани плагинҳо ва ҳамгироӣ ба CI расидааст. Ин бояд пеш аз оғози истифодаи таҳлилгари статикӣ барномасозон анҷом дода шавад. Гап дар сари он аст, ки барномасоз метавонад имкони таҳлилро фаромӯш кунад ва ё умуман иҷро кардан намехоҳад. Барои ин ба шумо лозим аст, ки ҳама чизро тафтиш кунед, то коди санҷидашуда ба бахши рушди умумӣ ворид нашавад.

Он чизеро, ки шумо дар ин марҳила меомӯзед:

  • Кадом имконоти автоматикунониро асбоб таъмин мекунад;
  • Оё анализатор бо системаи васлкунии шумо мувофиқ аст?

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

Акнун биёед ба хидматҳои муттаҳидсозии пайваста (CI) гузарем. Ҳар як анализатор метавонад ба онҳо бе ягон мушкилоти ҷиддӣ ворид карда шавад. Барои ин ба шумо лозим аст, ки дар қубур як марҳилаи алоҳида эҷод кунед, ки одатан пас аз санҷишҳои сохтмон ва воҳид ҷойгир аст. Ин бо истифода аз утилитаҳои гуногуни консол анҷом дода мешавад. Масалан, PVS-Studio хидматҳои зеринро пешниҳод мекунад:

Барои ворид кардани таҳлил ба CI, шумо бояд се чизро иҷро кунед:

  • Насб кардани анализатор;
  • Таҳлили иҷро;
  • Натиҷаҳоро ба даст оред.

Масалан, барои насб кардани PVS-Studio дар Linux (Debian-base), шумо бояд фармонҳои зеринро иҷро кунед:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Дар системаҳое, ки Windows кор мекунанд, роҳи насб кардани анализатор аз мудири бастаҳо вуҷуд надорад, аммо имкон дорад, ки анализатор аз сатри фармон ҷойгир карда шавад:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Шумо метавонед маълумоти бештарро дар бораи ҷойгиркунии PVS-Studio дар системаҳое, ки дар Windows кор мекунанд, хонед *дар ин ҷо*.

Пас аз насб, шумо бояд таҳлилро мустақиман иҷро кунед. Бо вуҷуди ин, тавсия дода мешавад, ки ин корро танҳо пас аз ҷамъоварӣ ва санҷишҳо анҷом диҳед. Сабаб дар он аст, ки таҳлили статикӣ одатан ду маротиба зиёдтар аз тартиб медиҳад.

Азбаски усули оғоз аз платформа ва хусусиятҳои лоиҳа вобаста аст, ман вариантро барои C++ (Linux) ҳамчун мисол нишон медиҳам:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

Фармони якум таҳлилро иҷро мекунад ва дуюм лифофаҳогузоришро ба формати матн табдил медиҳад, онро дар экран намоиш медиҳад ва агар огоҳӣ мавҷуд бошад, рамзи бозгашти ғайр аз 0-ро бармегардонад. Механизми монанди ин метавонад ба осонӣ истифода шавад барои бастани сохтмон ҳангоми мавҷуд будани паёмҳои хатогӣ. Аммо, шумо ҳамеша метавонед парчамро хориҷ кунед -w ва маҷлисеро, ки дорои огоҳиҳо мебошад, манъ накунед.

Эзоҳ: Формати матн номувофиқ аст. Он танҳо ҳамчун намуна оварда шудааст. Ба формати гузориши ҷолибтар диққат диҳед - FullHtml. Он ба шумо имкон медиҳад, ки тавассути код паймоиш кунед.

Шумо метавонед бештар дар бораи танзими таҳлил дар CI дар мақола хонед "PVS-Studio ва ҳамгироии доимӣ"(Windows) ё "Чӣ тавр PVS-Studio -ро дар Travis CI насб кардан мумкин аст"(Linux).

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

Умуман, ташкили таҳлили дархости кашидан аз оғози муқаррарии таҳлил дар CI чандон фарқ надорад. Ба истиснои зарурати гирифтани рӯйхати файлҳои тағирёфта. Инҳоро одатан тавассути пурсиши фарқияти байни шохаҳо бо истифода аз git ба даст овардан мумкин аст:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Акнун ба шумо лозим аст, ки ин рӯйхати файлҳоро ҳамчун вуруд ба анализатор интиқол диҳед. Масалан, дар PVS-Studio ин бо истифода аз парчам амалӣ карда мешавад -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Шумо метавонед дар бораи таҳлили дархостҳои ҷалб маълумоти бештар гиред *дар ин ҷо*. Ҳатто агар CI-и шумо дар рӯйхати хидматҳои дар мақола зикршуда набошад ҳам, шумо бахши умумии бахшида ба назарияи ин намуди таҳлилро муфид хоҳед ёфт.

Бо насб кардани таҳлили дархостҳои ҷалб, шумо метавонед ӯҳдадориҳои дорои огоҳиро маҳкам кунед ва ба ин васила сарҳаде эҷод кунед, ки рамзи санҷидашуда убур карда наметавонад.

Ин албатта хуб аст, аммо ман мехостам, ки ҳама огоҳиҳоро дар як ҷо бубинам. На танҳо аз анализатори статикӣ, балки аз санҷишҳои воҳид ё аз анализатори динамикӣ. Барои ин хидматҳо ва плагинҳои гуногун мавҷуданд. Масалан, PVS-Studio дорад плагин барои ҳамгироӣ ба SonarQube.

2. Интегратсия дар мошинҳои таҳиякунанда

Ҳоло вақти насб кардан ва танзим кардани анализатор барои истифодаи ҳамарӯзаи рушд расидааст. То ин дам шумо аллакай бо аксари усулҳои кор ошно шудаед, бинобар ин, ин қисмати осонтарин номида мешавад.

Ҳамчун варианти соддатарин, таҳиягарон метавонанд худашон таҳлилгари заруриро насб кунанд. Аммо, ин вақти зиёдро мегирад ва онҳоро аз таҳия парешон мекунад, бинобар ин шумо метавонед ин равандро бо истифода аз насбкунанда ва парчамҳои зарурӣ автоматӣ кунед. Барои PVS-Studio гуногунанд байракхо барои монтажи автоматй. Аммо, ҳамеша менеҷерҳои бастаҳо мавҷуданд, масалан, Chocolatey (Windows), Homebrew (macOS) ё даҳҳо имконоти Linux.

Пас шумо бояд плагинҳои заруриро насб кунед, масалан барои Visual, Студияи, IDEA, Ридерӣ ва ѓайра

3. Истифодаи ҳаррӯза

Дар ин марҳила, вақти он расидааст, ки дар бораи роҳҳои тезонидани анализатор ҳангоми истифодаи ҳаррӯза чанд сухан бигӯем. Таҳлили пурраи тамоми лоиҳа вақти зиёдро мегирад, аммо мо то чӣ андоза зуд-зуд кодро дар тамоми лоиҳа якбора иваз мекунем? Ягон рефакторинги он қадар калон вуҷуд надорад, ки он фавран ба тамоми пойгоҳи код таъсир расонад. Шумораи файлҳое, ки дар як вақт иваз карда мешаванд, хеле кам аз даҳҳо зиёд мешаванд, бинобар ин таҳлили онҳо маъно дорад. Барои чунин вазъият вуҷуд дорад режими таҳлили афзоянда. Танҳо хавотир нашавед, ин асбоби дигар нест. Ин режими махсусест, ки ба шумо имкон медиҳад, ки танҳо файлҳои тағирёфта ва вобастагии онҳоро таҳлил кунед ва ин ба таври худкор пас аз сохтани он рӯй медиҳад, агар шумо дар IDE бо плагин насбшуда кор кунед.

Агар анализатор мушкилотро дар коди ба наздикӣ тағйирёфта ошкор кунад, он мустақилона дар ин бора хабар медиҳад. Масалан, PVS-Studio бо истифода аз огоҳӣ дар ин бора ба шумо хабар медиҳад:

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

Чунин мақолаҳо тамоми маълумоти барои истифодаи ҳамарӯза заруриро пешниҳод мекунанд ва вақти зиёдро намегиранд. 🙂

Ҳатто дар марҳилаи шиносоӣ бо асбоб, мо дар яке аз оғози аввалин огоҳиҳои зиёдеро пахш кардем. Мутаассифона, анализаторҳои статикӣ мукаммал нестанд, аз ин рӯ гоҳ-гоҳ онҳо мусбатҳои бардурӯғ медиҳанд. Одатан пахш кардани онҳо осон аст; масалан, дар плагини PVS-Studio барои Visual Studio шумо танҳо як тугмаро пахш кардан лозим аст:

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

Пас аз интегратсия

Ҳамин тавр, мо тамоми марҳилаҳои ворид кардани таҳлили статикиро ба раванди рушд тай кардем. Сарфи назар аз аҳамияти таъсиси чунин абзорҳо дар CI, ҷои муҳимтарин барои иҷро кардани онҳо компютери таҳиякунанда мебошад. Дар ниҳоят, анализатори статикӣ судя нест, ки дар ҷои дур аз шумо гӯяд, ки код хуб нест. Баръакс, он ёварест, ки ба шумо хабар медиҳад, ки шумо хаста шудаед ва агар чизе фаромӯш кардаед, ба шумо хотиррасон мекунад.

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

Ва агар шумо ё ҳамкасбони шумо то ҳол боварӣ надошта бошед, ки оё он барои татбиқи анализатор зарур аст, пас ман ба шумо тавсия медиҳам, ки ҳоло хондани мақоларо оғоз кунед "Сабабҳои ҷорӣ намудани таҳлилгари коди статикии PVS-Studio ба раванди таҳия". Он нигарониҳои маъмулии таҳиягаронро баррасӣ мекунад, ки таҳлили статикӣ вақти онҳоро мегирад ва ғайра.

Таҳлили статикӣ - аз муқаддима то ҳамгироӣ

Агар шумо хоҳед, ки ин мақоларо бо шунавандагони англисзабон мубодила кунед, лутфан истиноди тарҷумаро истифода баред: Максим Звягинтсев. Таҳлили статикӣ: Аз оғоз то ҳамгироӣ.

Манбаъ: will.com

Илова Эзоҳ