Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Nahigugma sa GitLab ug nagdumot sa mga bug? Gusto nga mapauswag ang kalidad sa imong source code? Unya mianhi ka sa hustong dapit. Karon isulti namon kanimo kung giunsa ang pag-configure sa PVS-Studio C# analyzer aron masusi ang mga hangyo sa paghiusa. Pagbaton og unicorn mood ug malipayong pagbasa sa tanan.

PVS Studio usa ka himan alang sa pag-ila sa mga sayup ug potensyal nga mga kahuyangan sa source code sa mga programa nga gisulat sa C, C++, C# ug Java. Nagtrabaho sa 64-bit nga mga sistema sa Windows, Linux ug macOS. Mahimong analisahon ang code nga gidisenyo alang sa 32-bit, 64-bit ug naka-embed nga ARM nga mga plataporma.

Pinaagi sa dalan, gipagawas namon ang PVS-Studio 7.08, diin daghang mga butang ang among nahimo makapaikag. Pananglitan:

  • C # analyzer alang sa Linux ug macOS;
  • plugin alang sa Rider;
  • bag-ong file checking mode.

Pagsusi sa lista sa file mode

Kaniadto, aron masusi ang pipila ka mga file, kinahanglan nga ipasa ang usa ka .xml nga adunay usa ka lista sa mga file sa tig-analisar. Apan tungod kay kini dili kaayo kombenyente, among gidugang ang abilidad sa pagbalhin sa .txt, nga naghimo sa kinabuhi nga yano kaayo.

Aron masusi ang piho nga mga file, kinahanglan nimong ipiho ang bandila --sourceFiles (-f) ug ibalhin ang .txt nga adunay lista sa mga file. Murag mao ni:

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

Kung interesado ka sa pag-set up sa commit checking o pull requests, mahimo usab nimo kana gamit kini nga mode. Ang kalainan mao ang pagkuha sa usa ka lista sa mga file aron analisahon ug magdepende kung unsang mga sistema ang imong gigamit.

Ang prinsipyo sa pagsusi sa usa ka hangyo sa paghiusa

Ang panguna nga esensya sa tseke mao ang pagsiguro nga ang mga problema nga nakit-an sa analisador sa panahon sa paghiusa dili mahulog sa agalon sanga. Dili usab namo gusto nga analisahon ang tibuok proyekto matag higayon. Dugang pa, kung maghiusa sa mga sanga, kami adunay usa ka lista sa nabag-o nga mga file. Busa, gisugyot nako ang pagdugang usa ka pagsusi sa hangyo sa paghiusa.

Mao kini ang hitsura sa usa ka hangyo sa paghiusa sa wala pa ipatuman ang usa ka static analyzer:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Kana mao, ang tanan nga mga sayup nga naa sa sanga mga kausaban, mobalhin sa master branch. Tungod kay dili namo gusto kini, among gidugang ang pagtuki, ug karon ang diagram ingon niini:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Pagtuki pagbag-o2 ug, kung walay mga kasaypanan, among dawaton ang hangyo sa paghiusa, kung dili, among isalikway kini.

Pinaagi sa dalan, kung interesado ka sa pag-analisar sa mga commit ug pagbitad sa mga hangyo alang sa C / C ++, mahimo nimong basahon ang bahin niini dinhi.

GitLab

GitLab kay usa ka open source nga web-based nga DevOps lifecycle tool nga naghatag ug code repository management system para sa Git nga adunay kaugalingong wiki, issue tracking system, CI/CD pipeline ug uban pang feature.

Sa dili ka pa magsugod sa pag-analisar sa mga hangyo sa paghiusa, kinahanglan nimo nga magparehistro ug mag-upload sa imong proyekto. Kung wala ka mahibal-an kung giunsa kini buhaton, gisugyot ko usa ka artikulo akong kauban.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Ang pamaagi sa pagpahimutang sa palibot nga gihulagway sa ubos usa sa mga posible. Ang tumong mao ang pagpakita sa mga lakang sa pagpahimutang sa palibot nga gikinahanglan alang sa pagtuki ug paglansad sa analisador. Tingali sa imong kaso mas maayo nga ibulag ang mga yugto sa pag-andam sa kalikopan (pagdugang mga repository, pag-install sa usa ka analista) ug pagtuki: pananglitan, pag-andam sa mga imahe sa Docker nga adunay kinahanglan nga palibot ug paggamit niini, o uban pang pamaagi.

Aron mas masabtan kung unsa ang mahitabo karon, gisugyot nako nga tan-awon ang mosunod nga diagram:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Ang analista nagkinahanglan sa .NET Core SDK 3 sa pag-operate, mao nga sa dili pa i-install ang analyzer kinahanglan nimo nga idugang ang mga Microsoft repository diin ang mga dependency nga gikinahanglan alang sa analyzer i-install. Pagdugang mga repositoryo sa Microsoft alang sa lainlaing mga distribusyon sa Linux gihulagway sa katugbang nga dokumento.

