GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
GitLab gustatzen zaizu eta akatsak gorrotatzen dituzu? Zure iturburu-kodearen kalitatea hobetu nahi duzu? Orduan leku egokira etorri zara. Gaur esango dizugu nola konfiguratu PVS-Studio C# analizatzailea bateratze-eskaerak egiaztatzeko. Izan unicorn aldartea eta irakurketa zoriontsua guztiontzat.

PVS-Studioa C, C++, C# eta Javan idatzitako programen iturburu-kodean akatsak eta balizko ahuleziak identifikatzeko tresna da. Windows, Linux eta macOS 64 biteko sistemetan funtzionatzen du. 32 biteko, 64 biteko eta txertatutako ARM plataformetarako diseinatutako kodea azter dezake.

Bide batez, PVS-Studio 7.08 kaleratu genuen, eta bertan gauza asko egin genituen interesgarria. Adibidez:

  • C# analizatzailea Linux eta macOSentzat;
  • Rider-erako plugina;
  • fitxategien zerrenda egiaztatzeko modu berria.

Fitxategien zerrenda egiaztatzeko modua

Aurretik, zenbait fitxategi egiaztatzeko, beharrezkoa zen .xml bat fitxategien zerrenda batekin pasatzea analizatzaileari. Baina hau oso erosoa ez denez, .txt transferitzeko gaitasuna gehitu dugu, eta horrek bizitza oso erraz egiten du.

Fitxategi zehatzak egiaztatzeko, bandera zehaztu behar duzu --sourceFiles (-f) eta transferitu .txt fitxategien zerrenda batekin. Honela dirudi:

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

Konpromiso-egiaztapena edo tira-eskaerak konfiguratzea interesatzen bazaizu, hori ere egin dezakezu modu hau erabiliz. Desberdintasuna aztertu beharreko fitxategien zerrenda lortzean izango da eta erabiltzen ari zaren sistemaren araberakoa izango da.

Bateratze-eskaera egiaztatzeko printzipioa

Egiaztapenaren funtsa da analizatzaileak bateratzean detektatu dituen arazoak ez direla bermatzea master adarra. Guk ere ez dugu proiektu osoa aztertu nahi aldi bakoitzean. Gainera, adarrak batzean, aldatutako fitxategien zerrenda dugu. Horregatik, bateratze-eskaeraren egiaztapena gehitzea proposatzen dut.

Hona hemen bateratze-eskaerak analizatzaile estatiko bat ezarri aurretik:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Hau da, adarrean zeuden akats guztiak aldaketak, maisu-adarra joango da. Hau nahi ez dugunez, analisia gehitzen dugu, eta orain diagramak honela dauka:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Aztertzen dugu aldaketak2 eta, akatsik ez badago, bateratze-eskaera onartzen dugu, bestela baztertzen dugu.

Bide batez, C/C++-rako konpromisoak eta tira-eskaerak aztertzea interesatzen bazaizu, horri buruz irakur dezakezu Hemen.

GitLab

GitLab kode irekiko web-oinarritutako DevOps bizi-ziklo-tresna bat da, Git-i kode-biltegia kudeatzeko sistema bat eskaintzen diona, bere wiki, gaien jarraipena egiteko sistema, CI/CD kanalizazioa eta beste ezaugarri batzuekin.

Bateratze-eskaerak aztertzen hasi aurretik, zure proiektua erregistratu eta igo behar duzu. Hau nola egin ez badakizu, gomendatzen dizut artikulu bat nire lankidea.

Kontuan izan. Jarraian azaltzen den ingurunea ezartzeko metodoa da posibleetako bat. Helburua analisia egiteko eta analizatzailea abiarazteko beharrezkoa den ingurunea ezartzeko urratsak erakustea da. Agian zure kasuan hobeagoa izango litzateke ingurunea prestatzeko faseak (biltegiak gehitzea, analizatzaile bat instalatzea) eta analisia bereiztea: adibidez, Docker irudiak beharrezko ingurunearekin prestatzea eta horiek erabiltzea, edo beste metodoren bat.

Orain gertatuko dena hobeto ulertzeko, diagrama hau ikustea gomendatzen dut:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Analizatzaileak .NET Core SDK 3 behar du funtzionatzeko, beraz, analizatzailea instalatu baino lehen Microsoft-en biltegiak gehitu behar dituzu analizatzaileak behar dituen mendekotasunak instalatuko diren. Microsoft biltegiak gehitzea Linux banaketa ezberdinetarako dagokion dokumentuan azalduta.

