Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Ji GitLab hez dikin û ji xeletiyan nefret dikin? Dixwazin kalîteya koda çavkaniya xwe baştir bikin? Wê hingê hûn hatine cîhê rast. Îro em ê ji we re vebêjin ka meriv çawa analîzkera PVS-Studio C# mîheng dike da ku daxwazên hevgirtinê kontrol bike. Ji her kesî re dilxweşiyek unikorn û xwendina dilxweş be.

PVS Studio Amûrek ji bo naskirina xeletî û qelsiyên potansiyel ên di koda çavkaniyê ya bernameyên ku bi C, C++, C# û Java hatine nivîsandin de ye. Li ser pergalên 64-bit li ser Windows, Linux û macOS dixebite. Dikare koda ku ji bo platformên ARM-ê yên 32-bit, 64-bit û pêvekirî hatî çêkirin analîz bike.

Bi awayê, me PVS-Studio 7.08 derxist, ku tê de me gelek tişt kir balkêş. Bo nimûne:

  • Analyzer C# ji bo Linux û macOS;
  • pêveka ji bo Rider;
  • moda kontrolkirina lîsteya pelê ya nû.

Moda kontrolkirina lîsteya pelan

Berê, ji bo kontrolkirina hin pelan, pêdivî bû ku .xml bi navnîşek pelan re ji analîzer re derbas bibe. Lê ji ber ku ev ne pir hêsan e, me şiyana veguheztina .txt zêde kiriye, ku jiyanê pir hêsan dike.

Ji bo ku hûn pelên taybetî kontrol bikin, divê hûn ala diyar bikin --sourceFiles (-f) û .txt bi lîsteya pelan veguherînin. Ev wisa xuya dike:

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

Ger hûn bala we dikişînin ku hûn serlêdanên kontrolê an jî kişandinê saz bikin, hûn dikarin vê yekê jî bi karanîna vê modê bikin. Cûdahî dê di wergirtina navnîşek pelan de be ku hûn analîz bikin û dê bi kîjan pergalên ku hûn bikar tînin ve girêdayî be.

Prensîba kontrolkirina daxwazek hevgirtinê

Ya bingehîn a kontrolê ev e ku meriv pê ewle bibe ku pirsgirêkên ku di dema yekbûnê de ji hêla analîstê ve têne kifş kirin nekevin nav mamoste gûlî. Em jî naxwazin her carê tevahiya projeyê analîz bikin. Digel vê yekê, dema ku şaxên hev dikin, navnîşek pelên guhertî me hene. Ji ber vê yekê, ez pêşniyar dikim ku kontrolek daxwaza yekbûnê lê zêde bike.

Berî ku analîzkerek statîk bicîh bîne, daxwazek hevgirtinê bi vî rengî xuya dike:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Ango hemû xeletiyên ku di şaxê de bûn guhertin, dê derbasî şaxa masterê bibe. Ji ber ku em ê vê yekê naxwazin, em analîzê zêde dikin, û naha diagram wiha xuya dike:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Em analîz dikin guhertin2 û, heke xeletî tune bin, em daxwaza yekbûnê qebûl dikin, wekî din em wê red dikin.

Bi awayê, heke hûn bala we dikişînin ku li ser pêkanînan analîz bikin û daxwazên ji bo C/C++ bikişînin, wê hingê hûn dikarin li ser wê bixwînin. vir.

GitLab

GitLab amûrek çerxa jiyanê ya DevOps-a çavkaniya vekirî ye ku bi wiki-ya xwe, pergala şopandina pirsgirêkê, lûleya CI/CD û taybetmendiyên din ve pergalek rêveberiya depoya kodê ji bo Git peyda dike.

Berî ku hûn dest bi analîzkirina daxwazên hevgirtinê bikin, hûn hewce ne ku projeya xwe tomar bikin û bar bikin. Heke hûn nizanin ka meriv çawa vê yekê dike, wê hingê ez pêşniyar dikim gotar hevkarê min.

bingotin. Rêbaza sazkirina jîngehê ku li jêr hatî destnîşan kirin yek ji wan mimkun e. Armanc ev e ku gavên ji bo sazkirina hawîrdora ku ji bo analîzê û destpêkirina analîzkerê hewce ne nîşan bide. Dibe ku di doza we de çêtir be ku hûn qonaxên amadekirina jîngehê (zêdekirina depoyan, sazkirina analîzerek) û analîzê ji hev veqetînin: Mînakî, amadekirina wêneyên Docker bi hawîrdora pêwîst û karanîna wan, an rêbazek din.

Ji bo baştir fêm bikin ka dê çi bibe, ez pêşniyar dikim ku li diyagrama jêrîn binêrim:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Analîzker ji bo xebitandina .NET Core SDK 3 hewce dike, ji ber vê yekê berî ku analîzker saz bikin hûn hewce ne ku depoyên Microsoft-ê yên ku pêgirêdanên ku ji bo analîzkerê hewce ne werin saz kirin lê zêde bikin. Zêdekirina depoyên Microsoft-ê ji bo belavkirinên cihêreng ên Linux di belgeya peywendîdar de tête diyar kirin.

