I le suʻega PVS-Studio mo C ma C ++ gagana i luga o Linux ma macOS, amata mai le version 7.04, ua faʻaalia se filifiliga suʻega e siaki le lisi o faila faʻamaonia. I le faʻaaogaina o le faiga fou, e mafai ona e faʻapipiʻi le suʻesuʻega e siaki ai faʻatonuga ma toso talosaga. O lenei tusiga o le a taʻuina atu ia te oe le faʻatulagaina o le siakiina o le lisi o faila ua suia o se poloketi GitHub i se taʻutaʻua CI (Continuous Integration) faiga e pei o Travis CI, Buddy ma AppVeyor.
Faiga siaki lisi faila
I le version PVS-Studio 7.04 mo Linux ma macOS, ua faʻaalia se faiga mo le siakiina o le lisi o faila faila. E aoga lenei mea mo galuega faatino o latou faiga faufale e mafai ai ona e gaosia se faila
E le gata i lea, e mafai ona fa'aoga le faiga e siaki ai le lisi o faila fa'atasi ma le strace log log of compiler fa'alauiloa (pvs-studio-analyzer trace). Ina ia faia lenei mea, e tatau ona e faia muamua se fausaga atoa o le poloketi ma siaki ina ia aoina e le tagata suʻesuʻe faʻamatalaga atoatoa e uiga i le tuʻufaʻatasiga o faila uma o loʻo siakiina.
Ae ui i lea, o lenei filifiliga o loʻo i ai se faʻafitauli taua - e te manaʻomia le faia o se faʻataʻitaʻiga atoa o le galuega atoa i taimi uma e te faʻatinoina ai, lea e feteenai ma le manatu o le siakiina vave o se tautinoga. Po'o, afai e te natia le fa'ai'uga lava ia, o le fa'asologa mulimuli a le su'esu'e atonu e le atoatoa pe a suia le fa'alagolago i le fa'avae o faila fa'apogai pe a mae'a le su'ega (mo se fa'ata'ita'iga, e fa'aopoopo se #include fou i se tasi o faila fa'apogai).
O le mea lea, matou te le fautuaina le faʻaogaina o le faʻaogaina o le lisi o faila faʻatasi ma le faʻamaufaʻailoga e siaki ai faʻatonuga pe toso talosaga. I le tulaga e mafai ona e faia se faʻaopoopoga faʻaopoopo pe a siaki se tautinoga, mafaufau e faʻaaoga le faiga
O le lisi o faila faila mo suʻesuʻega o loʻo faʻasaoina i se faila faila ma pasi atu i le suʻega e faʻaaoga ai le parakalafa -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
O le faila lea e fa'amaoti ai auala fa'atatau i faila, ma o faila fou ta'itasi e tatau ona i ai i se laina fou. E talia le faʻamaonia e le gata o igoa faila mo suʻesuʻega, ae faʻapea foʻi ma tusitusiga eseese. O le a iloa e le tagata suʻesuʻe e le o se faila ma o le a le amanaiaina le laina. E mafai ona aoga lenei mea mo faʻamatalaga pe a faʻamaonia faila ma le lima. Ae ui i lea, e masani lava o se lisi o faila o le a faia i le taimi o suʻesuʻega i le CI, mo se faʻataʻitaʻiga, o nei mea e mafai ona avea ma faila mai se tautinoga poʻo se toso talosaga.
I le taimi nei, i le faʻaaogaina o lenei faiga, e mafai ona e siaki vave le code fou aʻo leʻi oʻo i totonu o le lala atinaʻe autu. Ina ia mautinoa e tali atu le faiga o suʻesuʻega i lapataiga a le au suʻesuʻe, o le aoga fa'alili-liliu faaopoopo le fu'a --faailoa-lapataiga:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Faatasi ai ma lenei fuʻa, o le a toe faʻafoʻi e le tagata liliu mai se code e le-zero pe afai o loʻo i ai lapataiga i le lipoti o le suʻega. I le faʻaaogaina o le code toe foʻi, e mafai ona e poloka se matau muamua, fai, poʻo le tosoina o le talosaga, ma e mafai ona faʻaalia, fefaʻasoaaʻi, pe lafoina le lipoti o suʻesuʻega faʻavae.
Manatua. A e amata amata suʻesuʻeina se lisi o faila, o le a suʻesuʻeina atoa le poloketi, aua e mana'omia e le tagata su'esu'e le fa'atupuina o se faila fa'alagolago i faila fa'apogai i luga o faila ulutala. Ole vaega lea ole su'esu'eina o faila C ma C++. I le lumanaʻi, e mafai ona faʻapipiʻi le faila faʻalagolago ma o le a faʻafouina e le tagata suʻesuʻe. O le lelei o le siakiina e faia pe a faʻaogaina le lisi o faila siaki le faʻaogaina o le faʻaogaina o faʻataʻitaʻiga faʻataʻitaʻiga o le naʻo lou manaʻomia e teu le faila ae le o faila faila.
Ta'iala lautele ole su'esu'eina ole toso ole talosaga
O le su'esu'eina o le galuega atoa e tele se taimi e alu ai, o lea e talafeagai ai le siaki na'o se vaega patino. O le fa'afitauli e tatau ona e vavae'ese faila fou mai isi faila o galuega.
Seʻi o tatou vaʻai i se faʻataʻitaʻiga o se laʻau faʻapipiʻi e lua lala:
Se'i vaai faalemafaufau i lena tautinoga A1 o loʻo i ai se aofaʻi tele o code ua uma ona faʻataʻitaʻiina. I se taimi muamua atu na matou faia ai se lala mai le tautinoga A1 ma suia nisi faila.
Ioe, na e matauina lena mea ina ua uma A1 e lua isi tautinoga na tupu, ae o nei foi tuʻufaʻatasiga o isi lala, aua matou te le tuuto aliʻi. Ma o lea ua oo mai le taimi hotfix sauni. O le mafuaaga lena na aliali mai ai se talosaga toso mo le tuufaatasia B3 и A3.
Ioe, o le a mafai ona siaki le taunuuga atoa o la latou faʻatasi, ae o le a tele le taimi e alu ai ma le faʻamaonia, talu ai na o ni nai faila na suia. O le mea lea, e sili atu ona lelei le suʻesuʻeina naʻo mea ua suia.
Ina ia faia lenei mea, matou te maua le eseesega i le va o lala, o loʻo i totonu o le HEAD o le lala matou te manaʻo e tuʻufaʻatasia i le matai:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE o le a tatou tilotilo i ai i se auiliiliga mulimuli ane. O le mea moni e le o auaunaga uma a le CI e tuʻuina atu faʻamatalaga talafeagai e uiga i faʻamaumauga mo le tuʻufaʻatasia, o taimi uma e tatau ai ona e sau i ni auala fou e maua ai nei faʻamatalaga. O le a fa'amatala au'ili'ili i lalo i 'au'aunaga i luga ole laiga ta'itasi.
O lea la, matou te maua le eseesega i le va o lala, pe sili atu, o se lisi o igoa faila na suia. Ole taimi nei e tatau ona tatou tuʻuina atu le faila .pvs-pr.list (na matou toe faʻafeiloaʻi le gaioiga o loʻo i luga i ai) i le suʻega:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
A maeʻa suʻesuʻega, matou te manaʻomia le faʻaliliuina o le faila ogalaau (PVS-Studio.log) i se faʻasologa faigofie-e-faitau:
plog-converter -t errorfile PVS-Studio.log --cerr -w
O lenei poloaiga o le a lisi ai mea sese i totonu
Naʻo le taimi nei tatou te manaʻomia e le gata ina faʻaalia mea sese, ae faʻaalia foi la tatou auaunaga mo le faʻapotopotoga ma suʻega e uiga i le i ai o faʻafitauli. Mo lenei faʻamoemoe, sa faʻaopoopoina se fuʻa i le liliu -W (--faailoa-lapataiga). Afai ei ai a itiiti ifo ma le tasi le analyer lapataiga, le aoga toe faafoi code fa'alili-liliu o le a suia i le 2, lea o le a logoina ai le auaunaga CI e uiga i le i ai o mea sese i totonu o faila talosaga toso.
Travis C.I.
O le faʻatulagaga ua faia o se faila .travis.yml. Mo le faʻaogagofie, ou te fautua atu ia te oe e tuʻu mea uma i totonu o se isi faʻamaumauga bash ma galuega o le a valaʻau mai le faila .travis.yml (bash script_name.sh function_name).
O le a matou faʻaopoopoina le code talafeagai i le tusitusiga i bash, o le auala lea o le a tatou maua ai le tele o galuega. I le vaega faʻapipiʻi sei o tatou tusia mea nei:
install:
- bash .travis.sh travis_install
Afai ei ai ni au faʻatonuga, e mafai ona e faʻafeiloaʻi i totonu o le tusitusiga, aveese faʻaoga.
Tatou tatala le faila .travis.sh ma fa'aopoopo le seti su'esu'e i le galuega 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
}
Sei o tatou faaopoopo atu i le vaega tusilima su'esu'ega ta'avale:
script:
- bash .travis.sh travis_script
Ma i le 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
}
O lenei tulafono e manaʻomia ona faʻataʻitaʻiina pe a uma ona fausia le poloketi, mo se faʻataʻitaʻiga, pe afai na e fausia ile CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
O le a foliga mai e pei o lenei:
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
}
Masalo ua uma ona e matauina nei fesuiaiga o le siosiomaga $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI taʻutino atu latou tutoatasi:
- $TRAVIS_PULL_REQUEST teu le numera talosaga toso pe sese, pe afai o se lala masani lenei;
- $TRAVIS_REPO_SLUG teuina le igoa o le fale teu oloa.
Le algorithm mo lenei galuega:
E tali atu Travis CI i le toe faafoi o tulafono laiti, o lea o le i ai o lapataiga o le a taʻu atu ai i le auʻaunaga e faʻailoga le tautinoga e iai mea sese.
Sei o tatou vaʻavaʻai totoʻa i le laina lenei o code:
git diff --name-only origin/HEAD > .pvs-pr.list
O le mea moni e faapea o Travis CI e otometi ona tuʻufaʻatasia lala aʻo suʻesuʻeina se talosaga toso:
O lea matou te iloiloina A4ae leai B3->A3. Ona o lenei vaega, e tatau ona tatou fuafuaina le eseesega ma A3, o le pito tonu lava lea o le lala mai amataga.
E tasi le fa'amatalaga taua o lo'o totoe - fa'asaoina le fa'alagolago o faila fa'aulu i luga o iunite fa'aliliu tu'ufa'atasi (*.c, *.cc, *.cpp, etc.). E fa'atatau e le tagata su'esu'e nei fa'alagolago pe a fa'alauiloa muamua i le faiga o le siakiina o se lisi o faila ona fa'asaoina lea i le .PVS-Studio directory. O le Travis CI e fa'atagaina oe e teu faila, o lea o le a matou fa'asaoina ai fa'amaumauga fa'amaumauga .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
O lenei code e manaʻomia ona faʻaopoopo i le faila .travis.yml. O lenei fa'amaumauga e teu ai fa'amaumauga eseese e aoina pe a mae'a su'esu'ega, lea o le a matua fa'avavevave ai fa'asologa mulimuli ane o su'esu'ega lisi o faila po'o su'esu'ega fa'aopoopo. Afai e le faia lenei mea, ona suʻesuʻeina lea e le tagata suʻesuʻe faila uma i taimi uma.
Buddy
E pei o Travis CI,
Muamua lava, tatou te manaʻomia le faʻaopoopoina o se gaioiga fou i le laina faʻapotopotoga:
Se'i ta'u mai le tagata tu'ufa'atasi na fa'aaoga e fausia ai le galuega. Matau le koneteina o lo'o fa'apipi'i ile gaioiga lea. Mo se faʻataʻitaʻiga, o loʻo i ai se pusa faʻapitoa mo le GCC:
Sei o tatou faʻapipiʻi le PVS-Studio ma mea faʻaoga talafeagai:
Sei o tatou faaopoopo atu laina nei i le faatonu:
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
Sei o tatou o i le Run tab (muamua aikona) ma faʻaopopo le code lea i le faʻatonu faʻatonu:
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
Afai e te faitau i le vaega i luga o Travs-CI, o lenei code ua uma ona e masani ai, ae peitai, o lea ua i ai se laasaga fou:
O le mea moni o le taimi nei matou te suʻesuʻeina e le o le iʻuga o le tuʻufaʻatasia, ae o le HEAD o le paranesi lea na faia ai le talosaga toso:
O lea la ua tatou i ai i se tautinoga tuutuuga B3 ma e tatau ona tatou maua le eseesega mai 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
Mo le fuafuaina A3 Tatou fa'aoga le GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Na matou faʻaogaina suiga nei na saunia e Buddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - toso numera talosaga;
- $BUDDY_REPO_SLUG - o se tu'ufa'atasiga ole igoa ole igoa ma le fa'aputuga (fa'ata'ita'iga max/test).
Se'i o tatou fa'asaoina suiga e fa'aaoga ai le fa'amau i lalo ma mafai ai ona su'esu'eina le talosaga toso:
E le pei o Travis CI, matou te le manaʻomia le faʻamaonia .pvs-studio mo le teuina, talu ai e otometi lava ona teuina e Buddy faila uma mo faʻasalalauga mulimuli. O le mea lea, o le mea mulimuli o loʻo totoe o le faʻasaoina lea o le saini ma le upega tafaʻilagi mo PVS-Studio i Buddy. A uma ona fa'asaoina suiga, o le a toe ave i tua i le Pipeline. Matou te manaʻomia le agai i luma i le faʻatulagaina o fesuiaiga ma faʻaopoopo se saini ma ki mo PVS-Studio:
A maeʻa lenei mea, o le faʻaalia o se talosaga toso fou poʻo se tautinoga o le a faʻaosofia ai le toe iloiloga. Afai o se tautinoga o loʻo i ai mea sese, Buddy o le a faʻaalia lenei mea i luga o le itulau talosaga toso.
AppVeyor
O le setiina o le AppVeyor e tutusa ma Buddy, talu ai e tutupu mea uma i luga o le upega tafaʻilagi ma e leai se manaʻoga e faʻaopoopo se faila * .yml i le fale teu oloa.
Se'i o tatou i le Fa'amaufa'ailoga i le va'aiga lautele o le poloketi:
Se'i o ta'ai i lalo le itulau lenei ma fa'aaga le fa'asaoina o le cache mo le aoina mai o talosaga toso:
Sei o tatou o i le Siosiomaga tab, lea tatou te faʻamaonia ai le ata mo le faʻapotopotoga ma suiga talafeagai o le siosiomaga:
Afai na e faitau i vaega ua mavae, ua e masani lelei i nei fesuiaiga e lua − PVS_KEY и PVS_USERNAME. Afai e leai, sei ou faamanatu atu ia te oe e tatau ona latou faʻamaonia le laisene o le PVS-Studio analyzer. O le a tatou toe vaʻaia i latou i tusitusiga Bash i le lumanaʻi.
I luga o le itulau e tasi o loʻo i lalo matou te faʻaalia le faila mo le faʻapipiʻiina:
Afai tatou te le faia lenei mea, o le a tatou suʻesuʻeina le poloketi atoa nai lo ni faila faila, ae o le a tatou maua le gaioiga mai faila faʻamaonia. O le mea lea, e taua le fa'aofiina o le igoa fa'atonu sa'o.
Ua o'o nei i le taimi e su'e ai le tusitusiga. Tatala le Su'ega tab ma filifili Mau:
E tatau ona e fa'apipi'i le code lea i totonu o lenei fomu:
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
Sei o tatou gauai atu i le vaega lea o le code:
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
O le faʻatonuga patino o le tau o le pwd poloaiga i se fesuiaiga e tatau ona teuina lenei tau le aoga e foliga mai e ese i le tepa muamua, ae ui i lea, o le a ou faʻamatalaina mea uma i le taimi nei.
Aʻo faʻatulagaina le suʻega i AppVeyor, na ou feagai ma uiga uiga ese a le suʻega. I le tasi itu, sa lelei mea uma, ae e leʻi amataina le auiliiliga. Na ou faʻaaluina le tele o le taimi e matauina ai o matou i totonu o le /home/appveyor/projects/testcalc/ directory, ma e mautinoa e le tagata suʻesuʻe o loʻo matou i totonu /opt/appveyor/build-agent/. Ona ou iloa ai lea o le fesuiaiga o le $PWD o loʻo taoto laitiiti. Mo lenei mafuaʻaga, na ou faʻafouina ma le lima lona tau aʻo leʻi amataina le auiliiliga.
Ma o mea uma e pei o muamua:
Mafaufau la i le vaega lea:
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"`
I totonu tatou te maua ai le eseesega i le va o lala o loʻo faʻaalia ai le talosaga toso. Ina ia faia lenei mea matou te manaʻomia suiga o le siosiomaga nei:
- $APPVEYOR_PULL_REQUEST_NUMBER — toso numera talosaga;
- $APPVEYOR_REPO_NAME - igoa fa'aoga ma fale teu oloa.
iʻuga
O le mea moni, matou te leʻi mafaufauina uma auaunaga tuʻufaʻatasiga faʻaauau, peitaʻi, e tutusa uma le faʻaogaina o le tasi i le isi. Se'i vagana ai le caching, e faia e 'au'aunaga ta'itasi lana lava " uila vilivae ", o lea e ese lava mea uma.
I se mea, pei o Travis-CI, o ni laina se lua o le code ma caching e galue lelei; i se mea, pei o le AppVeyor, naʻo lou manaʻomia e faʻamaonia le faila i totonu o tulaga; ae i se mea e te manaʻomia e fatuina ai ni ki tulaga ese ma taumafai e faʻamaonia le faiga e tuʻuina atu ia te oe le avanoa e faʻasolo ai le vaega o le cached. O le mea lea, afai e te manaʻo e faʻatulaga auʻiliʻiliga o talosaga toso i luga o se auaunaga tuʻufaʻatasiga faifaipea e leʻi talanoaina i luga, ia muamua ia mautinoa o le a leai sau faʻafitauli i le caching.
Faafetai mo lou gauai mai. Afai e iai se mea e le manuia, lagona le saoloto e tusi mai ia i matou i
Afai e te manaʻo e faʻasoa lenei tusiga i se faʻalogo Igilisi, faʻamolemole faʻaoga le fesoʻotaʻiga faʻaliliu: Maxim Zvyagintsev.
puna: www.habr.com