PVS-Studio pakete-kudeatzailearen bidez instalatzeko, PVS-Studio biltegiak ere gehitu beharko dituzu. Banaketa desberdinetarako biltegiak gehitzea xehetasun gehiagorekin deskribatzen da dokumentazioaren dagokion atala.

Analizatzaileak lizentzia-gako bat behar du funtzionatzeko. Proba lizentzia helbidean lor dezakezu analizatzailea deskargatzeko orria.

Kontuan izan. Kontuan izan deskribatutako funtzionamendu moduak (batze-eskaeren azterketa) Enterprise lizentzia behar duela. Beraz, funtzionamendu modu hau probatu nahi baduzu, ez ahaztu "Mezua" eremuan Enterprise lizentzia behar duzula adieraztea.

Bateratze eskaera bat gertatzen bada, aldatutako fitxategien zerrenda soilik aztertu beharko dugu, bestela fitxategi guztiak aztertuko ditugu. Azterketa egin ondoren, erregistroak behar dugun formatura bihurtu behar ditugu.

Orain, lanaren algoritmoa begien aurrean duzula, gidoi bat idaztera pasa zaitezke. Horretarako, fitxategia aldatu behar duzu .gitlab-ci.yml edo, existitzen ez bada, sortu. Sortzeko, zure proiektuaren izenaren gainean klik egin behar duzu -> Konfiguratu CI/CD.

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Orain prest gaude gidoia idazteko. Idatz dezagun lehenik analizatzailea instalatuko duen kodea eta sartu lizentzia:

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

Instalazioa eta aktibazioa beste script guztien aurretik gertatu behar direnez, etiketa berezi bat erabiltzen dugu aurretik_gidoia. Azaldu dezadan zati hau pixka bat.

Analizatzailea instalatzeko prestatzen:

  - 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

PVS-Studio biltegiak eta analizatzailea gehitzea:

  - 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

Lizentzia aktibatzea:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Erabiltzaile izena.

$PVS_KEY - produktuaren gakoa.

Proiektuaren menpekotasunak berreskuratzea non $CI_PROJECT_DIR – proiektuaren direktoriorako bide osoa:

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

Azterketa zuzena egiteko, proiektua behar bezala eraiki behar da, eta bere mendekotasunak leheneratu behar dira (adibidez, beharrezko NuGet paketeak deskargatu behar dira).

Lizentzien informazioa duten ingurune-aldagaiak ezar ditzakezu klik eginez Entorno, eta ondoren - on CI/CD.

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Irekitzen den leihoan, bilatu elementua Variables, egin klik eskuineko botoian Zabaldu eta aldagaiak gehitu. Emaitza honelakoa izan beharko litzateke:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Orain azterketara pasa zaitezke. Lehenik eta behin, gehi dezagun analisi osoa egiteko script bat. Banderara -t banderaren konponbiderako bidea pasatzen dugu -o idatzi analisiaren emaitzak idatziko diren fitxategirako bidea. Itzultzeko kodea ere interesatzen zaigu. Kasu honetan, eragiketa geldiaraztea interesatzen zaigu itzulera-kodeak analisian zehar abisuak eman direlako informazioa daukanean. Hau da zati hau nolakoa den:

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

Itzultze-kodeek bit maskararen printzipioan funtzionatzen dute. Esaterako, analisiaren ondorioz abisuak eman badira, itzultzeko kodea 8ren berdina izango da. Lizentzia hilabeteko epean iraungitzen bada, itzultzeko kodea 4ren berdina izango da. Analisian akatsak hauteman badira, eta hilabeteko epean lizentzia iraungitzen da, kodea itzultzen da, bi balioak idatziko dira: gehitu zenbakiak eta lortu azken itzulera kodea - 8+4=12. Horrela, dagozkien bitak egiaztatuz, hainbat egoerari buruzko informazioa lor daiteke analisian zehar. Itzultzeko kodeak xehetasun gehiagorekin deskribatzen dira dokumentuko "pvs-studio-dotnet (Linux / macOS) Itzultzeko kodeak" atalean "Visual Studio / MSBuild / .NET Core proiektuak komando-lerrotik egiaztatzea PVS-Studio erabiliz".

Kasu honetan, 8 agertzen den itzulera-kode guztiak interesatzen zaizkigu.

  - exit_code=$((($exit_code & 8)/8))

1 jasoko dugu itzulera-kodeak interesatzen zaigun zenbakiaren bit-a daukanean, bestela 0 jasoko dugu.

