
Kas armastate GitLabi ja vihkate vigu? Kas soovite parandada lähtekoodi kvaliteeti? Siis olete õigesse kohta sattunud. Täna räägime, kuidas seadistada C# analüsaator PVS-Studio, et kontrollida merge request'e. Soovime kõigile ükssarvikute meeleolu ja head lugemist.
— see on tööriist vigade ja võimalike haavatavuste tuvastamiseks C, C++, C# ja Java keeles kirjutatud programmide lähtekoodis. Töötab 64-bitistes süsteemides Windowsis, Linuxis ja macOS-is. Suudab analüüsida koodi, mis on mõeldud 32-bitistele, 64-bitistele ja manustatud ARM-platvormidele.
Muide, meil ilmus PVS-Studio 7.08, kus tegime palju huvitavat . Näiteks:
- C# analüsaator Linuxi ja macOS-i jaoks;
- plugin Riderile;
- uus failide nimekirja kontrollimise režiim.
Failide nimekirja kontrollimise režiim
Varem, et kontrollida teatud faile, tuli analüsaatorile edastada .xml fail nimekirjaga. Kuid kuna see ei olnud väga mugav, lisasime võimaluse edastada .txt, mis lihtsustab elu oluliselt.
Teatud failide kontrollimiseks peate määrama lipu —sourceFiles (-f) ja edastama .txt nimekirjaga. See näeb välja järgmine:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.jsonKui teid huvitab commitide või pull requestide kontrollimise seadistamine, siis saate seda teha ka selle režiimi abil. Erinevus seisneb failide analüüsimise nimekirja saamise meetodis ja see sõltub kasutatavatest süsteemidest.
Merge requestide kontrollimise põhimõte
Kontrollimise peamine eesmärk on tagada, et analüsaatori tuvastatud probleemid ei satuks master harusse. Samuti ei soovi me iga kord kogu projekti analüüsida. Eriti kuna harude liitmisel on meil loetelu muudetud failidest. Seega soovitan lisada merge requestide kontrollimise.
Nii näeb merge request välja enne staatilise analüsaatori rakendamist:

See tähendab, et kõik vead, mis olid harus changes, lähevad üle peaharusse. Kuna me seda ei soovi, lisame analüüsi ja nüüd näeb skeem välja järgmiselt:

Analüüsime changes2 ja kui vigu pole, aktsepteerime merge requesti, vastasel juhul lükkame selle tagasi.
Muide, kui teid huvitab commitide ja pull requestide analüüs C/C++ jaoks, siis saate sellest lugeda .
GitLab
— avatud lähtekoodiga DevOps elutsükli veebitööriist, mis esindab koodi hoidlate haldussüsteemi Git'i jaoks koos oma vikiga, veaparanduste jälgimise süsteemiga, CI/CD torujuhtme ja muude funktsioonidega.
Enne, kui asute merge request'ide analüüsi rakendama, peate registreeruma ja oma projekti üles laadima. Kui te ei tea, kuidas seda teha, siis soovitan minu kolleegi.
Märkus. Allpool kirjeldatud keskkonna seadistamise meetod on üks võimalustest. Eesmärk on näidata samme, kuidas seadistada analüüsi jaoks vajalik keskkond ja käivitada analüsaator. Võib-olla on teie puhul optimaalsem etappide jagamine (hoidlate lisamine, analüüsaatori installimine) ja analüüs: näiteks Docker piltide ettevalmistamine vajaliku keskkonnaga ja nende kasutamine või mõni muu meetod.
Et paremini mõista, mis järgmisena juhtub, soovitan vaadata järgmist skeemi:

Analüsaatoriks vajalik .NET Core SDK 3, seetõttu tuleb analüsaatori paigaldamise eel lisada Microsofti hoidlad, kust paigaldatakse analüsaatori jaoks vajalikud sõltuvused. Microsofti hoidlate lisamine erinevatele Linuxi distributsioonidele .
PVS-Studio installimiseks pakihalduri kaudu tuleb samuti lisada PVS-Studio hoidlad. Hoidlate lisamine erinevatele distributsioonidele on üksikasjalikult kirjeldatud .
Analüsaatori tööks on vajalik litsentsivõti. Prooviversiooni saamiseks külastage .
Märkus. Pange tähele, et kirjeldatud töörežiimiks (tõhususe analüüs merge requestide jaoks) on vajalik Enterprise litsents. Seega, kui soovite seda töörežiimi proovida, pöörake tähelepanu, et valdkonnas "Teade" peate märkima, et vajalik on just Enterprise litsents.
Kui toimub merge request, siis peame analüüsima ainult muudetud failide loendit, muul juhul analüüsime kõiki faile. Pärast analüüsi tuleb logid konverteerida vajalikku vormingusse.
Nüüd, olles töökava silme ees, saame liikuda skripti kirjutamise juurde. Selleks tuleb muuta faili .gitlab-ci.yml või, kui seda ei ole, luua see. Selle loomiseks vajutage oma projekti nimele -> Seadista CI/CD.

Nüüd oleme valmis skripti kirjutamiseks. Alustame kodeerimist, mis installib analüsaatori ja sisestab litsentsi:
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- 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-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.slnKuna installimine ja aktiveerimine peab toimuma enne kõiki teisi skripte, kasutame spetsiaalset märget before_script. Selgitan seda fragmenti veidi.
Analüsaatori installimise ettevalmistamine:
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get updatePVS-Studio ja analüsaatori reposte lisamine:
- 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-dotnetLitsentsi aktiveerimine:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY$PVS_NAME — kasutajanimi.
$PVS_KEY — tootevõti.
Projektide sõltuvuste taastamine, kus $CI_PROJECT_DIR – täielik teeperekond projekti katalooge:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.slnKorrektseks analüüsiks peab projekt edukalt olema kompileeritud ja selle sõltuvused peavad olema taastatud (näiteks vajalikud NuGet paketid peavad olema alla laetud).
Keskkonnamuutujate seadistamiseks, mis sisaldavad litsentsi teavet, klõpsake Seaded, ja seejärel klõpsake CI / CD.

