C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
GitLab-ni yoqtirasizmi va xatolardan nafratlanasizmi? Manba kodingiz sifatini yaxshilashni xohlaysizmi? Keyin to'g'ri joyga keldingiz. Bugun biz birlashma so'rovlarini tekshirish uchun PVS-Studio C# analizatorini qanday sozlashni aytib beramiz. Bir shoxli kayfiyat va barchaga baxtli o'qish.

PVS-studiyasi — C, C++, C# va Java tillarida yozilgan dasturlarning manba kodidagi xatolar va potentsial zaifliklarni aniqlash vositasidir. U 64 bitli tizimlarda ishlaydi. Windows, Linux и macOSU 32-bitli, 64-bitli va o'rnatilgan ARM platformalariga yo'naltirilgan kodni tahlil qila oladi.

Aytgancha, biz PVS-Studio 7.08 ni chiqardik, unda biz juda ko'p narsalarni qildik. qiziq. Masalan:

  • C# analizatori ostida Linux и macOS;
  • Rider uchun plagin;
  • yangi fayllar ro'yxatini tekshirish rejimi.

Fayllar ro'yxatini tekshirish rejimi

Ilgari ma'lum fayllarni tekshirish uchun analizatorga fayllar ro'yxati bilan .xml ni o'tkazish kerak edi. Lekin bu juda qulay bo'lmagani uchun biz .txt ni uzatish imkoniyatini qo'shdik, bu esa hayotni juda oddiy qiladi.

Muayyan fayllarni tekshirish uchun siz bayroqni ko'rsatishingiz kerak --sourceFiles (-f) va fayllar ro'yxati bilan .txt faylini o'tkazing. Bu shunday ko'rinadi:

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

Agar siz majburiyatlarni tekshirish yoki tortib olish soʻrovlarini oʻrnatishga qiziqsangiz, buni ushbu rejim yordamida ham qilishingiz mumkin. Farqi tahlil qilinadigan fayllar ro'yxatini olishda bo'ladi va qaysi tizimlardan foydalanayotganingizga bog'liq bo'ladi.

Birlashtirish so'rovini tekshirish printsipi

Tekshiruvning asosiy mohiyati birlashish paytida analizator tomonidan aniqlangan muammolarga tushmasligini ta'minlashdir. usta filiali. Biz har safar butun loyihani tahlil qilishni xohlamaymiz. Bundan tashqari, filiallarni birlashtirganda, bizda o'zgartirilgan fayllar ro'yxati mavjud. Shuning uchun, men birlashtirish so'rovini tekshirishni qo'shishni taklif qilaman.

Statik analizatorni qo'llashdan oldin birlashma so'rovi shunday ko'rinadi:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Ya'ni, filialda bo'lgan barcha xatolar o'zgarishlar, asosiy filialga o'tadi. Biz buni xohlamaganimiz uchun tahlilni qo'shamiz va endi diagramma quyidagicha ko'rinadi:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Biz tahlil qilamiz o'zgarishlar 2 va agar xato bo'lmasa, biz birlashma so'rovini qabul qilamiz, aks holda uni rad etamiz.

Aytgancha, agar siz C/C++ uchun majburiyatlarni tahlil qilish va so'rovlarni jalb qilish bilan qiziqsangiz, bu haqda o'qishingiz mumkin. shu yerda.

GitLab

GitLab bu ochiq manbali veb-asoslangan DevOps hayot aylanishi vositasi bo'lib, u Git uchun o'zining wiki, muammolarni kuzatish tizimi, CI/CD quvur liniyasi va boshqa xususiyatlar bilan kodlar omborini boshqarish tizimini ta'minlaydi.

Birlashtirish so'rovlarini tahlil qilishni boshlashdan oldin, ro'yxatdan o'tishingiz va loyihangizni yuklashingiz kerak. Agar buni qanday qilishni bilmasangiz, men taklif qilaman maqola mening hamkasbim.

nota. Quyida tavsiflangan muhitni o'rnatish usuli mumkin bo'lganlardan biridir. Maqsad tahlil qilish va analizatorni ishga tushirish uchun zarur bo'lgan muhitni o'rnatish bosqichlarini ko'rsatishdir. Ehtimol, sizning holatingizda atrof-muhitni tayyorlash (omborlarni qo'shish, analizatorni o'rnatish) va tahlil qilish bosqichlarini ajratish maqbulroq bo'ladi: masalan, zarur muhit bilan Docker tasvirlarini tayyorlash va ulardan foydalanish yoki boshqa usul.

Endi nima bo'lishini yaxshiroq tushunish uchun men quyidagi diagrammaga qarashni taklif qilaman:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Analizator .NET Core SDK 3 ni talab qiladi, shuning uchun analizatorni o'rnatishdan oldin, analizatorning bog'liqliklari o'rnatiladigan Microsoft omborlarini qo'shishingiz kerak. Turli distributivlar uchun Microsoft omborlarini qo'shish Linux tegishli hujjatda tasvirlangan.