Aron ma-install ang PVS-Studio pinaagi sa manager sa package, kinahanglan usab nimo nga idugang ang mga repositoryo sa PVS-Studio. Ang pagdugang sa mga repository alang sa lainlaing mga pag-apod-apod gihulagway sa mas detalyado sa may kalabutan nga seksyon sa dokumentasyon.

Ang analista nanginahanglan usa ka yawe sa lisensya aron makalihok. Makuha nimo ang lisensya sa pagsulay sa panid sa pag-download sa analisador.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Palihug timan-i nga ang gihulagway nga paagi sa operasyon (pagtuki sa mga hangyo sa paghiusa) nanginahanglan usa ka lisensya sa Enterprise. Busa, kung gusto nimong sulayan kini nga paagi sa operasyon, ayaw kalimti nga ipakita sa uma nga "Mensahe" nga kinahanglan nimo ang lisensya sa Enterprise.

Kung mahitabo ang usa ka hangyo sa paghiusa, nan kinahanglan ra namon nga analisahon ang lista sa nabag-o nga mga file, kung dili, analisahon namon ang tanan nga mga file. Human sa pagtuki, kinahanglan natong i-convert ang mga troso ngadto sa format nga atong gikinahanglan.

Karon, nga adunay algorithm sa trabaho sa atubangan sa imong mga mata, mahimo ka magpadayon sa pagsulat sa usa ka script. Aron mahimo kini, kinahanglan nimo nga usbon ang file .gitlab-ci.yml o, kung wala kini, buhata kini. Aron mahimo kini, kinahanglan nimo nga i-klik ang ngalan sa imong proyekto -> I-set up ang CI/CD.

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Karon andam na kami sa pagsulat sa script. Isulat una nato ang code nga mag-install sa analisador ug mosulod sa lisensya:

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

Tungod kay ang pag-instalar ug pagpaaktibo kinahanglan mahitabo sa wala pa ang tanan nga uban pang mga script, naggamit kami usa ka espesyal nga label before_script. Tugoti ako nga ipasabut kini nga tipik.

Pag-andam sa pag-instalar sa analisador:

  - 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

Pagdugang sa mga repositoryo ug analista sa PVS-Studio:

  - 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

Pagpaaktibo sa lisensya:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Username.

$PVS_KEY - yawe sa produkto.

Pagbawi sa mga dependency sa proyekto kung diin $CI_PROJECT_DIR – bug-os nga dalan sa direktoryo sa proyekto:

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

Para sa husto nga pagtuki, ang proyekto kinahanglang matukod nga malampuson, ug ang mga dependency niini kinahanglang ibalik (pananglitan, ang gikinahanglan nga mga pakete sa NuGet kinahanglang ma-download).

Mahimo nimong itakda ang mga variable sa palibot nga adunay kasayuran sa lisensya pinaagi sa pag-klik setting, ug pagkahuman - sa CI/CD.

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Sa bintana nga nagbukas, pangitaa ang butang Mga variables, i-klik ang buton sa tuo Expand ug idugang ang mga variable. Ang resulta kinahanglan nga tan-awon sama niini:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Karon mahimo ka magpadayon sa pag-analisar. Una, magdugang ta og script para sa kompleto nga pagtuki. Ngadto sa bandera -t atong ipasa ang dalan ngadto sa solusyon sa bandila -o isulat ang dalan sa file diin ang mga resulta sa pagtuki isulat. Interesado usab kami sa return code. Sa kini nga kaso, interesado kami sa paghunong sa operasyon kung ang code sa pagbalik adunay kasayuran nga ang mga pasidaan gihatag sa panahon sa pag-analisar. Mao kini ang hitsura niini nga tipik:

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

Ang mga code sa pagbalik nagtrabaho sa prinsipyo sa usa ka gamay nga maskara. Pananglitan, kung ang mga pasidaan gi-isyu ingon usa ka sangputanan sa pag-analisar, nan ang pagbalik code mahimong katumbas sa 8. Kung ang lisensya matapos sa sulod sa usa ka bulan, nan ang pagbalik code mahimong katumbas sa 4. Kung ang mga sayup nakit-an sa panahon sa pag-analisar, ug ang lisensya matapos sa sulod sa usa ka bulan, ang pagbalik sa code, ang duha nga mga kantidad isulat: idugang ang mga numero ug makuha ang katapusan nga code sa pagbalik - 8 + 4 = 12. Sa ingon, pinaagi sa pagsusi sa katugbang nga mga piraso, ang kasayuran bahin sa lainlaing mga estado mahimong makuha sa panahon sa pagtuki. Ang mga return code gihulagway sa mas detalyado sa "pvs-studio-dotnet (Linux / macOS) Return Codes" nga seksyon sa dokumento "Pagsusi sa Visual Studio / MSBuild / .NET Core nga mga proyekto gikan sa command line gamit ang PVS-Studio".

Sa kini nga kaso, interesado kami sa tanan nga mga code sa pagbalik kung diin makita ang 8.

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

Makadawat kami og 1 kung ang code sa pagbalik adunay gamay nga numero nga among interesado, kung dili makadawat kami 0.

