
Rakastatko GitLabia ja vihaat bugeja? Haluatko parantaa lähdekoodisi laatua? Sitten olet tullut oikeaan paikkaan. Tänään kerromme, kuinka PVS-Studio C# -analysaattori määritetään tarkistamaan yhdistämispyynnöt. Yksisarvista tunnelmaa ja iloista lukuhetkeä kaikille.
— это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках C, C++, C# и Java. Работает в 64-битных системах на Windows, Linux и macOS. Может анализировать код, предназначенный для 32-битных, 64-битных и встраиваемых ARM платформ.
Muuten, julkaisimme PVS-Studio 7.08:n, jossa teimme paljon asioita . Esimerkiksi:
- анализатор C# под Linux и macOS;
- laajennus Riderille;
- uusi tiedostoluettelon tarkistustila.
Tiedostoluettelon tarkistustila
Aiemmin tiettyjen tiedostojen tarkistamiseksi piti välittää analysaattorille .xml tiedostoluetteloineen. Mutta koska tämä ei ole kovin kätevää, olemme lisänneet mahdollisuuden siirtää .txt-tiedostoa, mikä tekee elämästä erittäin helppoa.
Tiettyjen tiedostojen tarkistamiseksi sinun on määritettävä lippu --lähdetiedostot (-f) ja siirrä .txt tiedostoluetteloineen. Se näyttää tältä:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.jsonJos olet kiinnostunut määrittämään sitoumustarkistus- tai vetopyyntöjä, voit tehdä sen myös tässä tilassa. Erona on analysoitavien tiedostojen luettelon saaminen, ja se riippuu käyttämistäsi järjestelmistä.
Yhdistämispyynnön tarkistamisen periaate
Tarkistuksen päätarkoitus on varmistaa, että analysaattorin yhdistämisen aikana havaitsemat ongelmat eivät joudu järjestelmään mestari haara. Emme myöskään halua analysoida koko projektia joka kerta. Lisäksi, kun haaroja yhdistetään, meillä on luettelo muuttuneista tiedostoista. Siksi suosittelen yhdistämispyynnön tarkistuksen lisäämistä.
Tältä yhdistämispyyntö näyttää ennen staattisen analysaattorin käyttöönottoa:

Eli kaikki virheet, jotka olivat haarassa muutokset, siirtyy päähaaraan. Koska emme haluaisi tätä, lisäämme analyysin, ja nyt kaavio näyttää tältä:

Analysoidaan muutokset 2 ja jos virheitä ei ole, hyväksymme yhdistämispyynnön, muuten hylkäämme sen.
Muuten, jos olet kiinnostunut analysoimaan C/C++:n sitoumuksia ja vetopyyntöjä, voit lukea siitä .
GitLab
on avoimen lähdekoodin verkkopohjainen DevOps-elinkaarityökalu, joka tarjoaa Gitille koodivaraston hallintajärjestelmän, jossa on oma wiki, ongelmanseurantajärjestelmä, CI/CD-putki ja muita ominaisuuksia.
Ennen kuin aloitat yhdistämispyyntöjen analysoinnin, sinun on rekisteröidyttävä ja ladattava projektisi. Jos et tiedä miten tämä tehdään, niin suosittelen kollegani.
Huomata. Alla kuvattu ympäristön perustamismenetelmä on yksi mahdollisista. Tavoitteena on näyttää vaiheet analysointiin tarvittavan ympäristön luomiseksi ja analysaattorin käynnistämiseksi. Ehkä sinun tapauksessasi olisi optimaalisempaa erottaa ympäristön valmistelun (arkistojen lisääminen, analysaattorin asennus) ja analyysin vaiheet: esimerkiksi Docker-kuvien valmisteleminen tarvittavalla ympäristöllä ja niiden käyttö tai jokin muu menetelmä.
Ymmärtääksesi paremmin, mitä nyt tapahtuu, suosittelen katsomaan seuraavaa kaaviota:

