{"id":91065,"date":"2020-08-08T01:42:18","date_gmt":"2020-08-07T23:42:18","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii"},"modified":"2020-08-08T01:42:18","modified_gmt":"2020-08-07T23:42:18","slug":"staticheskij-analiz-ot-znakomstva-do-integraczii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","title":{"rendered":"Analiza statyczna \u2013 od wprowadzenia do integracji","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Statut od niesko\u0144czonego przegl\u0105du kodu lub debugowania, czasami zastanawiasz si\u0119, jak upro\u015bci\u0107 sobie \u017cycie. I troch\u0119 poszukuj\u0105c, lub przypadkowo natrafiaj\u0105c, mo\u017cna zobaczy\u0107 magiczne wyra\u017cenie: \"Analiza statyczna\". Przyjrzyjmy si\u0119, czym to jest i jak mo\u017ce wsp\u00f3\u0142pracowa\u0107 z twoim projektem.<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/7811b22510bdda6f3f774b8335cbeabe.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nW\u0142a\u015bciwie, je\u015bli piszesz w jakimkolwiek nowoczesnym j\u0119zyku, to nawet o tym nie wiedz\u0105c, przekazywa\u0142e\u015b sw\u00f3j kod przez analizator statyczny. Chodzi o to, \u017ce ka\u017cdy nowoczesny kompilator dostarcza, cho\u0107by w minimalnym stopniu, zestaw ostrze\u017ce\u0144 o potencjalnych problemach w kodzie. Na przyk\u0142ad, kompiluj\u0105c kod C++ w Visual Studio, mo\u017cesz zobaczy\u0107 nast\u0119puj\u0105ce:<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/a267e4e8a57c1a32e508e5e1983c5ff0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW tym wyniku widzimy, \u017ce zmienna <i>var<\/i> nie zosta\u0142a nigdzie u\u017cyta w funkcji. Tak wi\u0119c w rzeczywisto\u015bci prawie zawsze korzysta\u0142e\u015b z prostego analizatora statycznego kodu. Jednak w przeciwie\u0144stwie do profesjonalnych analizator\u00f3w, takich jak Coverity, Klocwork czy PVS-Studio, ostrze\u017cenia dostarczane przez kompilator mog\u0105 wskazywa\u0107 tylko na niewielki zakres problem\u00f3w.<\/p>\n<p>Je\u015bli nie wiesz na pewno, czym jest analiza statyczna i jak j\u0105 wprowadza\u0107, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/t\/0046\/\">przeczytaj ten artyku\u0142<\/a><\/noindex>, aby bardziej szczeg\u00f3\u0142owo zapozna\u0107 si\u0119 z t\u0105 metodologi\u0105. <\/p>\n<h2>Po co potrzebna jest analiza statyczna?<\/h2>\n<p>\nW skr\u00f3cie: przyspieszenie i uproszczenie. <\/p>\n<p>Analiza statyczna pozwala znale\u017a\u0107 wiele r\u00f3\u017cnych problem\u00f3w w kodzie: od niew\u0142a\u015bciwego u\u017cycia konstrukcji j\u0119zyka po liter\u00f3wki. Na przyk\u0142ad, zamiast <\/p>\n<pre><code class=\"cpp\">auto x = obj.x;\nauto y = obj.y;\nauto z = obj.z;<\/code><\/pre>\n<p>\nnapisa\u0142e\u015b nast\u0119puj\u0105cy kod:<\/p>\n<pre><code class=\"cpp\">auto x = obj.x;\nauto y = obj.y;\nauto z = obj.x;<\/code><\/pre>\n<p>\nJak widzisz, w ostatniej linii pojawi\u0142a si\u0119 liter\u00f3wka. Na przyk\u0142ad PVS-Studio zg\u0142asza nast\u0119puj\u0105ce ostrze\u017cenie:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/w\/v537\/\">V537<\/a><\/noindex> Rozwa\u017c sprawdzenie poprawno\u015bci u\u017cycia elementu &#039;y&#039;.<\/p>\n<p>Je\u015bli chcesz samodzielnie zaj\u0105\u0107 si\u0119 tym b\u0142\u0119dem, spr\u00f3buj gotowego przyk\u0142adu na Compiler Explorer: *<noindex><a rel=\"nofollow\" href=\"https:\/\/godbolt.org\/z\/cd4WK7\">klik<\/a><\/noindex>*.<\/p>\n<p>I jak rozumiesz, nie zawsze mo\u017cna zwr\u00f3ci\u0107 uwag\u0119 na takie fragmenty kodu od razu, a przez to mo\u017cna sp\u0119dzi\u0107 d\u0142ugie godziny na debugowaniu, zastanawiaj\u0105c si\u0119, dlaczego wszystko dzia\u0142a w taki dziwny spos\u00f3b. <\/p>\n<p>Jednak to oczywisty b\u0142\u0105d. A co, je\u015bli programista napisa\u0142 nieoptymalny kod, zapominaj\u0105c o jakiej\u015b subtelno\u015bci j\u0119zyka? Lub wr\u0119cz wprowadzi\u0142 do kodu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/t\/0066\/\">nieokre\u015blone zachowanie<\/a><\/noindex>? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u044b \u0438 \u043b\u044c\u0432\u0438\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 undefined behavior.<\/p>\n<p>Dok\u0142adnie na takie sytuacje powsta\u0142a analiza statyczna. To narz\u0119dzie dla programist\u00f3w, kt\u00f3re wska\u017ce im r\u00f3\u017cne problemy w kodzie i wyja\u015bni w dokumentacji, dlaczego nie nale\u017cy pisa\u0107 w ten spos\u00f3b, do czego to mo\u017ce prowadzi\u0107 i jak to naprawi\u0107. Oto przyk\u0142ad, jak to mo\u017ce wygl\u0105da\u0107: *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/w\/v702\/\">klik<\/a><\/noindex>*.<\/p>\n<p>Wi\u0119cej interesuj\u0105cych b\u0142\u0119d\u00f3w, kt\u00f3re mo\u017ce wykry\u0107 analizator, znajdziesz w artyku\u0142ach:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0700\/\">Top 10 b\u0142\u0119d\u00f3w w projektach C++ z 2019 roku<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0698\/\">Top 10 b\u0142\u0119d\u00f3w w projektach C# z 2019 roku<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0699\/\">Top 10 b\u0142\u0119d\u00f3w w projektach Java z 2019 roku<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nTeraz, po przeczytaniu tego materia\u0142u i upewnieniu si\u0119 o korzy\u015bciach p\u0142yn\u0105cych z analizy statycznej, mo\u017cesz chcie\u0107 wypr\u00f3bowa\u0107 j\u0105 w praktyce. Ale od czego zacz\u0105\u0107? Jak zintegrowa\u0107 nowe narz\u0119dzie w bie\u017c\u0105cym projekcie? I jak zapozna\u0107 z nim zesp\u00f3\u0142? Odpowiedzi na te pytania znajdziesz poni\u017cej.<\/p>\n<p><b>Uwaga.<\/b> Analiza statyczna nie zast\u0119puje i nie znosi tak przydatnej rzeczy, jak przegl\u0105dy kodu. Uzupe\u0142nia ten proces, pomagaj\u0105c wcze\u015bniej zauwa\u017cy\u0107 i naprawi\u0107 liter\u00f3wki, niedok\u0142adno\u015bci i niebezpieczne konstrukcje. znacznie bardziej produktywne jest skoncentrowanie si\u0119 podczas przegl\u0105d\u00f3w kodu na algorytmach i czytelno\u015bci kodu, a nie na wy\u0142apywaniu \u017ale umieszczonych nawias\u00f3w czy <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0509\/\">czytaniu nudnych funkcji por\u00f3wnawczych<\/a><\/noindex>.<\/p>\n<h2>0. Wprowadzenie do narz\u0119dzia<\/h2>\n<p>\nWszystko zaczyna si\u0119 od wersji pr\u00f3bnej. Rzeczywi\u015bcie, trudno zdecydowa\u0107 si\u0119 na wdro\u017cenie czegokolwiek w procesie rozwijania, je\u015bli nigdy wcze\u015bniej nie widzia\u0142o si\u0119 narz\u0119dzia na \u017cywo. Dlatego najpierw warto pobra\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/pvs-studio-download\/?promo=mscas\">wersj\u0119 pr\u00f3bn\u0105<\/a><\/noindex>.<\/p>\n<p><b>Co dowiesz si\u0119 na tym etapie:<\/b><\/p>\n<ul>\n<li>Jakie s\u0105 sposoby interakcji z analizatorem;<\/li>\n<li>Czy analizator jest kompatybilny z Twoim \u015brodowiskiem programistycznym;<\/li>\n<li>Jakie problemy wyst\u0119puj\u0105 obecnie w Twoich projektach.<\/li>\n<\/ul>\n<p>\nPo zainstalowaniu wszystkich niezb\u0119dnych element\u00f3w, pierwszym krokiem powinno by\u0107 uruchomienie analizy ca\u0142ego projektu (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0635\/\">Windows<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">Linuxa<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">macOS<\/a><\/noindex>). W przypadku PVS-Studio w Visual Studio zobaczysz podobny widok (klikalnie):<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/865b2dfa10661e4999238cdccf8860dc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFaktem jest, \u017ce zazwyczaj na projektach z du\u017c\u0105 baz\u0105 kodu analizatory statyczne generuj\u0105 ogromn\u0105 liczb\u0119 ostrze\u017ce\u0144. Nie ma potrzeby naprawiania ich wszystkich, poniewa\u017c Tw\u00f3j projekt ju\u017c dzia\u0142a, a zatem te problemy nie s\u0105 krytyczne. Jednak mo\u017cesz <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0633\/\">rzuci\u0107 okiem na najbardziej interesuj\u0105ce ostrze\u017cenia<\/a><\/noindex> i w razie potrzeby je poprawi\u0107. W tym celu nale\u017cy przefiltrowa\u0107 wyniki, pozostawiaj\u0105c tylko najbardziej wiarygodne komunikaty. Wtyczka PVS-Studio dla Visual Studio umo\u017cliwia to poprzez filtrowanie wed\u0142ug poziom\u00f3w i kategorii b\u0142\u0119d\u00f3w. Aby uzyska\u0107 najbardziej precyzyjny wynik, nale\u017cy pozostawi\u0107 w\u0142\u0105czone tylko <i>Wysoki<\/i> i <i>General<\/i> (tak\u017ce klikalne):<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/400b90713f67b531e4ed513ea9d340a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRzeczywi\u015bcie, przegl\u0105danie 178 ostrze\u017ce\u0144 jest znacznie \u0142atwiejsze ni\u017c kilku tysi\u0119cy...<\/p>\n<p>W zak\u0142adkach <i>Medium<\/i> i <i>Niski<\/i> cz\u0119sto trafiaj\u0105 si\u0119 dobre ostrze\u017cenia, jednak do tych kategorii zalicza si\u0119 r\u00f3wnie\u017c diagnozy, kt\u00f3re maj\u0105 mniejsz\u0105 precyzj\u0119 (wiarygodno\u015b\u0107). Wi\u0119cej na temat poziom\u00f3w ostrze\u017ce\u0144 i mo\u017cliwo\u015bci pracy w systemie Windows mo\u017cna zobaczy\u0107 tutaj: *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0007\">klik<\/a><\/noindex>*.<\/p>\n<p>Po pomy\u015blnym przejrzeniu najciekawszych b\u0142\u0119d\u00f3w (i ich poprawieniu) warto <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0032\/\">st\u0142umi\u0107 pozosta\u0142e ostrze\u017cenia<\/a><\/noindex>. Jest to konieczne, aby nowe ostrze\u017cenia nie gin\u0119\u0142y w\u015br\u00f3d starych. Poza tym, analizator statyczny to pomocnik dla programisty, a nie lista b\u0142\u0119d\u00f3w. \ud83d\ude42<\/p>\n<h2>1. Automatyzacja<\/h2>\n<p>\nPo zapoznaniu si\u0119 przychodzi czas na konfiguracj\u0119 wtyczek i integracj\u0119 w CI. Nale\u017cy to zrobi\u0107, zanim programi\u015bci zaczn\u0105 korzysta\u0107 z analizatora statycznego. Chodzi o to, \u017ce programista mo\u017ce zapomnie\u0107 w\u0142\u0105czy\u0107 analiz\u0119 lub w og\u00f3le jej nie chcie\u0107. W tym celu trzeba przeprowadzi\u0107 pewn\u0105 ko\u0144cow\u0105 kontrol\u0119 wszystkiego, aby niezweryfikowany kod nie trafi\u0142 do og\u00f3lnej ga\u0142\u0119zi rozwoju.<\/p>\n<p><b>Czego dowiesz si\u0119 na tym etapie:<\/b><\/p>\n<ul>\n<li>Jakie opcje automatyzacji oferuje narz\u0119dzie;<\/li>\n<li>Czy analizator jest kompatybilny z twoim systemem budowania.<\/li>\n<\/ul>\n<p>\nPoniewa\u017c nie ma idealnej dokumentacji, czasami trzeba pisa\u0107 do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/about-feedback\/\">wsparcie<\/a><\/noindex>. To normalne, i cieszymy si\u0119, mog\u0105c pom\u00f3c. \ud83d\ude42<\/p>\n<p>A teraz przejd\u017amy do us\u0142ug ci\u0105g\u0142ej integracji (CI). Ka\u017cdy analizator mo\u017cna w nie wdro\u017cy\u0107 bez wi\u0119kszych problem\u00f3w. W tym celu nale\u017cy stworzy\u0107 oddzielny etap w pipeline, kt\u00f3ry zwykle znajduje si\u0119 po budowie i testach jednostkowych. Wykonuje si\u0119 to przy pomocy r\u00f3\u017cnych narz\u0119dzi konsolowych. Na przyk\u0142ad PVS-Studio oferuje nast\u0119puj\u0105ce narz\u0119dzia:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0035\">PVS-Studio_Cmd.exe<\/a><\/noindex> (analiza rozwi\u0105za\u0144, projekt\u00f3w C# i C++ na Windows)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0031\/\">CLMonitor.exe<\/a><\/noindex> (monitorowanie kompilacji)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">pvs-studio-analyzer<\/a><\/noindex> (analiza projekt\u00f3w C++ na Linux \/ macOS)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0035\/\">pvs-studio-dotnet<\/a><\/noindex> (analiza rozwi\u0105za\u0144, projekt\u00f3w C# na Linux \/ macOS)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0044\/\">pvs-studio.jar<\/a><\/noindex> (analiza projekt\u00f3w Java)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0038\/\">PlogConverter<\/a><\/noindex> (konwerter plik\u00f3w raport\u00f3w)<\/li>\n<\/ul>\n<p>\nAby zintegrowa\u0107 analiz\u0119 w CI, nale\u017cy wykona\u0107 trzy rzeczy:<\/p>\n<ul>\n<li>Zainstalowa\u0107 analizator;<\/li>\n<li>Uruchom analiz\u0119;<\/li>\n<li>Dostarcz wyniki.<\/li>\n<\/ul>\n<p>\nNa przyk\u0142ad, aby zainstalowa\u0107 PVS-Studio na Linuxie (oparty na Debianie), nale\u017cy wykona\u0107 nast\u0119puj\u0105ce komendy:<\/p>\n<pre><code class=\"bash\">wget -q -O - https:\/\/files.viva64.com\/etc\/pubkey.txt \n    | sudo apt-key add -\nsudo wget -O \/etc\/apt\/sources.list.d\/viva64.list \n  https:\/\/files.viva64.com\/etc\/viva64.list\n  \nsudo apt-get update -qq\nsudo apt-get install -qq pvs-studio<\/code><\/pre>\n<p>\nW systemach opartych na Windows nie ma mo\u017cliwo\u015bci zainstalowania analizatora z mened\u017cera pakiet\u00f3w, jednak istnieje mo\u017cliwo\u015b\u0107 uruchomienia analizatora z linii polece\u0144:<\/p>\n<pre><code class=\"powershell\">PVS-Studio_setup.exe \/verysilent \/suppressmsgboxes \n\/norestart \/nocloseapplications<\/code><\/pre>\n<p>\nWi\u0119cej o wdra\u017caniu PVS-Studio w systemach opartych na Windows mo\u017cna przeczyta\u0107 *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0025\/\">tutaj<\/a><\/noindex>*.<\/p>\n<p>Po zainstalowaniu nale\u017cy uruchomi\u0107 bezpo\u015brednio analiz\u0119. Zaleca si\u0119 to robi\u0107 dopiero po zako\u0144czeniu kompilacji i test\u00f3w. Wynika to z faktu, \u017ce do analizy statycznej zwykle potrzeba dwa razy wi\u0119cej czasu ni\u017c do kompilacji.<\/p>\n<p>Poniewa\u017c spos\u00f3b uruchamiania zale\u017cy od platformy i specyfiki projektu, poka\u017c\u0119 przyk\u0142ad dla C++ (Linux):<\/p>\n<pre><code class=\"bash\">pvs-studio-analyzer analyze -j8 \n                            -o PVS-Studio.log\nplog-converter -t errorfile PVS-Studio.log --cerr -w<\/code><\/pre>\n<p>\nPierwsza komenda wykona analiz\u0119, a druga <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0038\/\">konwertuje<\/a><\/noindex>raport do formatu tekstowego, wy\u015bwietli go na ekranie i zwr\u00f3ci kod wyj\u015bcia r\u00f3\u017cny od 0 w przypadku wyst\u0105pienia ostrze\u017ce\u0144. Taki mechanizm jest wygodny do blokowania kompilacji w przypadku wyst\u0105pienia komunikat\u00f3w o b\u0142\u0119dach. Mo\u017cna jednak zawsze usun\u0105\u0107 flag\u0119 <i>-w<\/i> i nie blokowa\u0107 kompilacji zawieraj\u0105cej ostrze\u017cenia.<\/p>\n<p><b>Uwaga.<\/b> Format tekstowy \u2014 to niewygodne. Podano go tylko jako przyk\u0142ad. Zwr\u00f3\u0107 uwag\u0119 na bardziej interesuj\u0105cy format raportu \u2014 FullHtml. Umo\u017cliwia on nawigacj\u0119 po kodzie.<\/p>\n<p>Wi\u0119cej informacji na temat konfigurowania analizy w CI mo\u017cna przeczyta\u0107 w artykule \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0005\">PVS-Studio i Continuous Integration<\/a><\/noindex>\" (Windows) lub \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0661\/\">Jak skonfigurowa\u0107 PVS-Studio w Travis CI<\/a><\/noindex>\" (Linux).<\/p>\n<p>Dobrze, skonfigurowa\u0142e\u015b analityka na serwerze budowlanym. Teraz, je\u015bli kto\u015b doda\u0142 niezweryfikowany kod, etap weryfikacji b\u0119dzie si\u0119 nieudanie ko\u0144czy\u0142, a ty b\u0119dziesz m\u00f3g\u0142 wykry\u0107 problem, ale to nie jest do ko\u0144ca wygodne, poniewa\u017c skuteczniej jest sprawdzi\u0107 projekt nie po tym, jak dosz\u0142o do po\u0142\u0105czenia ga\u0142\u0119zi, ale przed tym, na etapie pull requestu.<\/p>\n<p>Og\u00f3lnie rzecz bior\u0105c, konfiguracja analizy pull requestu niewiele r\u00f3\u017cni si\u0119 od zwyk\u0142ego uruchomienia analizy w CI. Z wyj\u0105tkiem konieczno\u015bci uzyskania listy zmienionych plik\u00f3w. Zwykle mo\u017cna to uzyska\u0107, \u017c\u0105daj\u0105c r\u00f3\u017cnicy mi\u0119dzy ga\u0142\u0119ziami za pomoc\u0105 git:<\/p>\n<pre><code class=\"bash\">git diff --name-only HEAD origin\/$MERGE_BASE &gt; .pvs-pr.list<\/code><\/pre>\n<p>\nTeraz trzeba przekaza\u0107 ten wykaz plik\u00f3w do analizatora. Na przyk\u0142ad, w PVS-Studio mo\u017cna to zrealizowa\u0107 za pomoc\u0105 flagi <i>-S<\/i>:<\/p>\n<pre><code class=\"bash\">pvs-studio-analyzer analyze -j8 \n                            -o PVS-Studio.log \n                            -S .pvs-pr.list<\/code><\/pre>\n<p>\nWi\u0119cej na temat analizy pull request\u00f3w mo\u017cna si\u0119 dowiedzie\u0107 *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0679\/\">tutaj<\/a><\/noindex>*. Nawet je\u015bli nie masz swojego CI na li\u015bcie wskazanych w artykule us\u0142ug, przydatny b\u0119dzie og\u00f3lny rozdzia\u0142 po\u015bwi\u0119cony teorii tego rodzaju analizy.<\/p>\n<p>Konfiguruj\u0105c analiz\u0119 pull request\u00f3w, b\u0119dziesz m\u00f3g\u0142 zablokowa\u0107 commity zawieraj\u0105ce ostrze\u017cenia, tworz\u0105c w ten spos\u00f3b granic\u0119, kt\u00f3rej niezweryfikowany kod nie b\u0119dzie m\u00f3g\u0142 przekroczy\u0107.<\/p>\n<p>To wszystko jest oczywi\u015bcie bardzo dobre, jednak chcia\u0142bym mie\u0107 mo\u017cliwo\u015b\u0107 przegl\u0105dania wszystkich ostrze\u017ce\u0144 w jednym miejscu. Nie tylko od analizatora statycznego, ale tak\u017ce od test\u00f3w jednostkowych czy od analizatora dynamicznego. W tym celu istniej\u0105 r\u00f3\u017cne us\u0142ugi i wtyczki. PVS-Studio, na przyk\u0142ad, ma <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0037\/\">wtyczk\u0119 do integracji z SonarQube<\/a><\/noindex>.<\/p>\n<h2>2. Integracja na maszynach programist\u00f3w<\/h2>\n<p>\nTeraz nadszed\u0142 czas na instalacj\u0119 i konfiguracj\u0119 analizatora do codziennego u\u017cytku podczas programowania. Do tego momentu zaznajomi\u0142e\u015b si\u0119 z wi\u0119kszo\u015bci\u0105 metod pracy, wi\u0119c mo\u017cna to nazwa\u0107 naj\u0142atwiejsz\u0105 cz\u0119\u015bci\u0105.<\/p>\n<p>Najprostsza opcja \u2013 programi\u015bci mog\u0105 sami zainstalowa\u0107 potrzebny analizator. Jednak zajmie to du\u017co czasu i odci\u0105gnie ich od programowania, dlatego mo\u017cesz zautomatyzowa\u0107 ten proces, u\u017cywaj\u0105c instalatora i odpowiednich flag. Dla PVS-Studio istnieje wiele <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0025\/\">flag dla zautomatyzowanej instalacji<\/a><\/noindex>. Zreszt\u0105, zawsze s\u0105 mened\u017cery pakiet\u00f3w, takie jak Chocolatey (Windows), Homebrew (macOS) lub dziesi\u0105tki opcji dla Linuxa.<\/p>\n<p>Nast\u0119pnie trzeba b\u0119dzie zainstalowa\u0107 wymagane wtyczki, na przyk\u0142ad do <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0635\/\">Visual Studio<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/plugins.jetbrains.com\/plugin\/12263-pvs-studio-for-idea-and-android-studio\/\">IDEA<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0052\/\">Rider<\/a><\/noindex> etc.<\/p>\n<h2>3. Codzienne u\u017cytkowanie<\/h2>\n<p>\nNa tym etapie warto powiedzie\u0107 kilka s\u0142\u00f3w o sposobach przyspieszenia pracy analizatora w codziennym u\u017cytkowaniu. Pe\u0142na analiza ca\u0142ego projektu zajmuje bardzo du\u017co czasu, jednak czy cz\u0119sto zmieniamy kod jednocze\u015bnie w ca\u0142ym projekcie? Niew\u0105tpliwie opracowanie tak du\u017cego refaktoringu, kt\u00f3ry natychmiast dotknie ca\u0142ej bazy kodu, jest rzadkie. Liczba zmienianych plik\u00f3w naraz rzadko przekracza dziesi\u0119\u0107, dlatego warto je analizowa\u0107. Dla takiej sytuacji istnieje <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0024\/\">tryb analizy inkrementalnej<\/a><\/noindex>Tylko si\u0119 nie przestrasz, to nie kolejne narz\u0119dzie. To specjalny tryb, kt\u00f3ry pozwala analizowa\u0107 tylko zmienione pliki i ich zale\u017cno\u015bci, a wszystko to dzieje si\u0119 automatycznie po kompilacji, je\u015bli pracujesz w IDE z zainstalowanym wtyczk\u0105. <\/p>\n<p>Je\u015bli analizator wykryje problemy w niedawno zmienionym kodzie, sam o tym poinformuje. Na przyk\u0142ad, PVS-Studio powiadomi ci\u0119 o tym za pomoc\u0105 powiadomienia:<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/20456a6652f0bd4f62d9aea5f1dda5cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOczywi\u015bcie, to za ma\u0142o, by powiedzie\u0107 programistom, aby u\u017cywali narz\u0119dzia. Musisz jako\u015b im opowiedzie\u0107, co to jest i jak to dzia\u0142a. Oto na przyk\u0142ad artyku\u0142y dotycz\u0105ce szybkiego startu w PVS-Studio, ale podobne poradniki znajdziesz dla ka\u017cdego preferowanego przez siebie narz\u0119dzia:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0007\/\">Jak uruchomi\u0107 PVS-Studio w Windows (C, C++, C#)<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">Jak uruchomi\u0107 PVS-Studio w Linux i macOS (C, C++)<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0044\/\">Jak uruchomi\u0107 PVS-Studio Java<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nPodobne artyku\u0142y dostarczaj\u0105 wszystkie niezb\u0119dne informacje do codziennego u\u017cytku i nie zajmuj\u0105 du\u017co czasu. \ud83d\ude42<\/p>\n<p>Ju\u017c na etapie zaznajamiania si\u0119 z narz\u0119dziem zredukowali\u015bmy wiele ostrze\u017ce\u0144 podczas jednego z pierwszych uruchomie\u0144. Niestety, statyczne analizatory nie s\u0105 idealne, dlatego od czasu do czasu generuj\u0105 fa\u0142szywe alarmy. Zwykle mo\u017cna je \u0142atwo st\u0142umi\u0107, na przyk\u0142ad w wtyczce PVS-Studio dla Visual Studio wystarczy nacisn\u0105\u0107 jeden przycisk:<\/p>\n<p><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/ed5382f468d21b7e711caba73b439fda.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJednak mo\u017cesz nie tylko je st\u0142umi\u0107. Na przyk\u0142ad, mo\u017cesz zg\u0142osi\u0107 do wsparcia istnienie problemu. Je\u015bli fa\u0142szywy alarm mo\u017cna naprawi\u0107, to w przysz\u0142ych aktualizacjach mo\u017cesz zauwa\u017cy\u0107, \u017ce z ka\u017cdym razem jest coraz mniej specyficznych dla twojej bazy kodu fa\u0142szywych alarm\u00f3w.<\/p>\n<h2>Po integracji<\/h2>\n<p>\nOto przeszli\u015bmy przez wszystkie etapy integracji analizy statycznej w procesie rozwoju. Mimo \u017ce konfiguracja takich narz\u0119dzi w CI jest wa\u017cna, najwa\u017cniejszym miejscem uruchomienia jest w\u0142a\u015bnie komputer programisty. Przecie\u017c statyczny analizator to nie s\u0119dzia, kt\u00f3ry m\u00f3wi z daleka, \u017ce kod si\u0119 nie nadaje. Wr\u0119cz przeciwnie, to pomocnik, kt\u00f3ry podpowiada, gdy jeste\u015b zm\u0119czony i przypomina, je\u015bli o czym\u015b zapomnia\u0142e\u015b.<\/p>\n<p>Prawda jest taka, \u017ce bez regularnego korzystania statyczna analiza raczej nie upro\u015bci znacznie procesu tworzenia oprogramowania. W ko\u0144cu jej g\u0142\u00f3wn\u0105 zalet\u0105 dla programisty jest nie tyle wyszukiwanie skomplikowanych i kontrowersyjnych fragment\u00f3w kodu, ile wczesne ich wykrywanie. Zg\u00f3d\u017a si\u0119, \u017ce odkrycie problemu, gdy poprawki s\u0105 ju\u017c w fazie test\u00f3w, jest nie tylko nieprzyjemne, ale r\u00f3wnie\u017c bardzo czasoch\u0142onne. Statyczna analiza, przy regularnym u\u017cywaniu, przegl\u0105da ka\u017cd\u0105 zmian\u0119 bezpo\u015brednio na twoim komputerze i informuje o podejrzanych miejscach w trakcie pracy nad kodem.<\/p>\n<p>A je\u015bli ty lub twoi koledzy wci\u0105\u017c nie jeste\u015bcie pewni, czy warto wdro\u017cy\u0107 analityka, proponuj\u0119 przej\u015b\u0107 teraz do artyku\u0142u \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0687\/\">Powody, dla kt\u00f3rych warto wdro\u017cy\u0107 do procesu tworzenia statyczny analizator kodu PVS-Studio<\/a><\/noindex>\". Zawiera on typowe obawy programist\u00f3w dotycz\u0105ce tego, \u017ce analiza statyczna b\u0119dzie im zabiera\u0107 czas itd.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/514128\/\"><img decoding=\"async\" alt=\"Analiza statyczna \u2013 od wprowadzenia do integracji\" src=\"\/wp-content\/uploads\/2020\/08\/6372d668354f708cb0e08df27bb39bdd.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Je\u015bli chcesz podzieli\u0107 si\u0119 tym artyku\u0142em z angloj\u0119zyczn\u0105 publiczno\u015bci\u0105, prosz\u0119 u\u017cyj linku do t\u0142umaczenia: Maxim Zvyagintsev. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/514128\/\">Static Analysis: From Getting Started to Integration<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/514124\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438 \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u0430\u0448\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043b\u0438\u0431\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0442\u043e\u0433\u0434\u0430, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u044f\u0441\u044c \u043e\u0431 \u044d\u0442\u043e\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91065","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.\" \/>\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\/pl\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u2013 \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0434\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii\" \/>\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=\"2020-08-07T23:42:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-07T23:42:18+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\udd47Statyczna analiza \u2013 od poznania do integracji | ProHoster","description":"Zm\u0119czony nieko\u0144cz\u0105cym si\u0119 przegl\u0105daniem kodu lub debugowaniem, czasami my\u015blisz, jak upro\u015bci\u0107 sobie \u017cycie. Przeszukuj\u0105c nieco, lub przypadkowo natrafiaj\u0105c na, mo\u017cesz zobaczy\u0107 magiczny zwrot: \"Statyczna analiza.\"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u2013 \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0434\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 | ProHoster","og:description":"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","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":"2020-08-07T23:42:18+00:00","article:modified_time":"2020-08-07T23:42:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91065","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:35:24","updated":"2022-10-01 20:50:02","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=91065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/91066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=91065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=91065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=91065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}