Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Caru GitLab a chasineb bygiau? Eisiau gwella ansawdd eich cod ffynhonnell? Yna rydych chi wedi dod i'r lle iawn. Heddiw, byddwn yn dweud wrthych sut i ffurfweddu'r dadansoddwr PVS-Studio C# i wirio ceisiadau uno. Cael hwyliau unicorn a darllen hapus i bawb.

PVS-Stiwdio yn arf ar gyfer nodi gwallau a gwendidau posibl yn y cod ffynhonnell o raglenni a ysgrifennwyd yn C, C++, C# a Java. Yn gweithio ar systemau 64-bit ar Windows, Linux a macOS. Yn gallu dadansoddi cod a ddyluniwyd ar gyfer llwyfannau ARM 32-bit, 64-bit ac wedi'u mewnosod.

Gyda llaw, fe wnaethom ryddhau PVS-Studio 7.08, lle gwnaethom lawer o bethau diddorol. Er enghraifft:

  • Dadansoddwr C# ar gyfer Linux a macOS;
  • ategyn ar gyfer Rider;
  • modd gwirio rhestr ffeiliau newydd.

Modd gwirio rhestr ffeiliau

Yn flaenorol, er mwyn gwirio rhai ffeiliau, roedd angen pasio .xml gyda rhestr o ffeiliau i'r dadansoddwr. Ond gan nad yw hyn yn gyfleus iawn, rydym wedi ychwanegu'r gallu i drosglwyddo .txt, sy'n gwneud bywyd yn syml iawn.

Er mwyn gwirio ffeiliau penodol, rhaid i chi nodi'r faner --sourceFiles (-f) a throsglwyddo .txt gyda rhestr o ffeiliau. Mae'n edrych fel hyn:

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

Os oes gennych ddiddordeb mewn sefydlu ceisiadau gwirio ymrwymo neu dynnu, gallwch hefyd wneud hynny gan ddefnyddio'r modd hwn. Y gwahaniaeth fydd cael rhestr o ffeiliau i'w dadansoddi a bydd yn dibynnu ar ba systemau rydych chi'n eu defnyddio.

Yr egwyddor o wirio cais uno

Prif hanfod y gwiriad yw sicrhau nad yw problemau a ganfuwyd gan y dadansoddwr yn ystod uno yn disgyn i'r meistr cangen. Nid ydym ychwaith am ddadansoddi'r prosiect cyfan bob tro. Ar ben hynny, wrth uno canghennau, mae gennym restr o ffeiliau wedi'u newid. Felly, rwy'n awgrymu ychwanegu gwiriad cais uno.

Dyma sut olwg sydd ar gais uno cyn gweithredu dadansoddwr statig:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Hynny yw, yr holl wallau oedd yn y gangen newidiadau, yn symud i'r brif gangen. Gan na fyddem eisiau hyn, rydym yn ychwanegu dadansoddiad, ac yn awr mae'r diagram yn edrych fel hyn:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Dadansoddi newidiadau2 ac, os nad oes unrhyw wallau, rydym yn derbyn y cais uno, fel arall rydym yn ei wrthod.

Gyda llaw, os oes gennych ddiddordeb mewn dadansoddi ceisiadau ymrwymo a thynnu am C / C ++, yna gallwch ddarllen amdano yma.

GitLab

GitLab yn offeryn cylch bywyd DevOps ffynhonnell agored ar y we sy'n darparu system rheoli ystorfa cod ar gyfer Git gyda'i wiki ei hun, system olrhain materion, piblinell CI/CD a nodweddion eraill.

Cyn i chi ddechrau dadansoddi ceisiadau uno, mae angen i chi gofrestru a llwytho eich prosiect i fyny. Os nad ydych chi'n gwybod sut i wneud hyn, yna rwy'n awgrymu erthygl fy nghydweithiwr.