Avanevas aknas otsime Muutujad, paremal klõpsame nupule Laienda ja lisame muutujad. Tulemus peaks olema järgmine:

Nüüd saab analüüsile üle minna. Esiteks lisame skripti täieliku analüüsi jaoks. Lipp -t edastame teeperekonna lahenduse juurde, lipp -o mõtleme faili teele, kuhu analüüsi tulemused salvestatakse. Samuti huvitab meid tagasikutsumise kood. Antud juhul on oluline, et töö lõppeks, kui tagasikutsumise kood sisaldab teavet, et analüüsi käigus olid antud hoiatused. Niisiis, see lõik näeb välja selline:
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fiTagasikutsumise koodid toimivad bitimaski põhimõttel. Näiteks, kui analüüsi tulemusel antakse hoiatuseid, siis tagasikutsumise kood on 8. Kui litsents aegub kuu jooksul, siis tagasikutsumise kood on 4. Kui analüüsi käigus leitakse vigu ja litsents aegub kuu jooksul, siis koodis on kirjas mõlemad väärtused: liidame numbrid kokku ja saame lõppkoodina — 8+4=12. Nii et sobivate bitide kontrollimisega on võimalik saada teavet erinevate seisundite kohta analüüsi käigus. Tagasikutsumise koode kirjeldatakse põhjalikumalt jaotises "pvs-studio-dotnet tagasikutsumise koodid (Linux / macOS)" dokumentatsioonis "".
Antud juhul huvitavad meid kõik tagastuskoode, kus figureerib 8.
- exit_code=$((($exit_code & 8)/8))Saame 1, kui tagastuskoht sisaldab meid huvitavat bitti, vastasel juhul saame 0.
On aeg lisada merge request'i analüüs. Enne seda valmistame skripti jaoks koha ette. Peame kindlustama, et see käivitatakse ainult siis, kui toimub merge request. See näeb välja nii:
merge:
script:
only:
- merge_requestsLiigume skripti juurde. Kohtasin seda, et virtuaalmasin ei tea midagi origin/master. Seega aitame tal veidi:
- git fetch originNüüd saame harude erinevuse ja salvestame tulemuse txt faili:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtKus $CI_COMMIT_SHA – viimase commit'i hash.
Edasi käivitame failide nimekirja analüüsi, kasutades lippu -f. Edastame eelnevalt saadud .txt faili. Ja analoogiliselt täieliku analüüsiga vaatame tagastuskoode:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fiTäielik skript merge request'i kontrollimiseks näeb välja nii:
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requestsJääb ainult logi konverteerimine lisada pärast kõigi skriptide töötamist. Kasutame märgist pärast_skripti ja utiliiti plog-converter:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.jsonTööriist — see on avatud lähtekoodiga projekt, mida kasutatakse analüsaatori veateate aruannete konverteerimiseks erinevatesse vormidesse, näiteks HTML. Utiliidi põhjalik kirjeldus on esitatud "Plog Converter Utility" alajaotuses .
Muide, kui soovite .json aruanne mugavalt IDE-s kohapeal kasutada, siis soovitan meie IDE Riderile. Selle kasutamist käsitletakse põhjalikumalt .
Mugavuse huvides siin .gitlab-ci.yml kogu:
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- 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-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.jsonKui kõik faili lisada, vajutage Commit changes. Kuidas veenduda, et kõik on õige, minema CI/CD -> Torud -> Running. Avaneb virtuaalmasina aken, mille lõpus peaks olema järgmine:

Nägin Töö õnnestus – edu, kõik on suurepärane. Nüüd saab ka valminut katsetada.
Näidised töötamisest
Näiteks loome lihtsa projekti (s master) kus on mitu faili. Pärast seda muudame teises harus ainult ühe faili ja proovime teha merge request'i.
Vaatleme kahte juhtumit: kui muudetud fail sisaldab viga ja kui ei. Alustame näitega, kus on viga.
Oletame, et master harus on fail Program.cs, mis ei sisalda vigu, kuid teises harus on arendaja lisanud vigase koodi ja soovib teha merge request'i. Millise vea ta tegi – ei ole nii oluline, oluline on see, et see on olemas. Näiteks unustas ta operaatori viska (jah, ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// tee midagi
....
}Vaadakem vea analüüsi tulemust. Samuti olen veendunud, et analüüsiti ainult ühte faili, lisades lipu -r pvs-studio-dotnet: käivitusreale:

Näeme, et analüsaator leidis vea ja ei lubanud harude liitmist.
Kontrollime näidet, kus viga ei esine. Parandame koodi:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// tee midagi
....
}Merge request'i analüüsi tulemused:

Kuidas näeme, vigu ei leitud ja ülesande täitmine õnnestus, nagu me soovisime kontrollida.
Kokkuvõte
Halbamine vale koodi haruude amalgamatsiooni – see on väga mugav ja meeldiv. Seetõttu, kui kasutate CI/CD, proovige integreerida staatiline analüsaator kontrollimiseks. Eriti kuna see on piisavalt lihtne.
Aitäh tähelepanu eest.
Kui soovite jagada seda artiklit ingliskeelse publikuga, palun kasutage tõlke linki: Nikolay Mironov. .
Allikas: habr.com