Ji bo ku PVS-Studio bi navgîniya rêveberê pakêtê saz bikin, hûn ê jî hewce bikin ku depoyên PVS-Studio zêde bikin. Zêdekirina depoyan ji bo belavkirinên cihêreng bi hûrgulî di nav de tête diyar kirin beşa têkildar a belgeyê.

Analîzker ji bo xebitandinê mifteyek lîsansê hewce dike. Hûn dikarin li ser destûrnameyek ceribandinê bistînin rûpel dakêşana analyser.

bingotin. Ji kerema xwe not bikin ku moda xebitandinê ya diyarkirî (analîzkirina daxwazên hevgirtinê) destûrnameyek Enterprise hewce dike. Ji ber vê yekê, heke hûn dixwazin vê awayê xebitandinê biceribînin, ji bîr nekin ku di qada "Peyam" de destnîşan bikin ku hûn hewceyê destûrnameyek Enterprise ne.

Ger daxwazek hevgirtinê çêbibe, wê hingê em tenê hewce ne ku navnîşa pelên guhertî analîz bikin, wekî din em hemî pelan analîz bikin. Piştî analîzê, pêdivî ye ku em têketin bi forma ku em hewce ne veguherînin.

Naha, ku algorîtmaya xebatê li ber çavên we hebe, hûn dikarin derbasî nivîsandina senaryoyekê bibin. Ji bo vê yekê, hûn hewce ne ku pelê biguherînin .gitlab-ci.yml an jî, heke tune be, wê biafirîne. Ji bo afirandina wê, divê hûn li ser navê projeya xwe bikirtînin -> CI/CD saz bikin.

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Niha em ji bo nivîsandina senaryoyê amade ne. Ka em pêşî koda ku dê analîzker saz bike binivîsin û destûrnameyê binivîsin:

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

Ji ber ku sazkirin û aktîvkirin divê berî hemî nivîsarên din pêk were, em etîketek taybetî bikar tînin before_script. Ez vê perçeyê hinekî rave bikim.

Amadekirina sazkirina analîzkerê:

  - 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

Zêdekirina depo û analîzerê 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

Çalakkirina Lîsansê:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Navê bikarhêner.

$PVS_KEY - mifteya hilberê.

Vegerandina girêdanên projeyê li ku derê $CI_PROJECT_DIR - riya tevahî ya pelrêça projeyê:

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

Ji bo analîza rast, pêdivî ye ku proje bi serfirazî were çêkirin, û girêdanên wê bêne vegerandin (mînakî, pêdivî ye ku pakêtên NuGet-ê yên pêwîst werin dakêşandin).

Hûn dikarin bi tikandina guhêrbarên jîngehê yên ku agahdariya lîsansê vedihewînin destnîşan bikin mîhengê, û piştî - ser CI/CD.

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Di pencereya ku vedibe de, babetekê bibînin guherbarên, bişkojka li aliyê rastê bitikîne Firehkirin û guherbaran lê zêde bike. Divê encam wiha xuya bike:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Niha hûn dikarin li ser analîzê biçin. Pêşîn, em ji bo analîzek bêkêmasî skrîptek lê zêde bikin. Li ala -t em rêya çareseriya alê derbas bikin -o riya pelê ku dê encamên analîzê tê de bêne nivîsandin binivîse. Em jî bi koda vegerê re eleqedar in. Di vê rewşê de, em eleqedar in ku operasyon bisekine dema ku koda vegerê agahdariya ku di dema analîzê de hişyarî hatine dayîn vedihewîne. Ev parçe dişibe vê:

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

Kodên vegerê li ser prensîba maskek piçûk dixebitin. Mînakî, heke di encama analîzê de hişyarî hatin dayîn, wê hingê koda vegerê dê bibe 8. Heke destûr di nav mehekê de biqede, wê hingê koda vegerê dê bibe 4. Heke di dema analîzê de xeletî hatin dîtin. û lîsans di nav mehekê de qediya, kod vedigere, dê her du nirx werin nivîsandin: jimareyan li hev zêde bikin û koda vegerê ya dawîn bistînin - 8+4=12. Bi vî rengî, bi kontrolkirina bitsên têkildar, di dema analîzê de agahdarî di derbarê rewşên cihêreng de têne wergirtin. Kodên vegerê di beşa "pvs-studio-dotnet (Linux / macOS) Kodên Vegerê" de bi hûrgulî têne vegotin.Projeyên Visual Studio / MSBuild / .NET Core ji rêzika fermanê bi karanîna PVS-Studio kontrol dikin".

Di vê rewşê de, em li hemî kodên vegerê yên ku 8 xuya dibin eleqedar in.

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