Nodyn. Mae'r dull o sefydlu'r amgylchedd a ddisgrifir isod yn un o'r rhai posibl. Y nod yw dangos y camau ar gyfer sefydlu'r amgylchedd angenrheidiol ar gyfer dadansoddi a lansio'r dadansoddwr. Efallai yn eich achos chi y byddai'n fwy optimaidd gwahanu'r camau o baratoi'r amgylchedd (ychwanegu storfeydd, gosod dadansoddwr) a dadansoddiad: er enghraifft, paratoi delweddau Docker gyda'r amgylchedd angenrheidiol a'u defnyddio, neu ryw ddull arall.

Er mwyn deall yn well beth fydd yn digwydd nawr, rwy'n awgrymu edrych ar y diagram canlynol:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Mae angen .NET Core SDK 3 ar y dadansoddwr i weithredu, felly cyn gosod y dadansoddwr mae angen ichi ychwanegu'r ystorfeydd Microsoft y bydd y dibyniaethau sy'n ofynnol ar gyfer y dadansoddwr yn cael eu gosod ohonynt. Ychwanegu ystorfeydd Microsoft ar gyfer gwahanol ddosbarthiadau Linux a ddisgrifir yn y ddogfen gyfatebol.

I osod PVS-Studio trwy'r rheolwr pecyn, bydd angen i chi hefyd ychwanegu'r ystorfeydd PVS-Studio. Disgrifir ychwanegu storfeydd ar gyfer gwahanol ddosbarthiadau yn fanylach yn adran berthnasol o'r ddogfennaeth.

Mae angen allwedd trwydded ar y dadansoddwr i weithredu. Gallwch gael trwydded prawf yn tudalen lawrlwytho dadansoddwr.

Nodyn. Sylwch fod angen trwydded Menter ar gyfer y dull gweithredu a ddisgrifir (dadansoddiad o geisiadau uno). Felly, os ydych chi am roi cynnig ar y dull gweithredu hwn, peidiwch ag anghofio nodi yn y maes β€œNeges” bod angen trwydded Menter arnoch.

Os bydd cais uno yn digwydd, yna dim ond y rhestr o ffeiliau sydd wedi'u newid y mae angen i ni eu dadansoddi, fel arall byddwn yn dadansoddi pob ffeil. Ar Γ΄l dadansoddi, mae angen inni drosi'r logiau i'r fformat sydd ei angen arnom.

Nawr, gyda'r algorithm gwaith o flaen eich llygaid, gallwch symud ymlaen i ysgrifennu sgript. I wneud hyn, mae angen i chi newid y ffeil .gitlab-ci.yml neu, os nad yw'n bodoli, ei greu. Er mwyn ei greu, mae angen i chi glicio ar enw eich prosiect -> Sefydlu CI/CD.

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Nawr rydyn ni'n barod i ysgrifennu'r sgript. Yn gyntaf, gadewch i ni ysgrifennu'r cod a fydd yn gosod y dadansoddwr ac yn nodi'r drwydded:

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

Gan fod yn rhaid gosod ac actifadu cyn pob sgript arall, rydym yn defnyddio label arbennig cyn_script. Gadewch imi egluro'r darn hwn ychydig.

Paratoi i osod y dadansoddwr:

  - 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

Ychwanegu ystorfeydd a dadansoddwr 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

Gweithrediad trwydded:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Enw defnyddiwr.

$PVS_KEY - allwedd cynnyrch.

Adennill dibyniaethau prosiect lle $CI_PROJECT_DIR – llwybr llawn i gyfeiriadur y prosiect:

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

Ar gyfer dadansoddiad cywir, rhaid adeiladu'r prosiect yn llwyddiannus, a rhaid adfer ei ddibyniaethau (er enghraifft, rhaid lawrlwytho'r pecynnau NuGet angenrheidiol).

