{"id":32848,"date":"2019-10-31T21:49:16","date_gmt":"2019-10-31T18:49:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\/"},"modified":"2019-10-31T21:49:16","modified_gmt":"2019-10-31T18:49:16","slug":"vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Implementoni analiz\u00ebn statike n\u00eb proces, e jo ta k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur bugin\u00eb.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00eb shtyu t\u00eb shkruaj k\u00ebt\u00eb artikull nj\u00eb sasi e madhe materiali mbi analiz\u00ebn statike q\u00eb po dalin gjithnj\u00eb e m\u00eb shum\u00eb para syve. S\u00eb pari, \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">blogu i PVS-studio<\/a><\/noindex>, i cili e promovon aktivisht veten n\u00eb Habr duke ofruar pasqyrime t\u00eb gabimeve t\u00eb zbuluara nga instrumenti i tyre n\u00eb projekte me kod t\u00eb hapur. S\u00eb fundmi, PVS-studio implementoi <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">mb\u00ebshtetje p\u00ebr Java<\/a><\/noindex>, dhe, sigurisht, zhvilluesit e IntelliJ IDEA, i cili p\u00ebrfshin nj\u00eb analizues t\u00eb integruar q\u00eb \u00ebsht\u00eb sot, ndoshta, m\u00eb i avancuari p\u00ebr Java, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">nuk mund t\u00eb q\u00ebndrojn\u00eb jasht\u00eb<\/a><\/noindex>. <\/p>\n<p>Kur lexoni t\u00eb tilla pasqyrime, ndiheni sikur flitet p\u00ebr nj\u00eb eliksir magjik: goditni butonin, dhe ja, lista e defekteve para syve tuaj. Duket se me p\u00ebrmir\u00ebsimin e analizuesve, gabimet do t\u00eb gjejn\u00eb gjithnj\u00eb e m\u00eb shum\u00eb dhe produktet e skanuara nga k\u00ebta robota do t\u00eb b\u00ebhen gjithnj\u00eb e m\u00eb t\u00eb mira, pa ndonj\u00eb angazhim nga ana jon\u00eb.<\/p>\n<p>Por nuk ka eliksir\u00eb magjike. D\u00ebshiroj t\u00eb flas p\u00ebr at\u00eb q\u00eb zakonisht nuk diskutohet n\u00eb postime si \u00abja \u00e7far\u00eb mund t\u00eb gjej\u00eb roboti yn\u00eb\u00bb: \u00e7far\u00eb nuk mund t\u00eb realizojn\u00eb analizuesit, \u00e7far\u00eb \u00ebsht\u00eb roli dhe vendi i tyre t\u00eb v\u00ebrtet\u00eb n\u00eb procesin e dor\u00ebzimit t\u00eb softuerit, dhe si t'i implementojm\u00eb ata si\u00e7 duhet.<\/p>\n<p><img decoding=\"async\" alt=\"Implementoni analiz\u00ebn statike n\u00eb proces, e jo ta k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur bugin\u00eb.\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Mekanik\u00eb (burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%B0%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC#\/media\/File:Sperrklinke_Schema.svg\">wikipedia<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u00c7far\u00eb nuk do t\u00eb mund t\u00eb realizojn\u00eb kurr\u00eb analizuesit statik\u00eb<\/h2>\n<p>\n\u00c7far\u00eb \u00ebsht\u00eb, nga nj\u00eb k\u00ebndv\u00ebshtrim praktik, analiza e kodit burimor? Ne i dor\u00ebzojm\u00eb disa burime kodimi, dhe brenda nj\u00eb kohe t\u00eb shkurt\u00ebr (duke qen\u00eb shum\u00eb m\u00eb e shkurt\u00ebr se sa p\u00ebr t\u00eb kaluar testet) marrim disa informacione mbi sistemin ton\u00eb. Kufizimi themelor dhe matematikor \u00ebsht\u00eb, q\u00eb si rezultat mund t\u00eb marrim vet\u00ebm nj\u00eb klas\u00eb t\u00eb ngusht\u00eb informacioni.<\/p>\n<p>Shembulli m\u00eb i njohur i nj\u00eb problematike q\u00eb nuk zgjidhet p\u00ebrmes analiz\u00ebs statike \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">problemi i ndalimit<\/a><\/noindex>: kjo \u00ebsht\u00eb nj\u00eb teorem\u00eb q\u00eb provon se \u00ebsht\u00eb e pamundur t\u00eb zhvillohet nj\u00eb algorit\u00ebm t\u00ebr\u00ebsor q\u00eb do t\u00eb p\u00ebrcaktonte, p\u00ebrmes kodit burimor t\u00eb programit, n\u00ebse ajo do t\u00eb b\u00ebnte nj\u00eb cik\u00ebl apo do t\u00eb p\u00ebrfundonte n\u00eb nj\u00eb koh\u00eb t\u00eb kufizuar. Zgjatja e k\u00ebtij teoremi \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">teorema e Raisa<\/a><\/noindex>, e cila thot\u00eb se p\u00ebr \u00e7do pron\u00eb jo triviale t\u00eb funksioneve t\u00eb llogaritshme, p\u00ebrcaktimi i asaj q\u00eb do t\u00eb llogariste nj\u00eb program i caktuar me at\u00eb pron\u00eb \u00ebsht\u00eb nj\u00eb detyr\u00eb algoritmikisht e pakapshme. P\u00ebr shembull, \u00ebsht\u00eb e pamundur t\u00eb shkruash nj\u00eb analizues q\u00eb, p\u00ebr \u00e7do kod burimor, t\u00eb p\u00ebrcaktoj\u00eb n\u00ebse programi i analizuar \u00ebsht\u00eb nj\u00eb implementim i nj\u00eb algoritmi q\u00eb llogarit, le t\u00eb themi, ngritjen n\u00eb kat\u00ebr t\u00eb nj\u00eb numri t\u00eb plot\u00eb.<\/p>\n<p>Prandaj, funksionaliteti i analizuesve statik\u00eb ka kufizime t\u00eb pakapshme. Nj\u00eb analizues statik kurr\u00eb nuk do t\u00eb mund t\u00eb p\u00ebrcaktoj\u00eb n\u00eb t\u00eb gjitha rastet gj\u00ebra si, p\u00ebr shembull, shfaqja e \u00abnull pointer exception\u00bb n\u00eb gjuh\u00ebt q\u00eb lejojn\u00eb vler\u00ebn null, ose n\u00eb t\u00eb gjitha rastet t\u00eb p\u00ebrcaktoj\u00eb shfaqjen e \u00abattribute not found\u00bb n\u00eb gjuh\u00ebt me tipizim dinamik. E gjith\u00eb ajo q\u00eb mund t\u00eb b\u00ebj\u00eb nj\u00eb analizues statik m\u00eb i avancuar \u00ebsht\u00eb t\u00eb theksoj\u00eb raste t\u00eb ve\u00e7anta, numri i t\u00eb cilave midis t\u00eb gjitha problemeve t\u00eb mundshme me kodin tuaj burimor \u00ebsht\u00eb, pa e tepruar, nj\u00eb pik\u00eb n\u00eb det.<\/p>\n<h2>Analiza statike nuk \u00ebsht\u00eb gjetje e gabimeve<\/h2>\n<p>\nNga e gjith\u00eb kjo mund t\u00eb p\u00ebrfundojm\u00eb se analiza statike nuk \u00ebsht\u00eb nj\u00eb mjet p\u00ebr t\u00eb zvog\u00ebluar numrin e defekteve n\u00eb program. Do t\u00eb guxoja t\u00eb thoja: kur aplikoni p\u00ebr her\u00eb t\u00eb par\u00eb n\u00eb projektin tuaj, do t\u00eb gjej\u00eb vende \u00abinteresante\u00bb n\u00eb kod, por, p\u00ebr siguri, nuk do t\u00eb gjej\u00eb asnj\u00eb defekt q\u00eb ndikon n\u00eb cil\u00ebsin\u00eb e funksionimit t\u00eb programit tuaj.<\/p>\n<p>Shembujt e defekteve t\u00eb gjendur automatikisht nga analizuesit jan\u00eb mbres\u00ebl\u00ebn\u00ebs, por nuk duhet t\u00eb harrojm\u00eb se k\u00ebta shembuj jan\u00eb gjetur p\u00ebrmes skanimit t\u00eb nj\u00eb grupi t\u00eb madh t\u00eb bazave t\u00eb kodit. Po ashtu, hakerat q\u00eb kan\u00eb mund\u00ebsin\u00eb t\u00eb provonin disa fjal\u00ebkalime t\u00eb thjeshta n\u00eb nj\u00eb num\u00ebr t\u00eb madh llogarish, p\u00ebrfundimisht gjejn\u00eb ato llogari ku ka nj\u00eb fjal\u00ebkalim t\u00eb thjesht\u00eb.<\/p>\n<p>A do t\u00eb thot\u00eb kjo se analiza statike nuk duhet aplikuar? Sigurisht q\u00eb jo! Dhe p\u00ebr t\u00eb nj\u00ebjt\u00ebn arsye, p\u00ebr t\u00eb cil\u00ebn duhet kontrolluar \u00e7do fjal\u00ebkalim t\u00eb ri p\u00ebr t\u00eb par\u00eb n\u00ebse ai p\u00ebrfshihet n\u00eb list\u00ebn e \u00abfjal\u00ebkalimeve t\u00eb zakonshme\u00bb.<\/p>\n<h2>Analiza statike \u00ebsht\u00eb m\u00eb shum\u00eb se gjetja e gabimeve<\/h2>\n<p>\nN\u00eb t\u00eb v\u00ebrtet\u00eb, detyrat q\u00eb mund t\u00eb analizohet jan\u00eb shum\u00eb m\u00eb t\u00eb gjera. Sepse n\u00eb p\u00ebrgjith\u00ebsi, analiza statike \u00ebsht\u00eb \u00e7do kontroll i burimeve q\u00eb b\u00ebhet para nisjes s\u00eb tyre. K\u00ebtu jan\u00eb disa gj\u00ebra q\u00eb mund t\u00eb b\u00ebjm\u00eb:<\/p>\n<ul>\n<li> Kontrolli i stilit t\u00eb kodimit n\u00eb nj\u00eb kuptim t\u00eb gjer\u00eb. Kjo p\u00ebrfshin si verifikimin e formatimit ashtu edhe k\u00ebrkimin e p\u00ebrdorimeve t\u00eb parashkruara\/tepruara, vendosjen e pragjeve p\u00ebr metrikat si numri i linjave \/ kompleksiteti ciklomatik i metod\u00ebs, etj. \u2014 gjith\u00e7ka q\u00eb mund t\u00eb ndihmoj\u00eb n\u00eb lexueshm\u00ebrin\u00eb dhe mir\u00ebmbajtjen e kodit. N\u00eb Java, nj\u00eb mjet i till\u00eb \u00ebsht\u00eb Checkstyle, n\u00eb Python \u2014 flake8. Programet e k\u00ebtij lloji zakonisht quhen \"linters\".<\/li>\n<li>Analiza mund t\u00eb p\u00ebrfshij\u00eb jo vet\u00ebm kodin e ekzekutuesh\u00ebm. Skedar\u00ebt e burimeve, si JSON, YAML, XML, .properties mund (dhe duhet!) t\u00eb kontrollohen automatikisht p\u00ebr vlefshm\u00ebri. Pse \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb dihet n\u00eb nj\u00eb faz\u00eb t\u00eb hershme t\u00eb verifikimit automatike t\u00eb Pull Request se struktura e JSON \u00ebsht\u00eb prishur p\u00ebr shkak t\u00eb ndonj\u00eb thyerjeje \u00e7ift, sesa kur t\u00eb ekzekutohen testet ose n\u00eb koh\u00eb ekzekutimi? Mjetet p\u00ebrkat\u00ebse ekzistojn\u00eb: p\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/adrienverge\/yamllint\">YAMLlint<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zaach\/jsonlint\">JSONLint<\/a><\/noindex>.<\/li>\n<li> Kompilimi (ose analizimi p\u00ebr gjuh\u00ebt e programimit dinamik) \u00ebsht\u00eb gjithashtu nj\u00eb lloj analize statike. N\u00eb p\u00ebrgjith\u00ebsi, kompiluesit jan\u00eb n\u00eb gjendje t\u00eb japin paralajm\u00ebrime q\u00eb sinjalizojn\u00eb probleme me cil\u00ebsin\u00eb e kodit burimor, dhe ato nuk duhet t\u00eb injorohen.<\/li>\n<li>Ndonj\u00ebher\u00eb kompilimi nuk \u00ebsht\u00eb vet\u00ebm kompilimi i kodit t\u00eb ekzekutuesh\u00ebm. P\u00ebr shembull, n\u00ebse keni dokumentacionin n\u00eb formatin <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, n\u00eb momentin e konvertimit t\u00eb saj n\u00eb HTML\/PDF, p\u00ebrpunuesi AsciiDoctor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven plugin<\/a><\/noindex>) mund t\u00eb jap\u00eb paralajm\u00ebrime, p\u00ebr shembull, p\u00ebr lidhjet e brendshme t\u00eb prishura. Dhe kjo \u00ebsht\u00eb nj\u00eb arsye e r\u00ebnd\u00ebsishme p\u00ebr t\u00eb mos pranuar Pull Request me ndryshimet n\u00eb dokumentacion.<\/li>\n<li>Kontrolli i ortografis\u00eb \u00ebsht\u00eb gjithashtu nj\u00eb lloj analize statike. Mjeti <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> \u00ebsht\u00eb n\u00eb gjendje t\u00eb kontrolloj\u00eb ortografin\u00eb jo vet\u00ebm n\u00eb dokumentacion, por edhe n\u00eb kodet burimore t\u00eb programeve (komentet dhe literalet) n\u00eb gjuh\u00eb t\u00eb ndryshme programimi, duke p\u00ebrfshir\u00eb C\/C++, Java dhe Python. Nj\u00eb gabim ortografie n\u00eb nd\u00ebrfaqen e p\u00ebrdoruesit ose n\u00eb dokumentacion \u00ebsht\u00eb gjithashtu nj\u00eb defekt!<\/li>\n<li>Testet e konfigurimit (p\u00ebr informacion se \u00e7far\u00eb \u00ebsht\u00eb kjo \u2014 shih <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">k\u00ebt\u00eb<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">k\u00ebt\u00eb<\/a><\/noindex> raportet), megjithat\u00eb kryhen n\u00eb mjedisin e ekzekutimit t\u00eb testeve moduluese t\u00eb tipit pytest, n\u00eb t\u00eb v\u00ebrtet\u00eb jan\u00eb gjithashtu nj\u00eb lloj analize statike, pasi nuk ekzekutojn\u00eb kodet burimore gjat\u00eb zhvillimit t\u00eb tyre.<\/li>\n<\/ul>\n<p>\nSi\u00e7 e shohim, k\u00ebrkimi i gabimeve n\u00eb k\u00ebt\u00eb list\u00eb luan rol m\u00eb pak t\u00eb r\u00ebnd\u00ebsish\u00ebm, nd\u00ebrsa gjith\u00e7ka tjet\u00ebr \u00ebsht\u00eb e aksesueshme p\u00ebrmes p\u00ebrdorimit t\u00eb mjeteve open source falas.<\/p>\n<p>Cilat nga k\u00ebto lloje analize statike duhet t\u00eb aplikoni n\u00eb projektin tuaj? Sigurisht, t\u00eb gjitha; sa m\u00eb shum\u00eb, aq m\u00eb mir\u00eb! E r\u00ebnd\u00ebsishme \u00ebsht\u00eb ta implementoni si\u00e7 duhet, p\u00ebr \u00e7far\u00eb do t\u00eb flasim m\u00eb tej.<\/p>\n<h2>Tubi i shp\u00ebrndarjes si nj\u00eb filtrues me shum\u00eb hapa dhe analiza statike si kaskad\u00ebn e saj t\u00eb par\u00eb<\/h2>\n<p>\nMetafora klasike e integrimit continu \u00ebsht\u00eb tubi (pipeline), n\u00ebp\u00ebr t\u00eb cilin kalojn\u00eb ndryshimet \u2014 nga ndryshimi i kodit burimor deri n\u00eb dor\u00ebzimin n\u00eb prodhim. Sekuenca standarde e fazave t\u00eb k\u00ebtij tubi duket k\u00ebshtu:<\/p>\n<ol>\n<li>analiza statike<\/li>\n<li>kompilimi<\/li>\n<li>testet moduluese<\/li>\n<li>testet integruese<\/li>\n<li>testet UI<\/li>\n<li>kontrolli manual<\/li>\n<\/ol>\n<p>\nNdryshimet e refuzuara n\u00eb hapin N t\u00eb tubit nuk kalojn\u00eb n\u00eb hapin N+1.<\/p>\n<p>Pse k\u00ebshtu, e jo ndryshe? N\u00eb at\u00eb pjes\u00eb t\u00eb tubit q\u00eb ka t\u00eb b\u00ebj\u00eb me testimin, testuesit njohin piramid\u00ebn e testimit.<\/p>\n<p><img decoding=\"async\" alt=\"Implementoni analiz\u00ebn statike n\u00eb proces, e jo ta k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur bugin\u00eb.\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pirouza e testeve. Burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">artikull<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>N\u00eb pjes\u00ebn e poshtme t\u00eb k\u00ebsaj piramide ndodhen testet, t\u00eb cilat jan\u00eb m\u00eb t\u00eb lehta p\u00ebr t'u shkruar, q\u00eb ekzekutohen m\u00eb shpejt dhe nuk kan\u00eb tendenc\u00eb p\u00ebr falsifikim. Prandaj, duhet t\u00eb jen\u00eb m\u00eb t\u00eb shumt\u00eb, duhet t\u00eb mbulojn\u00eb m\u00eb shum\u00eb kod dhe t\u00eb ekzekutohen t\u00eb parat. N\u00eb pjes\u00ebn e sip\u00ebrme t\u00eb piramid\u00ebs, situata \u00ebsht\u00eb e kund\u00ebrt, prandaj numri i testeve integruese dhe UI duhet t\u00eb zvog\u00eblohet n\u00eb minimumin e nevojsh\u00ebm. Njeriu n\u00eb k\u00ebt\u00eb zinxhir \u00ebsht\u00eb burimi m\u00eb i shtrenjt\u00eb, m\u00eb i ngadalsh\u00ebm dhe m\u00eb i pasigurt, prandaj ai ndodhet n\u00eb fund dhe b\u00ebn pun\u00ebn vet\u00ebm n\u00eb rast se fazat e m\u00ebparshme nuk zbuluan asnj\u00eb defekt. Megjithat\u00eb, sipas t\u00eb nj\u00ebjtave parime nd\u00ebrtohet tubi edhe n\u00eb pjes\u00eb q\u00eb nuk lidhen drejtp\u00ebrdrejt me testimin!<\/p>\n<p>Do doja t\u00eb sugjeroja nj\u00eb analogji n\u00eb form\u00ebn e nj\u00eb sistemi filtrimi me shum\u00eb hapa. N\u00eb hyrje hyn nj\u00eb uj\u00eb i ndotur (ndryshime me defekte), dhe n\u00eb dalje duhet t\u00eb marrim uj\u00eb t\u00eb past\u00ebr, t\u00eb gjith\u00eb ndotjet e pad\u00ebshiruara t\u00eb cilave jan\u00eb filtra.<\/p>\n<p><img decoding=\"async\" alt=\"Implementoni analiz\u00ebn statike n\u00eb proces, e jo ta k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur bugin\u00eb.\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Filtri me shum\u00eb hapa. Burimi: <noindex><a rel=\"nofollow\" href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Milli-Q_Water_filtration_station.JPG\">Wikimedia Commons<\/a><\/noindex><\/i><\/p>\n<p>Si dihet, filtrat e pastruesve projektohen n\u00eb m\u00ebnyr\u00eb q\u00eb \u00e7do kaskad e m\u00ebtejshme t\u00eb mund t\u00eb filtroj\u00eb fraksione gjithnj\u00eb e m\u00eb t\u00eb imta t\u00eb ndotjes. Kjo do t\u00eb thot\u00eb se kaskadat m\u00eb t\u00eb gjera t\u00eb pastrimit kan\u00eb kapacitet m\u00eb t\u00eb madh kalues dhe kosto m\u00eb t\u00eb ul\u00ebt. N\u00eb analogjin\u00eb ton\u00eb, ky do t\u00eb thot\u00eb se portat e cil\u00ebsis\u00eb hyr\u00ebse kan\u00eb performanc\u00eb m\u00eb t\u00eb lart\u00eb, k\u00ebrkojn\u00eb m\u00eb pak p\u00ebrpjekje p\u00ebr t'u aktivizuar dhe vet\u00eb jan\u00eb m\u00eb t\u00eb thjeshta n\u00eb funksionim \u2014 dhe ato jan\u00eb t\u00eb radhitura n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb. Roli i analiz\u00ebs statike, e cila, si\u00e7 e kuptojm\u00eb tani, mund t\u00eb filtroj\u00eb vet\u00ebm defektet m\u00eb t\u00eb dukshme, \u00ebsht\u00eb roli i gril\u00ebs \"ndot\u00ebs\" n\u00eb fillim t\u00eb kaskad\u00ebs s\u00eb filtrave.<\/p>\n<p>Analiza statike vet\u00eb nuk p\u00ebrmir\u00ebson cil\u00ebsin\u00eb e produktit p\u00ebrfundimtar, ashtu si \"ndot\u00ebsi\" nuk e b\u00ebn uj\u00ebn t\u00eb pijshme. Megjithat\u00eb, n\u00eb lidhje me element\u00ebt e tjer\u00eb t\u00eb procesit, r\u00ebnd\u00ebsia e saj \u00ebsht\u00eb e qart\u00eb. Edhe pse n\u00eb filtrin me shum\u00eb kaskada, kaskadat e daljes potencialisht mund t\u00eb kapin t\u00eb nj\u00ebjtat gj\u00ebra si kaskadat hyr\u00ebse \u2014 \u00ebsht\u00eb e qart\u00eb se \u00e7far\u00eb pasojash do t\u00eb kishte p\u00ebrpjekja p\u00ebr t'u mb\u00ebshtetur vet\u00ebm n\u00eb kaskadat e pastrimit t\u00eb holl\u00eb, pa kaskadat hyr\u00ebse.<\/p>\n<p>Q\u00ebllimi i \"ndot\u00ebsit\" \u00ebsht\u00eb t\u00eb leht\u00ebsoj\u00eb kaskadat e m\u00ebvonshme nga kapja e defekteve shum\u00eb t\u00eb dukshme. P\u00ebr shembull, t\u00eb pakt\u00ebn, nj\u00eb njeri q\u00eb b\u00ebn rishikimin e kodit nuk duhet t\u00eb shqet\u00ebsohet p\u00ebr kodin e keqformatuar dhe shkeljet e standardeve t\u00eb kodimit (si\u00e7 jan\u00eb skedar\u00ebt e tep\u00ebrt ose rrjedhat e thella t\u00eb t\u00eb dh\u00ebnave). Gabimet si NPE duhet t\u00eb kapen nga testet modulare, por n\u00ebse analisti na tregon se nj\u00eb gabim do t\u00eb ndodh\u00eb para se t\u00eb testojm\u00eb \u2014 kjo e p\u00ebrshpejton ndjesh\u00ebm rregullimin e tij.<\/p>\n<p>Mendoj se tani \u00ebsht\u00eb e qart\u00eb pse analiza statike nuk p\u00ebrmir\u00ebson cil\u00ebsin\u00eb e produktit, kur aplikohet episodikisht, dhe duhet t\u00eb aplikohet vazhdimisht p\u00ebr t\u00eb filtruar ndryshimet me defekte t\u00eb dukshme. Pyetja, n\u00ebse p\u00ebrdorimi i analiz\u00ebs statike do t\u00eb p\u00ebrmir\u00ebsoj\u00eb cil\u00ebsin\u00eb e produktit tuaj, \u00ebsht\u00eb af\u00ebrsisht ekuivalente me pyetjen \"a do t\u00eb p\u00ebrmir\u00ebsohen cil\u00ebsit\u00eb e ujit t\u00eb pijsh\u00ebm, n\u00ebse e kalojm\u00eb at\u00eb p\u00ebrmes nj\u00eb sita?\"<\/p>\n<h2>Integrimi n\u00eb projektin legacy<\/h2>\n<p>\nNj\u00eb pyetje praktike e r\u00ebnd\u00ebsishme: si t\u00eb integrohet analiza statike n\u00eb procesin e integrimit t\u00eb vazhduesh\u00ebm si \"porta cil\u00ebsie\"? N\u00eb rastin e testeve automatike, gjith\u00e7ka \u00ebsht\u00eb e qart\u00eb: ka nj\u00eb grup testesh, r\u00ebnia e ndonj\u00ebrit prej tyre \u00ebsht\u00eb nj\u00eb arsye e mjaftueshme p\u00ebr t\u00eb konsideruar se nd\u00ebrtimi nuk ka kaluar port\u00ebn e cil\u00ebsis\u00eb. P\u00ebrpjekja p\u00ebr t\u00eb vendosur nj\u00eb port\u00eb n\u00eb p\u00ebrfundimet e analiz\u00ebs statike d\u00ebshton: n\u00eb kodin legacy ka shum\u00eb paralajm\u00ebrime dhe nuk d\u00ebshirohet t\u00eb injorohen plot\u00ebsisht ato, por gjithashtu nuk \u00ebsht\u00eb e mundur t\u00eb ndalet shp\u00ebrndarja e produktit vet\u00ebm sepse ka paralajm\u00ebrime nga analisti.<\/p>\n<p>Duke u aplikua p\u00ebr her\u00eb t\u00eb par\u00eb, n\u00eb \u00e7do projekt analisti jep nj\u00eb sasi t\u00eb madhe paralajm\u00ebrimesh, shumica prej t\u00eb cilave nuk kan\u00eb lidhje me funksionimin e duhur t\u00eb produktit. Nuk \u00ebsht\u00eb e mundur t\u00eb rregullohen menj\u00ebher\u00eb t\u00eb gjitha k\u00ebto v\u00ebrejtje, dhe p\u00ebr disa \u2014 nuk \u00ebsht\u00eb e nevojshme. N\u00eb fund t\u00eb fundit, ne e dim\u00eb se produkti yn\u00eb n\u00eb p\u00ebrgjith\u00ebsi funksionon, madje edhe para aplikimit t\u00eb analiz\u00ebs statike!<\/p>\n<p>Si rezultat, shum\u00eb njer\u00ebz kufizohen n\u00eb p\u00ebrdorimin episodik t\u00eb analiz\u00ebs statike, ose e p\u00ebrdorin at\u00eb vet\u00ebm n\u00eb m\u00ebnyr\u00eb informuese, kur gjat\u00eb nd\u00ebrtimit thjesht jepet nj\u00eb raport i analistit. Kjo \u00ebsht\u00eb ekuivalente me munges\u00ebn e \u00e7do analize, sepse n\u00ebse kemi tashm\u00eb shum\u00eb paralajm\u00ebrime, at\u00ebher\u00eb shfaqja e nj\u00eb tjet\u00ebr (sa do e r\u00ebnd\u00ebsishme) gjat\u00eb ndryshimit t\u00eb kodit mbetet e pap\u00ebrceptuar.<\/p>\n<p>Metodat e njohura p\u00ebr vendosjen e portave t\u00eb cil\u00ebsis\u00eb jan\u00eb:<\/p>\n<ul>\n<li>Vendosja e nj\u00eb kufiri p\u00ebr numrin total t\u00eb paralajm\u00ebrimeve ose numrin e paralajm\u00ebrimeve t\u00eb ndara nga numri i rreshtave t\u00eb kodit. Kjo punon keq, sepse nj\u00eb e till\u00eb port\u00eb leht\u00eb kalon ndryshimet me defekte t\u00eb reja derisa kufiri i saj t\u00eb tejkalohet.<\/li>\n<li>Identifikimi, n\u00eb nj\u00eb moment t\u00eb caktuar, i t\u00eb gjitha paralajm\u00ebrimeve t\u00eb vjetra n\u00eb kod si t\u00eb injoruara, dhe ndalimi i nd\u00ebrtimit n\u00eb rast t\u00eb shfaqjes s\u00eb paralajm\u00ebrimeve t\u00eb reja. Kjo funksionalitet ofrohet nga PVS-studio dhe disa burime online, si p.sh. Codacy. Nuk kam pasur mund\u00ebsin\u00eb t\u00eb punoj n\u00eb PVS-studio, sa i p\u00ebrket p\u00ebrvoj\u00ebs time me Codacy, problemi kryesor \u00ebsht\u00eb se p\u00ebrcaktimi i asaj q\u00eb \u00ebsht\u00eb \"gabimi i vjet\u00ebr\", dhe \u00e7far\u00eb \u00ebsht\u00eb \"gabimi i ri\" \u2014 \u00ebsht\u00eb nj\u00eb algorit\u00ebm mjaft i komplikuar dhe jo gjithmon\u00eb funksionon si\u00e7 duhet, sidomos n\u00ebse skedar\u00ebt ndryshojn\u00eb ose rinovohen shum\u00eb. N\u00eb kujtes\u00ebn time, Codacy mund t\u00eb kishte l\u00ebn\u00eb t\u00eb kalonin paralajm\u00ebrime t\u00eb reja n\u00eb nj\u00eb k\u00ebrkes\u00eb t\u00ebrheq\u00ebse, dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb nuk mund t\u00eb kalonte nj\u00eb k\u00ebrkes\u00eb t\u00ebrheq\u00ebse p\u00ebr shkak t\u00eb paralajm\u00ebrimeve q\u00eb nuk lidhen me ndryshimet n\u00eb kodin e k\u00ebtij PR.<\/li>\n<li>N\u00eb pik\u00ebpamjen time, zgjidhja m\u00eb efektive \u00ebsht\u00eb ajo e p\u00ebrshkruar n\u00eb lib\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Continuous Delivery<\/a><\/noindex> Metoda e xhamit t\u00eb zorr\u00ebs (\"ratcheting\"). Ideja kryesore \u00ebsht\u00eb se \u00e7do version ka nj\u00eb num\u00ebr paralajm\u00ebrimesh nga analiza statike dhe lejojn\u00eb vet\u00ebm ato ndryshime q\u00eb nuk e rrisin numrin e p\u00ebrgjithsh\u00ebm t\u00eb paralajm\u00ebrimeve.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ratcheting<\/h2>\n<p>\nFunksionon k\u00ebshtu:<\/p>\n<ol>\n<li>N\u00eb faz\u00ebn fillestare, regjistrohet n\u00eb metadata p\u00ebr versionin numri i paralajm\u00ebrimeve n\u00eb kod q\u00eb jan\u00eb gjetur nga analizator\u00ebt. N\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb, kur ndodhet nd\u00ebrtimi i deg\u00ebs kryesore, n\u00eb menaxherin tuaj t\u00eb repo regjistrohet jo thjesht \"versioni 7.0.2\", por \"versioni 7.0.2, q\u00eb p\u00ebrmban 100500 paralajm\u00ebrime Checkstyle\". N\u00ebse p\u00ebrdorni nj\u00eb menaxher t\u00eb avancuar repo (si Artifactory), ruajtja e k\u00ebtyre metadatas p\u00ebr versionin tuaj \u00ebsht\u00eb e leht\u00eb.<\/li>\n<li>Tani, \u00e7do pull request gjat\u00eb nd\u00ebrtimit krahason numrin e paralajm\u00ebrimeve q\u00eb rezultojn\u00eb me at\u00eb q\u00eb \u00ebsht\u00eb aktualisht n\u00eb versionin e tanish\u00ebm. N\u00ebse PR shkakton nj\u00eb rritje t\u00eb k\u00ebtij numri, at\u00ebher\u00eb kodi nuk kalon cil\u00ebsin\u00eb p\u00ebrmes analiz\u00ebs statike. N\u00ebse numri i paralajm\u00ebrimeve zvog\u00eblohet ose nuk ndryshon - at\u00ebher\u00eb kalon.<\/li>\n<li>N\u00eb versionin e ardhsh\u00ebm, numri i rip\u00ebrllogaritur i paralajm\u00ebrimeve do t\u00eb regjistrohet p\u00ebrs\u00ebri n\u00eb metadat\u00ebn e versionit.<\/li>\n<\/ol>\n<p>\nK\u00ebshtu, ngadal\u00eb por sigurt (ashtu si\u00e7 funksionon xhami i zorr\u00ebs), numri i paralajm\u00ebrimeve do t\u00eb ket\u00eb tendenc\u00eb t\u00eb shkoj\u00eb drejt zero. Natyrisht, sistemi mund t\u00eb mashtrohet duke shtuar nj\u00eb paralajm\u00ebrim t\u00eb ri, por duke rregulluar nj\u00eb t\u00eb huaj. Kjo \u00ebsht\u00eb n\u00eb rregull, pasi n\u00eb nj\u00eb distanc\u00eb t\u00eb gjat\u00eb jep rezultat: paralajm\u00ebrimet shpesh rregullohen jo individualisht, por menj\u00ebher\u00eb n\u00eb nj\u00eb grup t\u00eb caktuar, dhe t\u00eb gjitha paralajm\u00ebrimet q\u00eb jan\u00eb t\u00eb lehta p\u00ebr t'u eliminuar shpejt b\u00ebhen t\u00eb eliminuara.<\/p>\n<p>N\u00eb k\u00ebt\u00eb grafik tregohet numri total i paralajm\u00ebrimeve Checkstyle p\u00ebr gjasht\u00eb muaj pun\u00eb t\u00eb k\u00ebtij \"ratcheting\" n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">nj\u00eb nga projektet tona OpenSource<\/a><\/noindex>. Numri i paralajm\u00ebrimeve u zvog\u00eblua ndjesh\u00ebm, dhe kjo ndodhi natyrsh\u00ebm, paralelisht me zhvillimin e produktit!<\/p>\n<p><img decoding=\"async\" alt=\"Implementoni analiz\u00ebn statike n\u00eb proces, e jo ta k\u00ebrkoni at\u00eb p\u00ebr t\u00eb gjetur bugin\u00eb.\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn\u00eb aplikoj nj\u00eb version t\u00eb modifikuar t\u00eb k\u00ebsaj metode, duke num\u00ebruar ve\u00e7mas paralajm\u00ebrimet sipas moduleve t\u00eb projektit dhe mjeteve t\u00eb analiz\u00ebs, skedari YAML i formuar me metadat\u00ebn p\u00ebr nd\u00ebrtimin duket pak a shum\u00eb k\u00ebshtu:<\/p>\n<pre><code class=\"plaintext\">celesta-sql:\n  checkstyle: 434\n  spotbugs: 45\ncelesta-core:\n  checkstyle: 206\n  spotbugs: 13\ncelesta-maven-plugin:\n  checkstyle: 19\n  spotbugs: 0\ncelesta-unit:\n  checkstyle: 0\n  spotbugs: 0\n<\/code><\/pre>\n<p>\nN\u00eb \u00e7do sistem CI t\u00eb avancuar, \"ratcheting\" mund t\u00eb realizohet p\u00ebr t\u00eb gjitha mjetet e analiz\u00ebs statike, pa mb\u00ebshtetje n\u00eb plugin\u00eb dhe mjete t\u00eb jashtme. \u00c7do nj\u00eb nga analizator\u00ebt jep raportin e tij n\u00eb nj\u00eb format t\u00eb thjesht\u00eb tekstual ose XML, q\u00eb \u00ebsht\u00eb leht\u00eb i analizuesh\u00ebm. Ngeli t\u00eb shkruhet vet\u00ebm logjika e nevojshme n\u00eb skriptin CI. Mund t\u00eb shikoni se si kjo \u00ebsht\u00eb realizuar n\u00eb projektet tona open source mbi baz\u00ebn e Jenkins dhe Artifactory <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">k\u00ebtu<\/a><\/noindex> ose <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">k\u00ebtu<\/a><\/noindex>. T\u00eb dy shembujt varen nga biblioteka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: metoda <code>countWarnings()<\/code> num\u00ebron n\u00eb m\u00ebnyr\u00eb t\u00eb zakonshme xml-t\u00eb in file q\u00eb gjenerohen nga Checkstyle dhe Spotbugs, nd\u00ebrsa <code>compareWarningMaps()<\/code> implementon at\u00eb xham, duke hapur nj\u00eb gabim n\u00eb rast se numri i paralajm\u00ebrimeve n\u00eb ndonj\u00eb nga kategorit\u00eb rritet.<\/p>\n<p>Nj\u00eb variant interesant i implementimit t\u00eb \"ratcheting\" \u00ebsht\u00eb i mundsh\u00ebm p\u00ebr analizimin e shkrimeve n\u00eb komente, literale tekstuale dhe dokumentacionin me ndihm\u00ebn e aspell. Si\u00e7 dihet, gjat\u00eb kontrollit t\u00eb shkrimit jo t\u00eb gjitha fjal\u00ebt q\u00eb nuk njihen nga fjalori standard jan\u00eb t\u00eb gabuara, ato mund t\u00eb shtohen n\u00eb fjalorin e p\u00ebrdoruesit. N\u00ebse e b\u00ebni fjalorin e p\u00ebrdoruesit pjes\u00eb t\u00eb kodit burimor t\u00eb projektit, at\u00ebher\u00eb porta e cil\u00ebsis\u00eb p\u00ebr shkrimin mund t\u00eb formulohet n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb: ekzekutimi i aspell me fjalorin standard dhe at\u00eb t\u00eb p\u00ebrdoruesit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">nuk duhet<\/a><\/noindex> t\u00eb gjej\u00eb asnj\u00eb gabim n\u00eb shkrim.<\/p>\n<h2>R\u00ebnd\u00ebsia e fiksez\u00ebs s\u00eb versionit t\u00eb analizatorit<\/h2>\n<p>\nN\u00eb p\u00ebrfundim, duhet theksuar se: pa marr\u00eb parasysh se si e futni analiz\u00ebn n\u00eb konvjerin tuaj t\u00eb dor\u00ebzimit, versioni i analizatorit duhet t\u00eb jet\u00eb i fiksuar. N\u00ebse lejoni q\u00eb analizatori t\u00eb p\u00ebrdit\u00ebsohet spontanisht, at\u00ebher\u00eb gjat\u00eb nd\u00ebrtimit t\u00eb \u00e7do pull request mund t\u00eb \"shfaqen\" defekte t\u00eb reja, t\u00eb cilat nuk jan\u00eb t\u00eb lidhura me ndryshimin e kodit, por t\u00eb lidhura me faktin se analizatori i ri thjesht \u00ebsht\u00eb n\u00eb gjendje t\u00eb gjej\u00eb m\u00eb shum\u00eb defekte - dhe kjo do t\u00eb prish\u00eb procesin tuaj t\u00eb pranimit t\u00eb pull request-\u00ebve. P\u00ebrdit\u00ebsimi i analizatorit duhet t\u00eb jet\u00eb nj\u00eb veprim i nd\u00ebrgjegjsh\u00ebm. Megjithat\u00eb, fikseza e fort\u00eb e versionit t\u00eb \u00e7do komponente t\u00eb nd\u00ebrtimit \u00ebsht\u00eb gjithashtu nj\u00eb k\u00ebrkes\u00eb e nevojshme dhe nj\u00eb tem\u00eb p\u00ebr nj\u00eb bised\u00eb t\u00eb ve\u00e7ant\u00eb.<\/p>\n<h2>P\u00ebrfundimet<\/h2>\n<p><\/p>\n<ul>\n<li>Analiza statike nuk do t'ju gjej\u00eb gabit\u00eb dhe nuk do t\u00eb p\u00ebrmir\u00ebsoj\u00eb cil\u00ebsin\u00eb e produktit tuaj si rezultat i nj\u00eb aplikimi nj\u00eb her\u00eb. Efekti pozitiv p\u00ebr cil\u00ebsin\u00eb rezulton vet\u00ebm nga p\u00ebrdorimi i saj t\u00eb vazhduesh\u00ebm gjat\u00eb procesit t\u00eb dor\u00ebzimit.<\/li>\n<li>K\u00ebrkimi i gabive, gjithashtu, nuk \u00ebsht\u00eb detyra kryesore e analiz\u00ebs, shumica e funksioneve t\u00eb dobishme jan\u00eb t\u00eb disponueshme n\u00eb mjete opensource.<\/li>\n<li>Implementoni quality gates bazuar rezultatet e analiz\u00ebs statike n\u00eb faz\u00ebn e par\u00eb t\u00eb procesit t\u00eb dor\u00ebzimit, duke p\u00ebrdorur \"ratchet\" p\u00ebr kodin legacy.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Linke<\/h2>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Continuous Delivery<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudryavtsev: Analiza e software-it: si t\u00eb kuptosh n\u00ebse je nj\u00eb programues i mir\u00eb<\/a><\/noindex> paraqitje mbi metoda t\u00eb ndryshme t\u00eb analiz\u00ebs s\u00eb kodit (jo vet\u00ebm analiz\u00eb statike!)<\/li>\n<\/ol>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436868\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Integroni analiz\u00ebn statike n\u00eb proces, dhe mos k\u00ebrkoni gabime me t\u00eb | ProHoster","description":"M\u00eb shkroi k\u00ebt\u00eb artikull nj\u00eb sasi e madhe materialesht t\u00eb lidhura me analiz\u00ebn statike, q\u00eb po shfaqen gjithnj\u00eb e m\u00eb shpesh. N\u00eb radh\u00eb t\u00eb par\u00eb, ky \u00ebsht\u00eb blogu PVS-studio, i cili promovon aktivisht veten n\u00eb Habr duke dh\u00ebn\u00eb pasqyra t\u00eb gabimeve t\u00eb gjetura nga instrumenti i tyre n\u00eb projekte me kod t\u00eb hapur. S\u00eb fundmi, PVS-studio realizoi mb\u00ebshtetje p\u00ebr Java-n, dhe natyrisht, zhvilluesit e IntelliJ IDEA, e cila ka nj\u00eb analizator t\u00eb integruar q\u00eb tani \u00ebsht\u00eb ndoshta,","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster","og:description":"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435,","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:49:16+00:00","article:modified_time":"2019-10-31T18:49:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32848","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:50:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:51:27","updated":"2026-01-21 12:50:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}