
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.
— 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. . 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.jsonAgar 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:

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:

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

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 .
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 .
Analizator ishlashi uchun litsenziya kaliti talab qilinadi. Sinov litsenziyasini quyidagi manzilda olishingiz mumkin .
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.

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.slnO'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 updatePVS-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-dotnetLitsenziyani 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.slnTo'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.

Ochilgan oynada elementni toping Argumentlar, o'ngdagi tugmani bosing kengaytirish va o'zgaruvchilarni qo'shing. Natija quyidagicha ko'rinishi kerak:

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; fiQaytish 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"".
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_requestsKeling, 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 originEndi biz filiallar orasidagi farqni olamiz va natijani saqlaymiz txt fayl:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txtQaerda $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; fiBirlashtirish 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_requestsBarcha 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.jsonQulaylik - 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. .
Aytgancha, agar siz .json hisobotlari bilan IDE-dan mahalliy darajada qulay ishlashni istasangiz, bizni taklif qilaman. IDE Rider uchun. Uning qo'llanilishi maqolada batafsil tavsiflangan .
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.jsonFaylga 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:

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, ):
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:

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:

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.
Agar siz ushbu maqolani ingliz tilida so'zlashuvchi auditoriya bilan baham ko'rmoqchi bo'lsangiz, tarjima havolasidan foydalaning: Nikolay Mironov. .
Manba: www.habr.com