Gallwch osod newidynnau amgylchedd sy'n cynnwys gwybodaeth trwydded trwy glicio Gosod, ac ar Γ΄l - ymlaen CI/CD.

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Yn y ffenestr sy'n agor, dewch o hyd i'r eitem Newidynnau, cliciwch ar y botwm ar y dde Expand ac ychwanegu newidynnau. Dylai'r canlyniad edrych fel hyn:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Nawr gallwch chi symud ymlaen i ddadansoddi. Yn gyntaf, gadewch i ni ychwanegu sgript ar gyfer dadansoddiad cyflawn. I'r faner -t rydym yn pasio'r llwybr i'r ateb i'r faner -o ysgrifennu'r llwybr i'r ffeil lle bydd canlyniadau'r dadansoddiad yn cael eu hysgrifennu. Mae gennym ddiddordeb hefyd yn y cod dychwelyd. Yn yr achos hwn, mae gennym ddiddordeb yn y llawdriniaeth yn dod i ben pan fydd y cod dychwelyd yn cynnwys gwybodaeth y cyhoeddwyd rhybuddion yn ystod y dadansoddiad. Dyma sut olwg sydd ar y darn hwn:

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

Mae codau dychwelyd yn gweithio ar yr egwyddor o fwgwd did. Er enghraifft, os cyhoeddwyd rhybuddion o ganlyniad i'r dadansoddiad, yna bydd y cod dychwelyd yn hafal i 8. Os bydd y drwydded yn dod i ben o fewn mis, yna bydd y cod dychwelyd yn hafal i 4. Os canfuwyd gwallau yn ystod y dadansoddiad, ac mae'r drwydded yn dod i ben o fewn mis, dychweliad y cod, bydd y ddau werth yn cael eu hysgrifennu: ychwanegwch y rhifau at ei gilydd a chael y cod dychwelyd terfynol - 8+4=12. Felly, trwy wirio'r darnau cyfatebol, gellir cael gwybodaeth am wahanol daleithiau yn ystod y dadansoddiad. Disgrifir codau dychwelyd yn fanylach yn yr adran " Codau Dychwelyd pvs-studio-dotnet (Linux / macOS)" o'r ddogfen "Gwirio prosiectau Visual Studio / MBuild / .NET Craidd o'r llinell orchymyn gan ddefnyddio PVS-Studio".

Yn yr achos hwn, mae gennym ddiddordeb ym mhob cod dychwelyd lle mae 8 yn ymddangos.

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

Byddwn yn derbyn 1 pan fydd y cod dychwelyd yn cynnwys y rhan o'r rhif y mae gennym ddiddordeb ynddo, fel arall byddwn yn derbyn 0.

Mae'n bryd ychwanegu dadansoddiad cais uno. Cyn i ni wneud hyn, gadewch i ni baratoi lle ar gyfer y sgript. Mae angen inni ei weithredu dim ond pan fydd cais uno yn digwydd. Mae'n edrych fel hyn:

merge:
  script:
  only:
  - merge_requests

Gadewch i ni symud ymlaen at y sgript ei hun. Roeddwn yn wynebu'r ffaith nad yw'r peiriant rhithwir yn gwybod dim amdano tarddiad / meistr. Felly gadewch i ni ei helpu ychydig:

  - git fetch origin

Nawr rydyn ni'n cael y gwahaniaeth rhwng y canghennau ac yn arbed y canlyniad i mewn txt ffeil:

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

Lle $CI_COMMIT_SHA - hash o'r ymrwymiad diwethaf.

Nesaf, rydym yn dechrau dadansoddi'r rhestr o ffeiliau gan ddefnyddio'r faner -f. Rydym yn trosglwyddo'r ffeil .txt a dderbyniwyd yn flaenorol iddo. Wel, trwy gyfatebiaeth Γ’'r dadansoddiad llawn, edrychwn ar y codau dychwelyd:

  - 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

Bydd y sgript gyflawn ar gyfer gwirio cais uno yn edrych fel hyn:

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