PVS-Studio-ni paket menejeri orqali o'rnatish uchun siz PVS-Studio omborlarini ham qo'shishingiz kerak bo'ladi. Turli xil tarqatishlar uchun omborlarni qo'shish batafsilroq tavsiflangan hujjatlarning tegishli bo'limi.

Analizator ishlashi uchun litsenziya kaliti talab qilinadi. Sinov litsenziyasini quyidagi manzilda olishingiz mumkin Analizator yuklab olish sahifasi.

nota. E'tibor bering, tavsiflangan ish rejimi (birlashma so'rovlarini tahlil qilish) Korxona litsenziyasini talab qiladi. Shuning uchun, agar siz ushbu ish rejimini sinab ko'rmoqchi bo'lsangiz, "Xabar" maydonida sizga Korxona litsenziyasi kerakligini ko'rsatishni unutmang.

Agar birlashtirish so'rovi yuzaga kelsa, biz faqat o'zgartirilgan fayllar ro'yxatini tahlil qilishimiz kerak, aks holda biz barcha fayllarni tahlil qilamiz. Tahlildan so'ng biz jurnallarni kerakli formatga aylantirishimiz kerak.

Endi siz ko'zingiz oldida ish algoritmiga ega bo'lib, siz skript yozishga o'tishingiz mumkin. Buning uchun siz faylni o'zgartirishingiz kerak .gitlab-ci.yml yoki, agar u mavjud bo'lmasa, uni yarating. Uni yaratish uchun siz loyihangiz nomini bosishingiz kerak -> CI/CD ni sozlang.

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Endi biz ssenariy yozishga tayyormiz. Avval analizatorni o'rnatadigan kodni yozamiz va litsenziyani kiritamiz:

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

O'rnatish va faollashtirish boshqa barcha skriptlardan oldin sodir bo'lishi kerakligi sababli, biz maxsus yorliqdan foydalanamiz oldin_skript. Keling, bu parchani biroz tushuntirib beraman.

Analizatorni o'rnatishga tayyorgarlik:

  - 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 omborlari va analizatorini qo'shish:

  - 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

Litsenziyani faollashtirish:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Foydalanuvchi nomi.

$PVS_KEY - mahsulot kaliti.

Loyihaga bog'liqlikni tiklash $CI_PROJECT_DIR - loyiha katalogiga to'liq yo'l:

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

To'g'ri tahlil qilish uchun loyiha muvaffaqiyatli tuzilishi va uning bog'liqliklari tiklanishi kerak (masalan, kerakli NuGet paketlarini yuklab olish kerak).

Litsenziya ma'lumotlarini o'z ichiga olgan muhit o'zgaruvchilarini bosish orqali o'rnatishingiz mumkin Setting, va keyin CI/CD.

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Ochilgan oynada elementni toping Argumentlar, o'ngdagi tugmani bosing kengaytirish va o'zgaruvchilarni qo'shing. Natija quyidagicha ko'rinishi kerak:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Endi siz tahlilga o'tishingiz mumkin. Birinchidan, to'liq tahlil qilish uchun skript qo'shamiz. Bayroqqa -t biz bayroqqa yechim yo'lini o'tkazamiz -o tahlil natijalari yoziladigan faylga yo'lni yozing. Bizni qaytarish kodi ham qiziqtiradi. Bunday holda, biz qaytish kodida tahlil paytida ogohlantirishlar berilganligi to'g'risida ma'lumot mavjud bo'lganda, operatsiya to'xtatilishidan manfaatdormiz. Bu fragment shunday ko'rinadi:

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

Qaytish kodlari bit niqobi printsipi asosida ishlaydi. Masalan, agar tahlil ogohlantirishlarga olib kelsa, qaytarish kodi 8 ga teng bo'ladi. Agar litsenziya bir oy ichida tugasa, qaytarish kodi 4 ga teng bo'ladi. Agar tahlil xatolarni aniqlasa va litsenziya bir oy ichida tugasa, qaytarish kodi ikkala qiymatni ham o'z ichiga oladi: oxirgi qaytarish kodini olish uchun raqamlarni qo'shing — 8 + 4 = 12. Shunday qilib, mos keladigan bitlarni tekshirish orqali siz tahlil paytida turli holatlar haqida ma'lumot olishingiz mumkin. Qaytish kodlari "pvs-studio-dotnet Qaytish Kodlari" bo'limida batafsilroq tavsiflangan.Linux / macOS)"hujjat"PVS-Studio yordamida buyruq satridan Visual Studio / MSBuild / .NET Core loyihalarini tekshirish".

Bunday holda, biz 8 paydo bo'lgan barcha qaytish kodlari bilan qiziqamiz.

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

Qaytish kodi bizni qiziqtirgan raqamning bitini o'z ichiga olganida biz 1 ni olamiz, aks holda biz 0 ni olamiz.

Birlashtirish so'rovi tahlilini qo'shish vaqti keldi. Buni qilishdan oldin, keling, ssenariy uchun joy tayyorlaylik. Biz uni faqat birlashtirish so'rovi paydo bo'lganda bajarishimiz kerak. Bu shunday ko'rinadi:

merge:
  script:
  only:
  - merge_requests

Keling, skriptning o'ziga o'taylik. Men virtual mashina haqida hech narsa bilmasligiga duch keldim kelib chiqishi/magistr. Keling, unga bir oz yordam beraylik:

  - git fetch origin

Endi biz filiallar orasidagi farqni olamiz va natijani saqlaymiz txt fayl:

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

Qaerda $CI_COMMIT_SHA - oxirgi majburiyatning xeshi.

Keyinchalik, bayroq yordamida fayllar ro'yxatini tahlil qilishni boshlaymiz -f. Oldindan olingan .txt faylini unga o'tkazamiz. To'liq tahlilga o'xshab, biz qaytish kodlarini ko'rib chiqamiz:

  - 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

Birlashtirish so'rovini tekshirish uchun to'liq skript quyidagicha ko'rinadi:

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

Barcha skriptlarni qayta ishlagandan so'ng, jurnal konvertatsiyasini qo'shish qoladi. Biz yorliqdan foydalanamiz after_script va foydali plog-konvertor:

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

Qulaylik plog-konvertor - bu ochiq kodli loyiha bo'lib, tahlilchi xato hisobotlarini HTML kabi turli shakllarga aylantirish uchun ishlatiladi. Yordamchi dasturning batafsil tavsifi "Plog Converter Utility" kichik bo'limida berilgan. hujjatlarning tegishli bo'limi.

Aytgancha, agar siz .json hisobotlari bilan IDE-dan mahalliy darajada qulay ishlashni istasangiz, bizni taklif qilaman. plagin IDE Rider uchun. Uning qo'llanilishi maqolada batafsil tavsiflangan tegishli hujjat.

Qulaylik uchun, bu erda .gitlab-ci.yml to `liq:

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

Faylga hamma narsani qo'shganingizdan so'ng, ustiga bosing O'zgarishlarni qabul qiling. Hammasi to'g'ri ekanligini ko'rish uchun o'ting CI / CD -> Quvurlar -> Running. Virtual mashina oynasi ochiladi, uning oxirida quyidagilar bo'lishi kerak:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
ko'rgan Ish muvaffaqiyatli bo'ldi - muvaffaqiyat, hammasi yaxshi. Endi siz nima qilganingizni sinab ko'rishingiz mumkin.

Ishga misollar

Ishga misol uchun oddiy loyiha yarataylik (in usta) bir nechta fayllarni o'z ichiga oladi. Shundan so'ng, boshqa filialda biz faqat bitta faylni o'zgartiramiz va birlashtirish so'rovini berishga harakat qilamiz.

Keling, ikkita holatni ko'rib chiqaylik: o'zgartirilgan faylda xatolik mavjud bo'lganda va u yo'q bo'lganda. Birinchidan, xato bilan misol.

Aytaylik, asosiy filialda fayl mavjud Program.cs, unda xatolar mavjud emas, lekin boshqa filialda ishlab chiquvchi noto'g'ri kod qo'shdi va birlashma so'rovini qilmoqchi. U qanday xatoga yo'l qo'ygani unchalik muhim emas, asosiysi uning mavjudligi. Masalan, operator unutdi otish (Ha, juda noto'g'ri):

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

Xatoli misolni tahlil qilish natijasini ko'rib chiqaylik. Bundan tashqari, faqat bitta fayl tahlil qilinganligiga ishonch hosil qilish uchun men bayroqni qo'shdim -r pvs-studio-dotnet ishga tushirish liniyasiga:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Biz analizator xato topib, filiallarni birlashtirishga ruxsat bermaganligini ko'ramiz.

Keling, misolni xatosiz tekshiramiz. Kodni tuzatish:

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

Birlashtirish so'rovini tahlil qilish natijalari:

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Ko'rib turganimizdek, hech qanday xato topilmadi va vazifa muvaffaqiyatli bajarildi, biz tekshirmoqchi bo'lgan narsamiz.

xulosa

Filiallarni birlashtirishdan oldin yomon kodni o'chirish juda qulay va yoqimli. Shunday qilib, agar siz CI/CD dan foydalanayotgan bo'lsangiz, tekshirish uchun statik analizatorni o'rnatib ko'ring. Bundan tashqari, bu juda oddiy tarzda amalga oshiriladi.

E'tiboringiz uchun rahmat.

C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish
Agar siz ushbu maqolani ingliz tilida so'zlashuvchi auditoriya bilan baham ko'rmoqchi bo'lsangiz, tarjima havolasidan foydalaning: Nikolay Mironov. C# uchun PVS-Studio yordamida GitLab-da birlashtirish so'rovlarini tahlil qilish.

Manba: www.habr.com

DDoS himoyasi, VPS VDS serverlari bo'lgan saytlar uchun ishonchli hosting sotib oling 🔥 DDoS himoyasi, VPS VDS serverlari bilan ishonchli veb-sayt xostingini sotib oling | ProHoster