Dema ku koda vegerê bit hejmara ku em jê re eleqedar in hebe, em ê 1 bistînin, wekî din em ê 0 bistînin.

Wext e ku meriv analîza daxwaza hevgirtinê zêde bike. Berî ku em vî karî bikin, werin em cîhek ji bo senaryoyê amade bikin. Em hewce ne ku ew tenê gava ku daxwazek hevgirtinê çêbibe were darve kirin. Ev wisa xuya dike:

merge:
  script:
  only:
  - merge_requests

Ka em herin ser senaryoyê bixwe. Ez bi vê rastiyê re rû bi rû bûm ku makîneya virtual tiştek pê nizane eslê/master. Ji ber vê yekê em hinekî alîkariya wê bikin:

  - git fetch origin

Naha em cûdahiya di navbera şaxan de digirin û encamê tê de tomar dikin txt dosî:

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

Derê $CI_COMMIT_SHA - hash ji commit dawî.

Dûv re, em dest bi analîzkirina navnîşa pelan bi karanîna ala dikin -f. Em pela .txt ya ku berê hatî wergirtin veguhezînin wê. Welê, bi analogî digel analîza tevahî, em li kodên vegerê dinêrin:

  - 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

Skrîpta bêkêmasî ya ji bo kontrolkirina daxwazek hevgirtinê dê wiha xuya bike:

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

Tiştê ku dimîne ev e ku meriv veguheztina têketinê lê zêde bike piştî ku hemî nivîsar hatin pêvajo kirin. Em labelê bikar tînin after_script û bikêrhatî plog-converter:

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

Utility plog-converter projeyek çavkaniyek vekirî ye ku ji bo veguheztina raporên xeletiya parser di formên cihêreng, wek HTML, tê bikar anîn. Danasînek berfirehtir a kargêriyê di binbeşê de "Karkarê Veguherkera Plog" de tê dayîn. beşa têkildar a belgeyê.

Bi awayê, heke hûn dixwazin bi rehetî bi raporên .json ên herêmî yên ji IDE re bixebitin, wê hingê ez pêşniyar dikim girêdan ji bo IDE Rider. Bikaranîna wê bi berfirehî di nav de tête diyar kirin belgeya têkildar.

Ji bo rehetiyê, li vir e .gitlab-ci.yml bi tevahî:

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

Piştî ku we her tişt li pelê zêde kir, li ser bikirtînin Guhertinan pêk bînin. Ji bo ku hûn bibînin ku her tişt rast e, biçin CI / CD -> Pipeline -> bi bez. Dê pencereyek makîneya virtual vebe, ku di dawiya wê de divê jêrîn hebe:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
birrek Kar bi ser ket - Serkeftin, her tişt baş e. Niha hûn dikarin tiştên ku we kirine biceribînin.

Mînakên xebatê

Ji bo mînakek xebatê, werin em projeyek hêsan biafirînin (di mamoste) ku dê çend pelan tê de hebe. Piştî wê, di şaxek din de em ê tenê pelek biguhezînin û hewl bidin ku daxwaznameyek hevgirtinê bikin.

Ka em du rewşan binirxînin: gava pelê hatî guherandin xeletiyek heye û kengê na. Pêşîn, mînakek bi xeletiyek.

Em bibêjin di şaxa masterê de dosyayek heye Program.cs, ku xeletî tê de tune, lê di şaxek din de pêşdebir kodek xelet lê zêde kir û dixwaze daxwazek yekbûnê bike. Kîjan xeletiya wî kiriye ne ew çend girîng e, ya sereke ew e ku ew heye. Mînakî, operator ji bîr kir avêtin (Erê, ewqas xelet):

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

Ka em li encama analîzkirina mînakek bi xeletî binêrin. Di heman demê de ji bo ku ez piştrast bikim ku tenê pelek hate pars kirin, min al lê zêde kir -r ji bo xeta destpêkirina pvs-studio-dotnet:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Em dibînin ku analîzator xeletiyek dît û destûr neda yekbûna şaxan.

Ka em nimûneyê bêyî xeletî kontrol bikin. Rastkirina kodê:

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

Encamên analîza daxwaza yekgirtinê:

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Wekî ku em dibînin, tu xelet nehatin dîtin, û pêkanîna peywirê serketî bû, ya ku me dixwest em kontrol bikin ev e.

encamê

Berê hevgirtina şaxan, koda xirab derxistin pir rehet û xweş e. Ji ber vê yekê heke hûn CI/CD bikar tînin, biceribînin ku analîzerek statîk bixin da ku kontrol bikin. Digel vê yekê, ev bi hêsanî tê kirin.

Spas ji bo baldariya te.

Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#
Heke hûn dixwazin vê gotarê bi temaşevanên îngilîzîaxêv re parve bikin, ji kerema xwe lînka wergerê bikar bînin: Nikolay Mironov. Analîza daxwazên hevgirtinê li GitLab bi karanîna PVS-Studio ji bo C#.

Source: www.habr.com

Add a comment