Для работы анализатору требуется .NET Core SDK 3, поэтому перед установкой анализатора нужно добавить репозитории Microsoft, из которых будут установлены необходимые для анализатора зависимости. Добавление репозиториев Microsoft для различных дистрибутивов Linux .
Jos haluat asentaa PVS-Studion paketinhallinnan kautta, sinun on myös lisättävä PVS-Studio-arkistot. Tietovarastojen lisääminen eri jakeluille on kuvattu tarkemmin kohdassa .
Analysaattori vaatii toimiakseen lisenssiavaimen. Voit saada koekäyttöluvan osoitteessa .
Huomata. Huomaa, että kuvattu toimintatapa (yhdistyspyyntöjen analyysi) vaatii Enterprise-lisenssin. Siksi, jos haluat kokeilla tätä toimintatapaa, älä unohda ilmoittaa Viesti-kenttään, että tarvitset Enterprise-lisenssin.
Jos yhdistämispyyntö tapahtuu, meidän on analysoitava vain muuttuneiden tiedostojen luettelo, muuten analysoimme kaikki tiedostot. Analyysin jälkeen meidän on muunnettava lokit tarvitsemaamme muotoon.
Nyt, kun työskentelyalgoritmi on silmiesi edessä, voit siirtyä käsikirjoituksen kirjoittamiseen. Tätä varten sinun on vaihdettava tiedosto .gitlab-ci.yml tai jos sitä ei ole, luo se. Luodaksesi sen, sinun on napsautettava projektisi nimeä -> Aseta CI/CD.

Nyt olemme valmiita kirjoittamaan käsikirjoituksen. Kirjoita ensin koodi, joka asentaa analysaattorin ja syötä lisenssi:
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.slnKoska asennuksen ja aktivoinnin on tapahduttava ennen kaikkia muita komentosarjoja, käytämme erityistä etikettiä ennen_kirjoitusta. Selitän hieman tätä fragmenttia.
Analysaattorin asennuksen valmistelu:
- 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-tietovarastojen ja analysaattorin lisääminen:
- 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-dotnetLisenssin aktivointi:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY$PVS_NAME - Käyttäjätunnus.
$PVS_KEY - tuoteavain.
Projektiriippuvuuksien palauttaminen missä $CI_PROJECT_DIR – koko polku projektihakemistoon:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.slnOikeaa analysointia varten projekti on rakennettava onnistuneesti ja sen riippuvuudet on palautettava (esimerkiksi tarvittavat NuGet-paketit on ladattava).
Voit asettaa lisenssitietoja sisältäviä ympäristömuuttujia napsauttamalla Asetus, ja sen jälkeen - päällä CI/CD.

Etsi avautuvasta ikkunasta kohde Muuttujat, napsauta oikealla olevaa painiketta Laajentaa ja lisää muuttujia. Tuloksen pitäisi näyttää tältä:

