Статикалык анализ – таанышуудан интеграцияга чейин

Кодду чексиз карап чыгуудан же мүчүлүштүктөрдү оңдоодон чарчап, кээде жашооңузду кантип жөнөкөйлөтүү жөнүндө ойлоносуз. Ал эми бир аз издөөдөн кийин, жакшы, же кокусунан мүдүрүлүп, сиз сыйкырдуу сөз айкашын көрө аласыз: "Статикалык анализ". Келгиле, бул эмне экенин жана ал сиздин долбооруңуз менен кантип иштеше аларын карап көрөлү.

Статикалык анализ – таанышуудан интеграцияга чейин
Чындыгында, кайсы бир заманбап тилде жазсаңыз, анда аны байкабай туруп, аны статикалык анализатордон өткөрүп жибердиңиз. Чындыгында, ар кандай заманбап компилятор кичинекей болсо да, коддогу мүмкүн болуучу көйгөйлөр жөнүндө эскертүүлөрдүн топтомун камсыз кылат. Мисалы, Visual Studio'до C++ кодун компиляциялоодо, сиз төмөнкүлөрдү көрө аласыз:

Статикалык анализ – таанышуудан интеграцияга чейин
Бул чыгарууда биз өзгөрмө экенин көрөбүз бар функциянын эч бир жеринде эч качан колдонулган эмес. Демек, сиз дээрлик ар дайым жөнөкөй статикалык код анализаторун колдонгонсуз. Бирок, 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). Visual Studio'догу PVS-Studio учурда, сиз окшош сүрөттү көрөсүз (чыкылдатуучу):

Статикалык анализ – таанышуудан интеграцияга чейин
Кеп, статикалык анализаторлор, адатта, чоң коддук базасы бар долбоорлор үчүн көп сандагы эскертүүлөрдү беришет. Алардын бардыгын оңдоонун кереги жок, анткени сиздин долбооруңуз иштеп жатат, демек, бул көйгөйлөр маанилүү эмес. Бирок, сен эң кызыктуу эскертүүлөрдү карасаңыз болот жана зарыл болсо, аларды оңдоо. Бул үчүн, сиз чыгарууну чыпкалап, эң ишенимдүү билдирүүлөрдү гана калтырышыңыз керек. Visual Studio үчүн PVS-Studio плагинде бул каталардын деңгээли жана категориялары боюнча чыпкалоо аркылуу ишке ашырылат. Эң так чыгаруу үчүн гана калтырыңыз бийик и жалпы (ошондой эле чыкылдатуу):

Статикалык анализ – таанышуудан интеграцияга чейин
Чынында эле, 178 эскертүүлөрдү көрүү бир нече миңдегенге караганда бир топ оңой...

Өтмөктө орто и төмөн көп учурда жакшы эскертүүлөр бар, бирок бул категорияларга азыраак тактык (ишенимдүүлүк) ээ болгон диагностика кирет. Эскертүү деңгээли жана Windows менен иштөө параметрлери жөнүндө көбүрөөк маалыматты бул жерден тапсаңыз болот: *ыйлоо*.

Эң кызыктуу каталарды (жана аларды ийгиликтүү оңдоп) карап чыгып, татыктуу калган эскертүүлөрдү басуу. Бул жаңы эскертүүлөр эскилердин арасында жоголуп кетпеши үчүн зарыл. Мындан тышкары, статикалык анализатор каталардын тизмеси эмес, программист үчүн жардамчы болуп саналат. 🙂

1. Автоматташтыруу

Бири-бири менен таанышкандан кийин, плагиндерди орнотууга жана CIге интеграциялоого убакыт келди. Бул программисттер статикалык анализаторду колдоно баштаганга чейин жасалышы керек. Чындыгында, программист анализди күйгүзүүнү унутушу мүмкүн же такыр каалабашы мүмкүн. Бул үчүн, текшерилбеген код жалпы өнүгүү тармагына кире албашы үчүн, бардыгын акыркы текшерүүдөн өткөрүшүңүз керек.

Бул этапта сиз эмнени үйрөнөсүз:

  • курал кандай автоматташтыруу параметрлерин камсыз кылат;
  • Анализатор куруу тутумуңузга туура келеби?

Кемчиликсиз документтер жок болгондуктан, кээде жазууга туура келет колдоо. Бул нормалдуу көрүнүш жана биз сизге жардам берүүгө кубанычтабыз. 🙂

Эми үзгүлтүксүз интеграция (CI) кызматтарына өтөбүз. Аларда кандайдыр бир анализатор эч кандай олуттуу көйгөйлөрсүз ишке ашырылышы мүмкүн. Бул үчүн, адатта, куруу жана бирдиги сыноолор кийин жайгашкан түтүк өзүнчө этапты түзүү керек. Бул ар кандай консолдук программаларды колдонуу менен ишке ашырылат. Мисалы, PVS-Studio төмөнкү кызматтарды камсыз кылат:

Анализди CIге интеграциялоо үчүн сиз үч нерсени кылышыңыз керек:

  • Анализаторду орнотуу;
  • Талдоо жүргүзүү;
  • Натыйжаларды берүү.

Мисалы, Linux (Debian-базасы) боюнча PVS-Studio орнотуу үчүн, төмөнкү буйруктарды аткаруу керек:

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

Сиз Windows системаларында PVS-Studio орнотуу жөнүндө көбүрөөк окуй аласыз *бул жерде*.

