A cikin PVS-Studio analyzer don C da C ++ harsuna akan Linux da macOS, farawa daga sigar 7.04, zaɓin gwaji ya bayyana don duba jerin takamaiman fayiloli. Amfani da sabon yanayin, zaku iya saita mai nazari don bincika aikatawa da ja buƙatun. Wannan labarin zai gaya muku yadda ake saita duba jerin fayilolin da aka canza na aikin GitHub a cikin shahararrun tsarin CI (Ci gaba da Haɗin kai) kamar Travis CI, Buddy da AppVeyor.
Yanayin duba lissafin fayil
A cikin sigar PVS-Studio 7.04 don Linux da macOS, yanayin duba jerin fayilolin tushen ya bayyana. Wannan yana aiki don ayyukan da tsarin ginawa ya ba ku damar samar da fayil
Hakanan, yanayin duba lissafin fayil ɗin ana iya amfani dashi tare da jerin jerin abubuwan ƙaddamar da tarawa (trace pvs-studio-analyzer). Don yin wannan, kuna buƙatar fara aiwatar da cikakken ginin aikin kuma ku bi shi ta yadda mai nazari ya tattara cikakkun bayanai game da ma'aunin tattara duk fayilolin da ake dubawa.
Koyaya, wannan zaɓin yana da babban koma baya - ko dai kuna buƙatar aiwatar da cikakken tsarin aikin gabaɗayan duk lokacin da kuka gudanar da shi, wanda a cikin kansa ya saba wa ra'ayin hanzarta bincika ƙaddamarwa. Ko, idan ka cache sakamakon binciken da kanta, ayyukan mai binciken na gaba na iya zama bai cika ba idan tsarin dogara na fayilolin tushen ya canza bayan alamar (misali, ana ƙara sabon #include zuwa ɗaya daga cikin fayilolin tushen).
Don haka, ba mu ba da shawarar yin amfani da yanayin bincika lissafin fayil tare da rajistan binciken don bincika aikata ko ja buƙatun ba. Idan za ku iya yin haɓaka haɓaka yayin bincika alƙawarin, yi la'akari da amfani da yanayin
An adana jerin fayilolin tushen don bincike a cikin fayil ɗin rubutu kuma an wuce zuwa mai nazari ta amfani da siga -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Wannan fayil ɗin yana ƙayyadadden hanyoyin dangi ko cikakkun hanyoyin zuwa fayiloli, kuma kowane sabon fayil dole ne ya kasance akan sabon layi. Yana da karɓa ba kawai sunayen fayil don bincike ba, amma har ma da rubutu daban-daban. Mai nazari zai ga cewa wannan ba fayil ba ne kuma zai yi watsi da layin. Wannan na iya zama da amfani don yin tsokaci idan an ayyana fayiloli da hannu. Koyaya, galibi ana samar da jerin fayiloli yayin bincike a cikin CI, alal misali, waɗannan na iya zama fayiloli daga ƙaddamarwa ko buƙatun ja.
Yanzu, ta amfani da wannan yanayin, zaku iya bincika sabon lamba da sauri kafin ya shiga babban reshen haɓakawa. Don tabbatar da cewa tsarin dubawa ya amsa gargadin mai nazari, mai amfani plog-converter tuta ya kara --nuna-gargaɗi:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Tare da wannan tuta, mai canzawa zai dawo da lambar mara sifili idan akwai gargaɗi a cikin rahoton nazartar. Yin amfani da lambar dawowa, zaku iya toshe ƙugiya ta riga-kafi, yi, ko buƙatun ja, kuma ana iya nunawa, rabawa, ko aika ta imel.
Lura. Lokacin da ka fara nazarin jerin fayiloli, za a bincikar dukkan aikin, saboda mai nazari yana buƙatar samar da fayil na abubuwan dogaro na fayilolin tushen aikin akan fayilolin taken. Wannan siffa ce ta nazarin fayilolin C da C++. A nan gaba, za a iya adana fayil ɗin dogara kuma mai nazari zai sabunta shi ta atomatik. Amfanin dubawa yana aikata lokacin amfani da yanayin bincika lissafin fayil akan amfani da yanayin bincike na haɓaka shine kawai kuna buƙatar cache wancan fayil ɗin ba fayilolin abu ba.
Gabaɗaya ka'idodin jan buƙatun bincike
Yin nazarin gabaɗayan aikin yana ɗaukar lokaci mai yawa, don haka yana da ma'ana don bincika wani yanki kawai. Matsalar ita ce kuna buƙatar raba sabbin fayiloli daga sauran fayilolin aikin.
Bari mu kalli misalin wata bishiya mai rassa biyu:
Bari mu yi tunanin wannan ƙaddamarwa A1 yana ƙunshe da adadi mai girman gaske na lambar da aka riga aka gwada. A baya kadan mun yi reshe daga aikin A1 kuma canza wasu fayiloli.
Kai, ba shakka, lura cewa bayan A1 wasu ayyuka guda biyu sun faru, amma waɗannan kuma haɗe-haɗe ne na wasu rassa, saboda ba mu yi ba master. Kuma yanzu lokacin ya yi hotfix shirye. Shi ya sa aka bayyana bukatar ja-gorar hadakar B3 и A3.
Tabbas, zai yiwu a bincika gabaɗayan sakamakon haɗewarsu, amma wannan zai ɗauki lokaci mai yawa kuma bai dace ba, tunda an canza ƴan fayiloli kaɗan. Saboda haka, ya fi dacewa don bincika kawai waɗanda aka canza.
Don yin wannan, za mu sami bambanci tsakanin rassan, kasancewa a cikin HEAD na reshe wanda muke so mu haɗu zuwa maigidan:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE za mu duba shi dalla-dalla daga baya. Gaskiyar ita ce, ba kowane sabis na CI ke ba da bayanan da suka dace game da bayanan bayanan don haɗawa ba, don haka duk lokacin da za ku fito da sababbin hanyoyin samun wannan bayanan. Za a bayyana wannan dalla-dalla a ƙasa a cikin kowane sabis ɗin gidan yanar gizo da aka siffanta.
Don haka, mun sami bambanci tsakanin rassan, ko kuma wajen, jerin sunayen fayilolin da aka canza. Yanzu muna buƙatar ba da fayil ɗin .pvs-pr.list (mun juya abin da ke sama zuwa gare shi) zuwa ga mai nazari:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Bayan bincike, muna buƙatar musanya fayil ɗin log ɗin (PVS-Studio.log) zuwa tsari mai sauƙin karantawa:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Wannan umarnin zai jera kurakurai a ciki
Yanzu kawai muna buƙatar ba kawai nuna kurakurai ba, amma kuma sanar da sabis ɗinmu don taro da gwaji game da kasancewar matsaloli. Don wannan dalili, an ƙara tuta zuwa mai juyawa -W (--nuna-gargaɗi). Idan akwai aƙalla gargaɗin mai nazari ɗaya, lambar dawowar mai amfani plog-converter zai canza zuwa 2, wanda hakan zai sanar da sabis na CI game da kasancewar yuwuwar kurakurai a cikin fayilolin buƙatun ja.
Travis CI
Ana yin tsari azaman fayil .travis.yml. Don dacewa, ina ba ku shawara ku sanya komai a cikin rubutun bash daban tare da ayyuka waɗanda za a kira su daga fayil ɗin. .travis.yml (bash script_name.sh function_name).
Za mu ƙara lambar da ake bukata zuwa rubutun a Bash, ta wannan hanyar za mu sami ƙarin ayyuka. A cikin sashe shigar bari mu rubuta kamar haka:
install:
- bash .travis.sh travis_install
Idan kuna da kowane umarni, zaku iya canza su zuwa rubutun, cire sarƙoƙi.
Bari mu buɗe fayil ɗin .travis.sh kuma ƙara saitin nazari zuwa aikin 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
}
Yanzu bari mu ƙara zuwa sashe script gudanar da bincike:
script:
- bash .travis.sh travis_script
Kuma a cikin rubutun bash:
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
}
Ana buƙatar gudanar da wannan lambar bayan gina aikin, misali, idan kuna da gini akan CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Zai kasance kamar haka:
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
}
Wataƙila kun riga kun lura da waɗannan canjin yanayi $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI ya ayyana su da kansa:
- $TRAVIS_PULL_REQUEST yana adana lambar buƙatar ja ko arya, idan wannan reshe ne na yau da kullum;
- $TRAVIS_REPO_SLUG yana adana sunan ma'ajiyar aikin.
Algorithm don wannan aikin:
Travis CI yana amsa lambobin dawowa, don haka kasancewar faɗakarwa zai gaya wa sabis ɗin don alamar aikatawa azaman ƙunshi kurakurai.
Yanzu bari mu dubi wannan layin code:
git diff --name-only origin/HEAD > .pvs-pr.list
Gaskiyar ita ce Travis CI ta haɗu da rassa ta atomatik yayin nazarin buƙatar ja:
Don haka muna nazari A4, kuma ba B3->A3. Saboda wannan fasalin, muna buƙatar lissafin bambanci tare da A3, wanda shine daidai saman reshe daga Asali.
Akwai wani muhimmin daki-daki daya da ya rage - caching dogayen fayilolin kan layi akan rukunin fassarar da aka haɗa (*.c, *.cc, *.cpp, da sauransu). Mai nazari yana ƙididdige waɗannan abubuwan dogara lokacin da aka fara ƙaddamar da shi a cikin yanayin duba jerin fayiloli sannan ya adana su a cikin .PVS-Studio directory. Travis CI yana ba ku damar adana manyan fayiloli, don haka za mu adana bayanan directory .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Ana buƙatar ƙara wannan lambar zuwa fayil ɗin .travis.yml. Wannan kundin adireshi yana adana bayanai daban-daban da aka tattara bayan bincike, waɗanda za su hanzarta gudanar da bincike na lissafin fayil na gaba ko ƙarin bincike. Idan ba a yi haka ba, to, mai nazari zai bincika duk fayilolin kowane lokaci.
aboki
Kamar Travis CI,
Da farko, muna buƙatar ƙara sabon aiki zuwa layin taro:
Bari mu nuna na'urar da aka yi amfani da ita don gina aikin. Lura da kwandon docker ɗin da aka shigar a cikin wannan aikin. Misali, akwai akwati na musamman don GCC:
Yanzu bari mu shigar da PVS-Studio da abubuwan da ake buƙata:
Bari mu ƙara layin masu zuwa ga edita:
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
Yanzu bari mu je Run tab (alama ta farko) kuma mu ƙara lambar da ke gaba zuwa filin edita daidai:
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
Idan kun karanta sashin Travs-CI, to wannan lambar ta riga ta saba muku, duk da haka, yanzu akwai sabon mataki:
Gaskiyar ita ce, yanzu ba mu bincikar sakamakon haɗakarwa ba, amma SHUGABAN reshe ne wanda aka yi buƙatun ja:
Don haka muna cikin alƙawarin sharadi B3 kuma muna buƙatar samun bambanci daga 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
Don tantancewa A3 Bari mu yi amfani da GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Mun yi amfani da masu canji masu zuwa waɗanda Buddy ke bayarwa:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - ja lambar neman;
- $BUDDY_REPO_SLUG - hade da sunan mai amfani da wurin ajiya (misali max/gwaji).
Yanzu bari mu ajiye canje-canje ta amfani da maɓallin da ke ƙasa kuma mu ba da damar nazarin buƙatar ja:
Ba kamar Travis CI ba, ba ma buƙatar tantancewa .pvs-studio don caching, tunda Buddy yana adana duk fayiloli ta atomatik don ƙaddamarwa na gaba. Don haka, abu na ƙarshe da ya rage shine adana shiga da kalmar wucewa don PVS-Studio a cikin Buddy. Bayan adana canje-canje, za a mayar da mu zuwa Pipeline. Muna buƙatar ci gaba don saita masu canji da ƙara shiga da maɓalli don PVS-Studio:
Bayan wannan, bayyanar sabon buƙatar ja ko ƙaddamarwa zai haifar da bita. Idan alƙawarin ya ƙunshi kurakurai, Buddy zai nuna wannan akan shafin nema.
AppVeyor
Saita AppVeyor yayi kama da Buddy, tunda duk abin da ke faruwa a cikin mahaɗin yanar gizo kuma babu buƙatar ƙara fayil * .yml zuwa wurin ajiyar aikin.
Bari mu je shafin Saituna a cikin bayanin aikin:
Bari mu gungurawa wannan shafin kuma mu ba da damar adana cache don tattara buƙatun ja:
Yanzu bari mu je shafin Muhalli, inda muka saka hoton don taro da masu canjin yanayi masu dacewa:
Idan kun karanta sassan da suka gabata, kun saba da waɗannan ma'auni guda biyu - PVS_KEY и PVS_USERNAME. Idan ba haka ba, bari in tunatar da ku cewa suna da mahimmanci don tabbatar da lasisin nazartar PVS-Studio. Za mu sake ganin su a cikin rubutun Bash a nan gaba.
A wannan shafin da ke ƙasa muna nuna babban fayil ɗin caching:
Idan ba mu yi haka ba, za mu bincika dukkan aikin a maimakon wasu fayiloli guda biyu, amma za mu sami fitarwa daga fayilolin da aka ƙayyade. Don haka, yana da mahimmanci a shigar da madaidaicin sunan directory.
Yanzu lokaci ya yi da za a gwada rubutun. Bude shafin Gwaji kuma zaɓi Rubutun:
Kuna buƙatar liƙa lambar da ke gaba a cikin wannan fom:
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
Mu kula da sashin wannan lambar:
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
Ƙimar ƙayyadaddun ƙayyadaddun ƙimar umarnin pwd zuwa madaidaici wanda ya kamata ya adana wannan tsohuwar ƙimar da alama baƙon abu ne a kallon farko, duk da haka, zan bayyana komai yanzu.
Yayin kafa mai tantancewa a cikin AppVeyor, na ci karo da halin ban mamaki na mai nazarin. A gefe guda, komai yayi aiki daidai, amma binciken bai fara ba. Na dauki lokaci mai yawa don lura cewa muna cikin / gida / appveyor / ayyuka / testcalc / directory, kuma mai nazari ya tabbata cewa muna cikin / opt / appveyor / gina-agent /. Sai na gane cewa canjin $PWD yana ɗan karya kaɗan. Saboda wannan dalili, na sabunta ƙimar sa da hannu kafin fara bincike.
Sannan komai ya kasance kamar da:
Yanzu la'akari da guntu mai zuwa:
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"`
A ciki mun sami bambanci tsakanin rassan da aka bayyana buƙatar ja. Don yin wannan muna buƙatar masu canjin yanayi:
- $APPVEYOR_PULL_REQUEST_NUMBER - jawo lambar neman;
- $APPVEYOR_REPO_NAME - sunan mai amfani da wurin ajiyar aikin.
ƙarshe
Tabbas, ba mu yi la'akari da duk yuwuwar ci gaba da ayyukan haɗin kai ba, duk da haka, duk suna da takamaiman takamaiman aiki da juna. Ban da caching, kowane sabis yana yin nasa "keke", don haka komai ya bambanta.
Wani wuri, kamar a cikin Travis-CI, layukan layukan lamba da caching suna aiki mara kyau; wani wuri, kamar a cikin AppVeyor, kawai kuna buƙatar saka babban fayil a cikin saitunan; amma wani wuri kana buƙatar ƙirƙirar maɓallai na musamman kuma kuyi ƙoƙarin shawo kan tsarin don ba ku damar sake rubuta guntun da aka adana. Sabili da haka, idan kuna son saita bincike na buƙatun ja akan ci gaba da sabis na haɗin kai wanda ba a tattauna a sama ba, to da farko ku tabbata cewa ba za ku sami matsala tare da caching ba.
Na gode da kulawar ku. Idan wani abu bai yi aiki ba, jin daɗin rubuta mana a
Idan kuna son raba wannan labarin tare da masu sauraron Ingilishi, da fatan za a yi amfani da hanyar haɗin fassarar: Maxim Zvyagintsev.
source: www.habr.com