Y cyfan sydd ar Γ΄l yw ychwanegu trosi log ar Γ΄l i'r holl sgriptiau gael eu prosesu. Rydyn ni'n defnyddio'r label ar Γ΄l_script a defnyddioldeb trawsnewidydd plog:

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

Cyfleustodau trawsnewidydd plog yn brosiect ffynhonnell agored a ddefnyddir i drosi adroddiadau gwallau parser yn ffurfiau amrywiol, megis HTML. Rhoddir disgrifiad manylach o'r cyfleustodau yn yr isadran "Plog Converter Utility" adran berthnasol o'r ddogfennaeth.

Gyda llaw, os ydych chi eisiau gweithio'n gyfleus gydag adroddiadau .json yn lleol o'r DRhA, yna rwy'n awgrymu ein ategyn ar gyfer IDE Rider. Disgrifir ei ddefnydd yn fanylach yn ddogfen berthnasol.

Er hwylustod, dyma hi .gitlab-ci.yml yn llawn:

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

Unwaith y byddwch wedi ychwanegu popeth at y ffeil, cliciwch ar Ymrwymo newidiadau. Er mwyn gweld bod popeth yn gywir, ewch i CI / CD -> Piblinellau -> rhedeg. Bydd ffenestr peiriant rhithwir yn agor, a dylai fod y canlynol ar ei diwedd:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Gwelodd Llwyddodd Job - llwyddiant, popeth yn iawn. Nawr gallwch chi brofi'r hyn rydych chi wedi'i wneud.

Enghreifftiau o waith

Am enghraifft o waith, gadewch i ni greu prosiect syml (yn meistr) a fydd yn cynnwys sawl ffeil. Ar Γ΄l hynny, mewn cangen arall byddwn yn newid un ffeil yn unig ac yn ceisio gwneud cais uno.

Gadewch i ni ystyried dau achos: pan fydd y ffeil wedi'i haddasu yn cynnwys gwall a phan nad yw. Yn gyntaf, enghraifft gyda gwall.

Gadewch i ni ddweud bod ffeil yn y brif gangen Rhaglen.cs, nad yw'n cynnwys gwallau, ond mewn cangen arall ychwanegodd y datblygwr god gwallus ac mae am wneud cais uno. Pa fath o gamgymeriad a wnaeth nad yw mor bwysig, y prif beth yw ei fod yn bodoli. Er enghraifft, anghofiodd y gweithredwr taflu (Ie, mor anghywir):

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

Gadewch i ni edrych ar ganlyniad dadansoddi enghraifft gyda gwall. Hefyd i wneud yn siΕ΅r mai dim ond un ffeil oedd wedi'i dosrannu, ychwanegais y faner -r i linell lansio pvs-studio-dotnet:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Gwelwn fod y dadansoddwr wedi canfod gwall ac nad oedd yn caniatΓ‘u uno canghennau.

Gadewch i ni wirio'r enghraifft heb wall. Cywiro'r cod:

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

Canlyniadau dadansoddiad cais uno:

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Fel y gallwn weld, ni chanfuwyd unrhyw wallau, ac roedd cyflawni'r dasg yn llwyddiannus, sef yr hyn yr oeddem am ei wirio.

Casgliad

Mae chwynnu cod drwg cyn uno canghennau yn gyfleus a dymunol iawn. Felly os ydych chi'n defnyddio CI/CD, ceisiwch fewnosod dadansoddwr statig i wirio. Ar ben hynny, gwneir hyn yn eithaf syml.

Diolch i chi am eich sylw.

Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#
Os ydych chi am rannu'r erthygl hon Γ’ chynulleidfa Saesneg ei hiaith, defnyddiwch y ddolen gyfieithu: Nikolay Mironov. Dadansoddiad o geisiadau uno yn GitLab gan ddefnyddio PVS-Studio ar gyfer C#.

Ffynhonnell: hab.com

Ychwanegu sylw