Орнотуудан кийин, сиз түздөн-түз талдоо жүргүзүү керек. Бирок, бул компиляция жана сыноолор өткөндөн кийин гана сунуш кылынат. Себеби статикалык талдоо адатта компиляциядан эки эсе көп убакытты талап кылат.

Ишке киргизүү ыкмасы платформага жана долбоордун өзгөчөлүктөрүнө жараша болгондуктан, мен мисал катары 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) же"Travis CIде PVS-Студиону кантип орнотуу керек" (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 Studio, ИДЕЯ, чабандес жана башкалар

3. Күнүмдүк колдонуу

Бул этапта, күнүмдүк колдонууда анализаторду тездетүү жолдору жөнүндө бир нече сөз айтууга убакыт жетти. Бүткүл долбоордун толук анализи өтө көп убакытты талап кылат, бирок биз бүтүндөй долбоордо кодду бир эле учурда канчалык көп өзгөртөбүз? Бүткүл код базасына дароо таасир эте тургандай масштабдуу рефакторинг жок. Бир убакта өзгөртүлүп жаткан файлдардын саны ондон ашат, ошондуктан аларды талдап чыгуунун мааниси бар. Мындай кырдаал үчүн, бар кошумча талдоо режими. Жөн гана коркпоңуз, бул жөн эле башка курал эмес. Бул өзгөртүлгөн файлдарды жана алардын көз карандылыктарын гана талдап чыгууга мүмкүндүк берген атайын режим жана эгер сиз плагин орнотулган IDEде иштеп жатсаңыз, бул түзүүдөн кийин автоматтык түрдө ишке ашат.

Эгерде анализатор жакында өзгөртүлгөн коддон көйгөйлөрдү тапса, ал өз алдынча кабарлайт. Мисалы, PVS-Studio сизге билдирүү менен бул тууралуу айтып берет:

Статикалык анализ – таанышуудан интеграцияга чейин
Иштеп чыгуучуларга куралды колдонууну айтуу жетишсиз экени айтпаса да түшүнүктүү. Сиз кандайдыр бир жол менен аларга жалпысынан эмне жана ал кандай экенин айтып беришиңиз керек. Мисалы, бул жерде PVS-Studio үчүн тез баштоо жөнүндө макалалар бар, бирок сиз каалаган курал үчүн окшош окуу куралдарын таба аласыз:

Мындай макалалар күнүмдүк колдонууга керектүү маалыматтардын баарын берет жана көп убакытты талап кылбайт. 🙂

Курал менен таанышуу стадиясында да, биз биринчи ишке киргизүүнүн биринде көптөгөн эскертүүлөрдү бастык. Тилекке каршы, статикалык анализаторлор идеалдуу эмес, ошондуктан алар мезгил-мезгили менен жалган позитивдерди беришет. Адатта, аларды басуу оңой, мисалы, Visual Studio үчүн PVS-Studio плагинде, жөн гана бир баскычты чыкылдатыңыз:

Статикалык анализ – таанышуудан интеграцияга чейин
Бирок, сиз аларды басуу менен эле чектелбестен дагы көптү кыла аласыз. Мисалы, көйгөйдү колдоо кызматына билдире аласыз. Эгер жалган позитивди оңдоого мүмкүн болсо, анда келечектеги жаңыртууларда сиз код базасына мүнөздүү жалган позитивдердин азайып баратканын байкай аласыз.

Интеграциядан кийин

Ошентип, биз иштеп чыгуу процессине статикалык анализди интеграциялоонун бардык этаптарынан өттүк. CIде мындай куралдарды орнотуунун маанилүүлүгүнө карабастан, эң маанилүү ишке киргизүү сайты иштеп чыгуучунун компьютери болуп саналат. Анткени, статикалык анализатор сизден алыс жерде код жакшы эмес деп айткан сот эмес. Тескерисинче, чарчаганыңызды айтып, бир нерсени унутуп калганыңызды эскертип турган жардамчы.

Ырас, үзгүлтүксүз колдонуусуз, статикалык талдоо өнүгүүнү абдан жөнөкөйлөтүшү күмөн. Анткени, анын иштеп чыгуучу үчүн негизги пайдасы татаал жана талаштуу код бөлүмдөрүн издөөдө эмес, аларды эрте аныктоодо. Түзөтүүлөр тестирлөөгө кеткенде көйгөйдү табуу жагымсыз гана эмес, ошондой эле өтө узакка созулганына кошулам. Статикалык талдоо, тескерисинче, үзгүлтүксүз колдонулганда, компьютериңиздеги ар бир өзгөрүүнү карап, код менен иштөөдө шектүү жерлерди кабарлайт.

Эгер сиз же сиздин кесиптештериңиз дагы эле анализаторду ишке ашыруунун кереги барбы же жокпу, аны билбей жатсаңыз, анда мен сизге азыр макаланы окууга өтүүнү сунуштайм "PVS-Studio статикалык код анализаторун иштеп чыгуу процессине киргизүүнүн себептери". Бул статикалык талдоо алардын убактысын жана башкаларды талап кылат деп иштеп чыгуучулардын типтүү тынчсызданууларын талдайт.

Статикалык анализ – таанышуудан интеграцияга чейин

Бул макаланы англис тилдүү аудитория менен бөлүшкүңүз келсе, котормо шилтемесин колдонуңуз: Максим Звягинцев. Статикалык талдоо: Баштоодон баштап интеграцияга чейин.

Source: www.habr.com

Комментарий кошуу