Panahon na aron idugang ang pag-analisar sa hangyo sa paghiusa. Sa dili pa nato kini buhaton, mag-andam kita og dapit alang sa script. Kinahanglan namon kini nga ipatuman lamang kung adunay mahitabo nga hangyo sa paghiusa. Murag mao ni:

merge:
  script:
  only:
  - merge_requests

Mopadayon kita sa script mismo. Nag-atubang ako sa kamatuoran nga ang virtual machine wala’y nahibal-an bahin sa bisan unsa gigikanan/agalon. Busa tabangan ta siya gamay:

  - git fetch origin

Karon atong makuha ang kalainan tali sa mga sanga ug i-save ang resulta txt file:

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

Diin $CI_COMMIT_SHA – hash sa katapusang commit.

Sunod, magsugod kami sa pag-analisar sa lista sa mga file gamit ang bandila -f. Among gibalhin ang nadawat nga .txt file ngadto niini. Aw, pinaagi sa pagtandi sa bug-os nga pag-analisar, gitan-aw namon ang mga code sa pagbalik:

  - 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

Ang kompleto nga script alang sa pagsusi sa usa ka hangyo sa paghiusa mahimong sama niini:

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

Ang nahabilin mao ang pagdugang sa pagbag-o sa log pagkahuman naproseso ang tanan nga mga script. Gigamit namon ang label pagkahuman_script ug utility tigbalhin-balhin:

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

Gamit tigbalhin-balhin kay usa ka open source nga proyekto nga gigamit sa pag-convert sa parser error reports ngadto sa lain-laing porma, sama sa HTML. Ang usa ka mas detalyado nga paghulagway sa utility gihatag sa subseksyon nga "Plog Converter Utility" may kalabutan nga seksyon sa dokumentasyon.

Pinaagi sa dalan, kung gusto nimo nga dali nga magtrabaho kauban ang .json nga mga taho sa lokal gikan sa IDE, unya gisugyot ko ang among plugin para sa IDE Rider. Ang paggamit niini gihulagway sa mas detalyado sa may kalabutan nga dokumento.

Alang sa kasayon, ania kini .gitlab-ci.yml sa bug-os nga:

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

Kung nadugang na nimo ang tanan sa file, pag-klik Ipasalig ang mga pagbag-o. Aron makita nga husto ang tanan, adto sa CI / CD -> Pipelines -> pagdagan. Ang usa ka bintana sa virtual machine maablihan, sa katapusan nga kinahanglan adunay mga musunud:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Nakita Milampos si Job - kalampusan, ang tanan maayo. Karon mahimo nimong sulayan kung unsa ang imong nahimo.

Mga pananglitan sa trabaho

Alang sa usa ka pananglitan sa trabaho, maghimo kita usa ka yano nga proyekto (sa agalon) nga adunay daghang mga file. Pagkahuman niana, sa lain nga sanga usbon namon ang usa ra ka file ug sulayan nga maghimo usa ka hangyo sa paghiusa.

Atong tagdon ang duha ka mga kaso: kung ang giusab nga file adunay sulud ug kung wala. Una, usa ka pananglitan nga adunay sayup.

Ingnon ta nga adunay file sa master branch Program.cs, nga walay mga sayop, apan sa laing sanga ang developer midugang sa sayop nga code ug gusto sa paghimo sa usa ka merge request. Unsa nga matang sa sayop nga iyang nahimo dili kaayo importante, ang nag-unang butang mao nga kini anaa. Pananglitan, ang operator nakalimot paglabay (Oo, sayop kaayo):

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

Atong tan-awon ang resulta sa pag-analisar sa usa ka pananglitan nga adunay usa ka sayup. Aron masiguro usab nga usa ra ka file ang na-parse, gidugang nako ang bandila -r sa linya sa paglusad sa pvs-studio-dotnet:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Nakita namon nga ang analista nakit-an ang usa ka sayup ug wala gitugotan ang paghiusa sa mga sanga.

Atong susihon ang pananglitan nga walay sayup. Pagtul-id sa code:

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

Paghiusa sa mga resulta sa pagtuki sa hangyo:

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Sama sa among nakita, wala’y nakit-an nga mga sayup, ug malampuson ang pagpatuman sa buluhaton, nga mao ang gusto namon susihon.

konklusyon

Ang pagtangtang sa dili maayo nga code sa dili pa maghiusa sa mga sanga labi ka kombenyente ug makapahimuot. Busa kung mogamit ka ug CI/CD, sulayi pag-embed ang usa ka static analyzer aron masusi. Dugang pa, kini gihimo sa yano nga paagi.

Salamat sa imong pagtagad.

Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#
Kung gusto nimong ipaambit kini nga artikulo sa usa ka tigpaminaw nga nagsultig English, palihug gamita ang link sa paghubad: Nikolay Mironov. Pag-analisar sa mga hangyo sa paghiusa sa GitLab gamit ang PVS-Studio para sa C#.

Source: www.habr.com

Idugang sa usa ka comment