Nyt voit siirtyä analyysiin. Lisätään ensin skripti täydelliseen analyysiin. Lippuun -t ohitamme polun ratkaisuun lipulle -o Kirjoita polku tiedostoon, johon analyysitulokset kirjoitetaan. Olemme myös kiinnostuneita palautuskoodista. Tässä tapauksessa olemme kiinnostuneita siitä, että toiminto pysähtyy, kun palautuskoodi sisältää tiedon, että analyysin aikana on annettu varoituksia. Tämä fragmentti näyttää tältä:
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Коды возврата работают по принципу битовой маски. Например, если в результате анализа были выданы предупреждения, то код возврата будет равен 8. Если лицензия истечёт в течение месяца, то код возврата будет равен 4. Если же в ходе анализа были обнаружены ошибки, а также лицензия истекает в течение месяца, в код возврата будут записаны оба значения: складываем числа вместе и получаем итоговый код возврата — 8+4=12. Таким образом, проверяя соответствующие биты, можно получать информацию о различных состояниях во время анализа. Более подробно коды возврата описываются в разделе "Коды возврата pvs-studio-dotnet (Linux / macOS)" документа "".
Tässä tapauksessa olemme kiinnostuneita kaikista palautuskoodeista, joissa 8 esiintyy.
- exit_code=$((($exit_code & 8)/8))Saamme 1, kun palautuskoodi sisältää bitin meitä kiinnostavasta numerosta, muuten saamme 0.
On aika lisätä yhdistämispyyntöanalyysi. Ennen kuin teemme tämän, valmistetaan paikka käsikirjoitukselle. Meidän on suoritettava se vain, kun yhdistämispyyntö tapahtuu. Se näyttää tältä:
merge:
script:
only:
- merge_requestsSiirrytään itse käsikirjoitukseen. Kohtasin sen tosiasian, että virtuaalikone ei tiedä siitä mitään alkuperä/mestari. Joten autetaan häntä hieman:
- git fetch originNyt saamme eron haarojen välillä ja tallennamme tuloksen txt tiedosto:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtjossa $CI_COMMIT_SHA – viimeisen sitoumuksen hash.
Seuraavaksi alamme analysoida tiedostoluetteloa lipun avulla -f. Siirrämme siihen aiemmin vastaanotetun .txt-tiedoston. No, analogisesti täydellisen analyysin kanssa, tarkastelemme palautuskoodeja:
- 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äydellinen skripti yhdistämispyynnön tarkistamiseksi näyttää tältä:
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äljelle jää vain lokin muuntaminen sen jälkeen, kun kaikki komentosarjat on käsitelty. Käytämme etikettiä after_script ja hyödyllisyys plog-muunnin:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.jsonApuohjelma on avoimen lähdekoodin projekti, jota käytetään jäsentimen virheraporttien muuntamiseen erilaisiin muotoihin, kuten HTML-muotoon. Tarkempi kuvaus apuohjelmasta löytyy alaosiosta "Plog Converter Utility" .
Muuten, jos haluat kätevästi työskennellä .json-raporttien kanssa paikallisesti IDE:stä, suosittelen joukkueelle IDE Rider. Sen käyttöä on kuvattu tarkemmin kohdassa .
Tässä se on mukavuuden vuoksi .gitlab-ci.yml kokonaan:
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.jsonKun olet lisännyt kaiken tiedostoon, napsauta Tee muutoksia. Nähdäksesi, että kaikki on oikein, siirry kohtaan CI / CD -> putkistojen -> Running. Näkyviin tulee virtuaalikoneen ikkuna, jonka lopussa pitäisi olla seuraava:

näin Työ onnistui - menestystä, kaikki on hyvin. Nyt voit testata, mitä olet tehnyt.
Työesimerkkejä
Esimerkkinä työstä luodaan yksinkertainen projekti (in mestari), joka sisältää useita tiedostoja. Sen jälkeen muutetaan toisessa haarassa vain yhtä tiedostoa ja yritämme tehdä yhdistämispyynnön.
Tarkastellaan kahta tapausta: milloin muokattu tiedosto sisältää virheen ja milloin se ei sisällä. Ensinnäkin esimerkki virheestä.
Oletetaan, että päähaarassa on tiedosto Program.cs, joka ei sisällä virheitä, mutta toiseen haaraan kehittäjä lisäsi virheellisen koodin ja haluaa tehdä yhdistämispyynnön. Millaisen virheen hän teki, ei ole niin tärkeää, pääasia, että se on olemassa. Esimerkiksi operaattori unohti heittää (Joo, ):
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}Katsotaanpa virheen sisältävän esimerkin analysoinnin tulosta. Lisäsin lipun myös varmistaakseni, että vain yksi tiedosto jäsennettiin -r pvs-studio-dotnet-aloitusriville:

Näemme, että analysaattori löysi virheen eikä sallinut haarojen yhdistämistä.
Tarkastetaan esimerkkiä ilman virhettä. Koodin korjaaminen:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}Yhdistämispyyntöanalyysin tulokset:

Kuten näemme, virheitä ei löytynyt ja tehtävän suoritus onnistui, minkä halusimme tarkistaa.
Johtopäätös
Huonon koodin karsiminen pois ennen oksien yhdistämistä on erittäin kätevää ja miellyttävää. Joten jos käytät CI/CD:tä, yritä upottaa staattinen analysaattori tarkistaaksesi. Lisäksi tämä tehdään melko yksinkertaisesti.
Kiitos huomiota.
Jos haluat jakaa tämän artikkelin englanninkielisen yleisön kanssa, käytä käännöslinkkiä: Nikolay Mironov. .
Lähde: will.com
