Ho PVS-Studio analyzer bakeng sa lipuo tsa C le C ++ ho Linux le macOS, ho qala ka mofuta oa 7.04, monyetla oa teko o hlahile ho lekola lenane la lifaele tse boletsoeng. U sebelisa mokhoa o mocha, o ka hlophisa analyzer ho lekola boitlamo le ho hula likopo. Sengoliloeng sena se tla u bonts'a mokhoa oa ho theha lethathamo la lifaele tsa projeke ea GitHub lits'ebetsong tse tsebahalang tsa CI (Continuous Integration) joalo ka Travis CI, Buddy le AppVeyor.
Mokhoa oa ho hlahloba lenane la lifaele
Phetolelo ea PVS-Studio 7.04 bakeng sa Linux le macOS e na le mokhoa oa ho lekola lenane la lifaele tsa mohloli. Sena se sebetsa bakeng sa merero eo tsamaiso ea eona ea kaho e u lumellang ho hlahisa faele
Hape, mokhoa oa ho lekola lenane la lifaele o ka sebelisoa hammoho le trace trace ea compiler runs (pvs-studio-analyzer trace). Ho etsa sena, o tla hloka pele ho etsa moralo o felletseng oa projeke mme o e latele e le hore mohlahlobi a bokelle tlhaiso-leseling e felletseng mabapi le likarolo tsa pokello ea lifaele tsohle tse hlahlojoang.
Leha ho le joalo, khetho ena e na le tšitiso e kholo - o tla hloka ho etsa moralo o felletseng oa morero o mong le o mong ha o qala, oo ka boona o hananang le mohopolo oa cheke e potlakileng ea boitlamo. Kapa, haeba u boloka sephetho sa morao-rao ka boeona, ho hlahisoa ha mohlahlobi ho ka 'na ha bonahala ho sa phethahala haeba sebopeho sa mohloli oa mohloli se fetohang ka mor'a ho latela (mohlala, #include e ncha e kenyelelitsoe ho e' ngoe ea lifaele tsa mohloli).
Ka hona, ha re khothaletse ho sebelisa mokhoa oa ho hlahloba lenane la lifaele ka lethathamo la trace ho lekola likopo kapa ho hula likopo. Haeba o ka etsa moaho o eketsehileng ha o hlahloba boitlamo, nahana ka ho sebelisa mokhoa ona
Lethathamo la lifaele tsa mohloli bakeng sa tlhahlobo le bolokoa faeleng ea mongolo ebe le fetisetsoa ho mohlahlobi ho sebelisoa paramethara -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Faele ena e totobatsa litsela tse amanang kapa tse felletseng tsa lifaele, 'me faele e' ngoe le e 'ngoe e ncha e tlameha ho ba moleng o mocha. Hoa lumelloa ho bolela eseng feela mabitso a lifaele bakeng sa tlhahlobo, empa le litemana tse fapaneng. Mohlahlobi o tla bona hore ena ha se faele mme o tla iphapanyetsa mohala. Sena se ka ba molemo bakeng sa ho fana ka maikutlo haeba lifaele li hlalositsoe ka letsoho. Leha ho le joalo, hangata lethathamo la lifaele le tla hlahisoa nakong ea CI parsing, mohlala lifaele tse tsoang boitlamo kapa kopo ea ho hula.
Joale, u sebelisa mokhoa ona, u ka lekola khoutu e ncha kapele pele e kena lekaleng le ka sehloohong la nts'etsopele. E le hore sistimi ea netefatso e arabele litemoso tsa analyzer, ts'ebeliso mofetoheli oa pola folakha e ekelitsoe --bontsha-ditemoso:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Ka folakha ena, converter e tla khutlisa khoutu e seng ea zero haeba ho na le litemoso tlalehong ea analyzer. U sebelisa khoutu ea ho khutlisa, u ka thibela hook ea pele, ho itlama kapa ho hula kopo, 'me u bonts'a tlaleho e hlahisitsoeng ea mohlahlobi skrineng, u e arolelane kapa u e romelle ka lengolo.
Hlokomela. Lekhetlo la pele ha u qala ho hlahloba lenane la lifaele, morero oohle o tla hlahlojoa, hobane mohlahlobi o hloka ho hlahisa faele ea litšepiso tsa lifaele tsa mohloli oa projeke ho lifaele tsa hlooho. Ena ke tšobotsi ea ho arola lifaele tsa C le C ++. Nakong e tlang, faele ea ho itšetleha e ka bolokoa 'me e tla ntlafatsoa ka bo eona ke mohlahlobi. Monyetla oa ho hlahloba boitlamo ha u sebelisa mokhoa oa ho hlahloba lenane la lifaele ka ho sebelisa mokhoa o ntseng o eketseha oa parsing ke hore faele eo ke eona feela e lokelang ho bolokoa, eseng lifaele tsa ntho.
Melao-motheo e akaretsang ea tlhahlobo ea kopo ea ho hula
Tlhahlobo ea morero oohle e nka nako e telele, kahoo hoa utloahala ho hlahloba karolo e itseng feela ea eona. Bothata ke hore o hloka ho arola lifaele tse ncha ho lifaele tse ling tsa morero.
Nahana ka mohlala oa sefate sa boitlamo se nang le makala a mabeli:
Ha re etse eka ke boitlamo A1 e na le palo e kholo ea khoutu e seng e hlahlobiloe. Nakoana pejana re entse lekala ho tloha boitlamo A1 le ho fetola lifaele tse ling.
Ehlile, le hlokometse seo kamora A1 ho bile le li-commission tse ling tse peli, empa le tsona e ne e le kopanyo ea makala a mang, hobane ha re itlama mong'a. Mme jwale ho fihlile nako ya hore hotfix lokile. Ka hona, ho ile ha hlaha kopo ea ho hula bakeng sa ho kopanya B3 и A3.
Ha e le hantle, ho ka khoneha ho hlahloba sephetho sohle sa ho kopanya ha bona, empa sena se ne se tla ba nako e telele haholo le se sa lokang, kaha ke lifaele tse seng kae feela tse fetotsoeng. Ka hona, ho molemo ho hlahloba feela tse fetotsoeng.
Ho etsa sena, re fumana phapang lipakeng tsa makala, ho ba HLOOHO ea lekala leo re batlang ho kopana ho lona ho ba master:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE re tla hlahloba ka botlalo hamorao. 'Nete ke hore ha se tšebeletso e' ngoe le e 'ngoe ea CI e fanang ka tlhahisoleseding e hlokahalang mabapi le motheo oa ho kopanya, kahoo nako le nako u tlameha ho tla le litsela tse ncha tsa ho fumana lintlha tsena. Sena se tla hlalosoa ka botlalo ho e 'ngoe le e 'ngoe ea litšebeletso tsa marang-rang tse hlalositsoeng.
Kahoo, re fumane phapang pakeng tsa makala, kapa ho e-na le hoo, lethathamo la mabitso a lifaele a fetotsoeng. Hona joale re hloka ho fana ka file .pvs-pr.list (re lebisitse tlhahiso e kaholimo ho eona) ho mohlahlobi:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Kamora tlhahlobo, re hloka ho fetolela faele ea log (PVS-Studio.log) hore e be sebopeho se baloang:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Taelo ena e tla thathamisa liphoso ho
Ke mona feela ha ho hlokahale hore re bontše liphoso feela, empa hape le ho tsebisa tšebeletso ea rona bakeng sa kopano le tlhahlobo mabapi le boteng ba mathata. Bakeng sa sena, ho ile ha eketsoa folakha ho converter -W (--bontsha-ditemoso). Haeba ho na le bonyane temoso e le 'ngoe ea analyzer, khoutu ea ho khutlisa ea ts'ebeliso mofetoheli oa pola e tla fetoha ho 2, e leng eona e tla tsebisa tšebeletso ea CI hore ho na le liphoso tse ka 'nang tsa e-ba teng ho lifaele tsa kopo ea ho hula.
Travis C.I.
Tlhophiso e entsoe ka mokhoa oa faele .travis.yml. Bakeng sa boiketlo, ke u eletsa hore u kenye ntho e 'ngoe le e' ngoe ka har'a script e arohaneng ea bash e nang le mesebetsi e tla bitsoa ho tsoa faeleng .travis.yml (bash scriptname.sh function_name).
Re tla eketsa khoutu e hlokahalang ho script ho Bash, kahoo re fumana ts'ebetso e eketsehileng. Karolong kenya ha re ngoleng tse latelang:
install:
- bash .travis.sh travis_install
Haeba u ne u e-na le litaelo, u ka li suthisetsa script ka ho tlosa li-hyphens.
Ha re bule faele .travis.sh ebe o kenya setupo sa analyzer tšebetsong travis_install():
travis_install() {
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
}
Joale ha re kenyelletse karolong rx tsamaisa tlhahlobo:
script:
- bash .travis.sh travis_script
Mme ka bash script:
travis_script() {
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}
Khoutu ena e tlameha ho tsamaisoa kamora hore projeke e hahuoe, mohlala, haeba u ne u e-na le moaho oa CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
E tla shebahala tjena:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}
Mohlomong u se u hlokometse mefuta-futa ea tikoloho e boletsoeng. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI e li phatlalatsa ka botsona:
- $TRAVIS_PULL_REQUEST boloka nomoro ea kopo ea ho hula, kapa bohatahaeba e le lekala le tloaelehileng;
- $TRAVIS_REPO_SLUG e boloka lebitso la polokelo ea morero.
Algorithm ea ts'ebetso ena:
Travis CI e araba likhoutu tsa ho khutlisa, kahoo boteng ba litemoso bo tla bolella ts'ebeletso ho tšoaea boitlamo joalo ka buggy.
Ha re shebisiseng mola ona oa khoutu:
git diff --name-only origin/HEAD > .pvs-pr.list
Taba ke hore Travis CI e kopanya makala ka bo eona nakong ea tlhahlobo ea kopo ea ho hula:
Ka hona, re sekaseka A4, eseng B3->A3. Ka lebaka la tšobotsi ena, re hloka ho bala phapang ho tloha A3, e leng feela tlhōrō ea lekala ho tloha tsoalo.
Ntlha e le 'ngoe ea bohlokoa e sa ntse e le teng - ho boloka boitsebiso bo itšetlehileng ka lihlooho tsa lihlooho tsa lihlopha tsa phetolelo tse hlophisitsoeng (*.c, *.cc, *.cpp, joalo-joalo). Mohlahlobi o bala litšetleho tsena qalong ea mokhoa oa ho hlahloba lethathamo la lifaele ebe o li boloka bukeng ea .PVS-Studio. Travis CI e u lumella ho boloka li-folders, kahoo re tla boloka data ea directory .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Khoutu ena e tlameha ho kenngoa faeleng .travis.yml. Sengoliloeng sena se boloka lintlha tse fapaneng tse bokelletsoeng kamora tlhahlobo, tse tla potlakisa haholo ts'ebetso e latelang ea tlhahlobo ea lenane la lifaele kapa tlhahlobo e ntseng e eketseha. Haeba sena se sa etsoe, joale mohlahlobi o tla hlahloba lifaele tsohle nako le nako.
Buddy
Joalo ka Travis C.I.,
Pele ho tsohle, re hloka ho eketsa ketso e ncha moleng oa kaho:
Hlalosa moqapi o sebelisitsoeng ho aha morero. Hlokomela setshelo sa docker se kentsoeng ts'ebetsong ena. Ka mohlala, ho na le setshelo se khethehileng sa GCC:
Joale ha re kenyeng PVS-Studio le lisebelisoa tse hlokahalang:
Kenya mela e latelang ho mohlophisi:
apt-get update && apt-get -y install wget gnupg jq
wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
apt-get update && apt-get -y install pvs-studio
Joale ha re ee ho Run tab (setšoantšo sa pele) 'me u kenye khoutu e latelang sebakeng se tsamaisanang le sona:
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
Haeba u balile karolo ea Travs-CI, joale khoutu ena e se e ntse e u tseba, leha ho le joalo, joale ho na le mohato o mocha:
'Nete ke hore joale ha re sekaseke sephetho sa ho kopanya, empa SEHLOOHO sa lekala leo kopo ea ho hula e etsoang ho lona:
Kahoo re boitlamo bo nang le maemo B3 mme re hloka ho fumana phapang ho tloha ho A3:
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
Bakeng sa ho khetholla A3 Ha re sebeliseng GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Re sebelisitse mefuta e latelang e fanoeng ke Buddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - nomoro ea kopo ea ho hula;
- $BUDDY_REPO_SLUG - motsoako oa lebitso la mosebelisi le polokelo (mohlala max / test).
Joale ha re bolokeng liphetoho re sebelisa konopo e ka tlase, 'me re lumelle tlhahlobo ea kopo ea ho hula:
Ho fapana le Travis CI, ha ho hlokahale hore re hlalose .pvs-studio bakeng sa caching, kaha Buddy e boloka lifaele tsohle ka bo eona bakeng sa ho qala ho latelang. Ka hona, ntho ea ho qetela e setseng ke ho boloka ho kena le password bakeng sa PVS-Studio ho Buddy. Kamora ho boloka liphetoho, re tla khutlela ho Pipeline. Re hloka ho ea ho litlhophiso tse fapaneng ebe re eketsa ho kena le senotlolo sa PVS-Studio:
Ka mor'a moo, ponahalo ea kopo e ncha ea ho hula kapa boitlamo e tla etsa hore cheke. Haeba boitlamo bo na le liphoso, joale Buddy o tla e supa leqepheng la kopo ea ho hula.
AppVeyor
Ho theha AppVeyor ho tšoana le Buddy, kaha ntho e 'ngoe le e' ngoe e etsahala ho sebopeho sa websaete 'me ha ho hlokahale hore u kenye faele ea *.yml sebakeng sa polokelo ea morero.
Ha re ee ho li-settings ho kakaretso ea morero:
Ha re theolele tlase leqephe lena 'me re lumelle ho boloka cache bakeng sa likopo tsa ho hula moaho:
Joale ha re ee tabeng ea Tikoloho, moo re hlalosang setšoantšo seo re lokelang ho se haha le mefuta e fapaneng ea tikoloho:
Haeba u balile likarolo tse fetileng, u tloaelane haholo le mefuta ena e 'meli − PVS_KEY и PVS_USERNAME. Haeba ho se joalo, e-re ke u hopotse hore baa hlokahala ho hlahloba laesense ea PVS-Studio analyzer. Nakong e tlang, re tla kopana le bona hape ka mangolo a Bash.
Leqepheng le le leng le ka tlase, hlakisa foldara bakeng sa caching:
Haeba re sa etse sena, joale re tla sekaseka morero oohle ho e-na le lifaele tse 'maloa, empa re tla fumana tlhahiso ho latela lifaele tse boletsoeng. Ka hona, ho bohlokoa ho kenya lebitso la directory le nepahetseng.
Joale ke nako ea hore script e lekoe. Bula tab ea Liteko ebe u khetha Script:
Beha khoutu e latelang foromong ena:
sudo apt-get update && sudo apt-get -y install jq
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 && sudo apt-get -y install pvs-studio
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
Ha re shebeng karolo e latelang ea khoutu:
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
Kabelo e ikhethileng ea boleng ba taelo ea pwd ho phapang e lokelang ho boloka boleng bona ba kamehla e bonahala e makatsa qalong, leha ho le joalo, ke tla hlalosa ntho e ngoe le e ngoe ka motsotsoana.
Ha ke ntse ke theha analyzer ho AppVeyor, ke ile ka kopana le boitšoaro bo makatsang haholo ba mohlahlobi. Ka lehlakoreng le leng, ntho e 'ngoe le e' ngoe e ne e sebetsa hantle, empa tlhahlobo ha ea ka ea qala. Ke qetile nako e ngata ke hlokomela hore re ka har'a /home/appveyor/projects/testcalc/ directory, mme mohlahlobi o na le bonnete ba hore re ho /opt/appveyor/build-agent/. Eaba kea hlokomela hore phetoho ea $ PWD e batla e le leshano. Ka lebaka lena, ke ile ka ntlafatsa boleng ba eona pele ke qala tlhahlobo.
Ebe tsohle, joalo ka pele:
Joale nahana ka snippet e latelang:
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
Ho eona, re fumana phapang lipakeng tsa makala ao kopo ea ho hula e phatlalatsoang ho ona. Bakeng sa sena re hloka mefuta e latelang ea tikoloho:
- $APPVEYOR_PULL_REQUEST_NUMBER - nomoro ea kopo ea ho hula;
- $APPVEYOR_REPO_NAME - lebitso la mosebedisi le polokelo ea morero.
fihlela qeto e
Ha e le hantle, ha re e-s'o nahane ka litšebeletso tsohle tse ka khonehang tsa ho kopanya, leha ho le joalo, kaofela li na le litlhaloso tse tšoanang haholo tsa mosebetsi. Ntle le caching, tšebeletso e 'ngoe le e' ngoe e iketsetsa "baesekele", kahoo ntho e 'ngoe le e' ngoe e fapane kamehla.
Sebakeng se seng, joalo ka Travis-CI, mela e 'maloa ea khoutu le caching e sebetsa ka mokhoa o se nang sekoli; kae-kae, joalo ka AppVeyor, o hloka feela ho hlakisa foldara ho li-setting; empa kae-kae o hloka ho etsa linotlolo tse ikhethang mme o leke ho kholisa sistimi ho u fa monyetla oa ho hlakola sekhechana sa cached. Ka hona, haeba u batla ho theha tlhahlobo ea kopo ea ho hula ka ts'ebeletso e tsoelang pele ea ho kopanya e sa kang ea tšohloa ka holimo, joale etsa bonnete ba hore u ke ke ua ba le mathata ka caching.
Kea leboha ha u mametse. Haeba ho na le ho sa sebetseng hantle, ikutloe u lokolohile ho re ngolla ho
Haeba u batla ho arolelana sengoloa sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Maxim Zvyagintsev.
Source: www.habr.com