Batzeko eskaeraren azterketa gehitzeko garaia da. Hau egin baino lehen, presta dezagun gidoirako leku bat. Bateratze eskaera bat gertatzen denean bakarrik exekutatu behar dugu. Honela dirudi:

merge:
  script:
  only:
  - merge_requests

Goazen gidoiari berari. Makina birtualak ezer ez dakiela aurrean nengoen jatorria/maisu. Beraz, lagundu diezaiogun pixka bat:

  - git fetch origin

Orain adarren arteko aldea lortuko dugu eta emaitza gordeko dugu txt fitxategia:

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

non $CI_COMMIT_SHA – azken konpromisoaren hash.

Ondoren, bandera erabiliz fitxategien zerrenda aztertzen hasiko gara -f. Aurretik jasotako .txt fitxategia bertara transferitzen dugu. Beno, analisi osoarekin analogia eginez, itzultzeko kodeak aztertuko ditugu:

  - 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

Batze-eskaera egiaztatzeko script osoa honela izango da:

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

Gertatzen dena da log bihurketa gehitzea script guztiak prozesatu ondoren. Etiketa erabiltzen dugu ondoren_gidoia eta erabilgarritasuna plog-bihurgailua:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

Erabilgarritasuna plog-bihurgailua kode irekiko proiektu bat da, analizatzaile akatsen txostenak hainbat formatara bihurtzeko erabiltzen dena, HTML adibidez. Utilitatearen deskribapen zehatzagoa "Plog Converter Utility" azpiatalean ematen da. dokumentazioaren dagokion atala.

Bide batez, IDEtik lokalean .json txostenekin eroso lan egin nahi baduzu, orduan gure gomendatzen dizut. plugina IDE Riderrentzat. Bere erabilera zehatzago deskribatzen da dagokion dokumentua.

Erosotasunagatik, hona hemen .gitlab-ci.yml osorik:

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.json

Fitxategian guztia gehitu ondoren, egin klik Konprometitu aldaketak. Dena zuzena dela ikusteko, joan hona CI/CD -> hodiak -> carrera. Makina birtualaren leiho bat irekiko da, eta horren amaieran honako hau egon beharko litzateke:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
zerra Lanek arrakasta izan zuen - arrakasta, dena ondo dago. Orain egin duzuna probatu dezakezu.

Lan-adibideak

Lanaren adibide baterako, sor dezagun proiektu sinple bat (in master) hainbat fitxategi edukiko dituena. Horren ostean, beste adar batean fitxategi bakarra aldatuko dugu eta bateratze eskaera egiten saiatuko gara.

Azter ditzagun bi kasu: aldatutako fitxategiak errore bat duenean eta noiz ez. Lehenik eta behin, errore bat duen adibide bat.

Demagun adarreko maisuan fitxategi bat dagoela Programa.cs, akatsik ez duena, baina beste adar batean garatzaileak kode okerra gehitu zuen eta bateratze eskaera egin nahi du. Zer nolako akatsa egin zuen ez da hain garrantzitsua, gauza nagusia existitzen dela da. Adibidez, operadoreak ahaztu egin du bota (Bai, hain gaizki):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

Ikus dezagun errore batekin adibide bat aztertzearen emaitza. Gainera, fitxategi bakarra analizatu zela ziurtatzeko, bandera gehitu nuen -r pvs-studio-dotnet abiarazte lerrora:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Ikusten dugu analizatzaileak errore bat aurkitu zuela eta ez zuela adarrak batzen onartzen.

Ikus dezagun adibidea errorerik gabe. Kodea zuzentzea:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

Bateratu eskaeraren analisiaren emaitzak:

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Ikus dezakegunez, ez da akatsik aurkitu, eta zereginen exekuzioa arrakastatsua izan da, hori da egiaztatu nahi genuena.

Ondorioa

Adarrak batu aurretik kode txarra kentzea oso erosoa eta atsegina da. Beraz, CI/CD erabiltzen ari bazara, saiatu analizatzaile estatiko bat txertatzen egiaztatzeko. Gainera, hau nahiko sinplea da.

Eskerrik asko zure arretagatik.

GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz
Artikulu hau ingelesez hitz egiten duen publiko batekin partekatu nahi baduzu, mesedez, erabili itzulpen esteka: Nikolay Mironov. GitLab-en bateratze-eskaeren azterketa C#-rako PVS-Studio erabiliz.

Iturria: www.habr.com

Gehitu iruzkin berria