C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
GitLab-ı sevir və səhvlərə nifrət edirsiniz? Mənbə kodunuzun keyfiyyətini artırmaq istəyirsiniz? Onda doğru yerə gəldiniz. Bu gün biz sizə birləşmə sorğularını yoxlamaq üçün PVS-Studio C# analizatorunu necə konfiqurasiya edəcəyinizi söyləyəcəyik. Hamıya salamlar və xoşbəxt oxu.

PVS Studio C, C++, C# və Java dillərində yazılmış proqramların mənbə kodunda səhvlərin və potensial zəifliklərin aşkarlanması üçün vasitədir. Windows, Linux və macOS-da 64-bit sistemlərdə işləyir. 32-bit, 64-bit və quraşdırılmış ARM platformaları üçün nəzərdə tutulmuş kodu təhlil edə bilər.

Yeri gəlmişkən, biz çox şeylər etdiyimiz PVS-Studio 7.08-i buraxdıq. maraqlı. Məsələn:

  • Linux və macOS üçün C# analizatoru;
  • Rider üçün plagin;
  • yeni fayl siyahısını yoxlama rejimi.

Fayl siyahısını yoxlama rejimi

Əvvəllər müəyyən faylları yoxlamaq üçün təhlilçiyə faylların siyahısı olan .xml faylını ötürmək lazım idi. Amma bu çox rahat olmadığı üçün biz həyatı xeyli asanlaşdıran .txt köçürmə qabiliyyətini əlavə etdik.

Müəyyən faylları yoxlamaq üçün bayrağı göstərməlisiniz --sourceFiles (-f) və faylların siyahısı ilə .txt faylını keçirin. Bu belə görünür:

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

Əgər öhdəliyin yoxlanılması və ya sorğuların çəkilməsi ilə maraqlanırsınızsa, bu rejimdən istifadə edərək bunu da edə bilərsiniz. Fərq təhlil üçün faylların siyahısını əldə etməkdə olacaq və hansı sistemlərdən istifadə etdiyinizdən asılı olacaq.

Birləşmə sorğusunun yoxlanılması prinsipi

Yoxlamanın əsas mahiyyəti analizator tərəfindən aşkar edilən problemlərin birləşməyə düşməməsini təmin etməkdir. ustad filialı. Həmçinin, biz hər dəfə bütün layihəni təhlil etmək istəmirik. Üstəlik, filialları birləşdirərkən, dəyişdirilmiş faylların siyahısı var. Buna görə də birləşmə sorğusu yoxlamasını əlavə etməyi təklif edirəm.

Statik analizatorun tətbiqindən əvvəl birləşmə sorğusu belə görünür:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Yəni filialda olan bütün səhvlər dəyişikliklər, master filialına keçəcək. Bunu istəmədiyimiz üçün analizi əlavə edirik və indi dövrə belə görünür:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Təhlil edirik dəyişikliklər2 və əgər heç bir səhv yoxdursa, birləşmə sorğusunu qəbul edirik, əks halda onu rədd edirik.

Yeri gəlmişkən, əgər siz C/C++ üçün öhdəlikləri təhlil etmək və sorğuları çəkməklə maraqlanırsınızsa, bu barədə oxuya bilərsiniz. burada.

GitLab

GitLab öz wiki, səhv izləmə sistemi, CI/CD boru xətti və digər xüsusiyyətləri ilə Git üçün kod anbarının idarəetmə sistemini təmin edən açıq mənbəli DevOps həyat dövrü veb alətidir.

Birləşmə sorğularının təhlilinin həyata keçirilməsinə davam etməzdən əvvəl layihənizi qeydiyyatdan keçirib yükləməlisiniz. Bunu necə edəcəyinizi bilmirsinizsə, o zaman təklif edirəm Məqalə həmkarım.

Qeyd. Aşağıda təsvir edilən mühitin qurulması yolu mümkün olanlardan biridir. Məqsəd analizatoru işə salmaq və təhlil etmək üçün lazım olan mühitin qurulması addımlarını göstərməkdir. Ola bilsin, sizin vəziyyətinizdə ətraf mühitin hazırlanması (repozitoriyaların əlavə edilməsi, analizatorun quraşdırılması) və təhlil mərhələlərini ayırmaq daha optimal olardı: məsələn, Docker şəkillərinin lazımi mühitlə hazırlanması və onlardan istifadə edilməsi və ya başqa üsul.

İndi nə olacağını daha yaxşı başa düşmək üçün aşağıdakı diaqrama nəzər salmağı təklif edirəm:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Analizatorun işləməsi üçün .NET Core SDK 3 tələb olunur, ona görə də analizatoru quraşdırmazdan əvvəl analizator üçün lazım olan asılılıqların quraşdırılacağı Microsoft repozitoriyalarını əlavə etməlisiniz. Müxtəlif Linux paylamaları üçün Microsoft depolarının əlavə edilməsi müvafiq sənəddə təsvir edilmişdir.

PVS-Studio-nu paket meneceri vasitəsilə quraşdırmaq üçün siz həmçinin PVS-Studio repozitoriyalarını əlavə etməlisiniz. Müxtəlif paylamalar üçün depoların əlavə edilməsi məqalədə daha ətraflı təsvir edilmişdir sənədlərin müvafiq bölməsi.

Analizatorun işləməsi üçün lisenziya açarı lazımdır. Siz sınaq lisenziyasını əldə edə bilərsiniz Analizator yükləmə səhifəsi.

Qeyd. Nəzərə alın ki, təsvir edilmiş iş rejimi (birləşmə sorğularının təhlili) Müəssisə lisenziyasını tələb edir. Buna görə də, bu iş rejimini sınamaq istəyirsinizsə, "Mesaj" sahəsində sizə Müəssisə lisenziyasına ehtiyacınız olduğunu qeyd etməyi unutmayın.

Birləşmə sorğusu baş verərsə, onda biz yalnız dəyişdirilmiş faylların siyahısını təhlil etməliyik, əks halda bütün faylları təhlil edirik. Təhlildən sonra logları lazım olan formata çevirməliyik.

İndi iş alqoritmi gözümüzün qabağında olmaqla, skript yazmağa davam edə bilərik. Bunu etmək üçün faylı dəyişdirməlisiniz .gitlab-ci.yml və ya mövcud deyilsə, onu yaradın. Onu yaratmaq üçün layihənizin adının üzərinə klikləməlisiniz -> CI/CD qurun.

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
İndi ssenarini yazmağa hazırıq. Əvvəlcə analizatoru quraşdıracaq kodu yazaq və lisenziyanı daxil edək:

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

Quraşdırma və aktivləşdirmə bütün digər skriptlərdən əvvəl baş verməli olduğundan, biz xüsusi etiketdən istifadə edirik əvvəl_skript. Bu hissəni bir az izah edim.

Analizatorun quraşdırılmasına hazırlıq:

  - 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 və analizator anbarlarının əlavə edilməsi:

  - 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

Lisenziya aktivləşdirilməsi:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - İstifadəçi adı.

$PVS_KEY - məhsul açarı.

Layihə asılılıqlarını harada bərpa edin $CI_PROJECT_DIR – layihə qovluğuna tam yol:

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

Düzgün təhlil üçün layihə uğurla qurulmalı və onun asılılıqları bərpa edilməlidir (məsələn, lazımi NuGet paketləri endirilməlidir).

Lisenziya məlumatlarını ehtiva edən mühit dəyişənlərini klikləməklə təyin edə bilərsiniz Quraşdırma, və sonra - davam CI/CD.

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Açılan pəncərədə elementi tapın Dəyişənlər, düyməni sağ vurun Genişləndirilməsi və dəyişənlər əlavə edin. Nəticə aşağıdakı kimi olmalıdır:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
İndi təhlilə keçə bilərik. Əvvəlcə tam təhlil üçün skript əlavə edək. Bayrağa -t bayrağa həll yolunu keçin -o analiz nəticələrinin yazılacağı faylın yolunu yazın. Bizi geri qaytarma kodu da maraqlandırır. Bu halda, geri qaytarma kodunda təhlil zamanı xəbərdarlıqların verildiyi barədə məlumat olduqda işi dayandırmaqda maraqlıyıq. Snippet necə görünür:

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

Qaytarma kodları bit maskası prinsipi ilə işləyir. Məsələn, təhlil nəticəsində xəbərdarlıq edilibsə, onda qaytarma kodu 8 olacaq. Əgər lisenziyanın müddəti bir ay ərzində başa çatarsa, onda qaytarma kodu 4 olacaq. Təhlil zamanı səhvlər aşkar edilərsə, lisenziya da bir ay ərzində başa çatır, kodun qaytarılmasında hər iki dəyər yazılacaq: nömrələri birlikdə əlavə edin və son qaytarma kodunu əldə edin - 8 + 4 = 12. Beləliklə, müvafiq bitləri yoxlamaqla, təhlil zamanı müxtəlif vəziyyətlər haqqında məlumat əldə etmək mümkündür. Qaytarma kodları sənədin pvs-studio-dotnet (Linux / macOS) Qaytarma Kodları bölməsində daha ətraflı təsvir edilmişdir.PVS-Studio istifadə edərək, komanda xəttindən Visual Studio / MSBuild / .NET Core layihələrinin yoxlanması".

Bu halda, biz 8-in göründüyü bütün qaytarma kodları ilə maraqlanırıq.

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

Qayıdış kodu bizi maraqlandıran nömrənin bitini ehtiva etdikdə 1 alacağıq, əks halda 0 alacağıq.

Birləşmə sorğusu təhlilini əlavə etməyin vaxtı gəldi. Bunu etməzdən əvvəl ssenari üçün yer hazırlayaq. Bizə yalnız birləşmə sorğusu baş verdikdə onu icra etməliyik. Bu belə görünür:

merge:
  script:
  only:
  - merge_requests

Gəlin ssenarinin özünə keçək. Virtual maşının heç bir şey bilməməsi faktı ilə qarşılaşdım mənşə/master. Gəlin ona bir az kömək edək:

  - git fetch origin

İndi budaqların fərqini alırıq və nəticəni saxlayırıq txt fayl:

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

Harada? $CI_COMMIT_SHA – son öhdəliyin hashı.

Sonra, bayraqdan istifadə edərək faylların siyahısının təhlilinə başlayırıq -f. Əvvəllər qəbul edilmiş .txt faylını ona köçürürük. Yaxşı, tam təhlilə bənzətməklə, geri qaytarma kodlarına baxırıq:

  - 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

Birləşmə sorğusunu yoxlamaq üçün tam skript belə görünəcək:

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

Bütün skriptlər işlədikdən sonra yalnız log çevrilməsini əlavə etmək qalır. Etiketdən istifadə etməklə sonra_skript və kommunal plog çevirici:

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

Kommunal plog çevirici təhlilçi səhv hesabatını HTML kimi müxtəlif formalara çevirmək üçün istifadə edilən açıq mənbə layihəsidir. Kommunalın daha ətraflı təsviri üçün "Plog Converter Utility" alt bölməsinə baxın. sənədlərin müvafiq bölməsi.

Yeri gəlmişkən, əgər siz IDE-dən yerli olaraq .json hesabatı ilə rahat işləmək istəyirsinizsə, onda mən təklif edirəm ki, bizim plugin IDE Rider üçün. Onun istifadəsi məqalədə daha ətraflı təsvir edilmişdir müvafiq sənəd.

Rahatlıq üçün burada .gitlab-ci.yml bütöv:

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

Hər şey fayla əlavə edildikdən sonra üzərinə klikləyin Dəyişiklikləri qəbul edin. Hər şeyin düzgün olub olmadığını görmək üçün bura keçin CI / CD -> Boru kəmərləri -> Running. Virtual maşın pəncərəsi açılacaq, sonunda aşağıdakılar olmalıdır:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
gördüm İş uğur qazandı - Uğur, hər şey yaxşıdır. İndi siz nə etdiyinizi sınaya bilərsiniz.

İş nümunələri

İş nümunəsi üçün sadə bir layihə yaradaq (in ustad) bir neçə fayldan ibarət olacaq. Bundan sonra başqa bir filialda yalnız bir faylı dəyişdirəcəyik və birləşmə sorğusu etməyə çalışacağıq.

Gəlin iki halı nəzərdən keçirək: dəyişdirilmiş faylda xəta olduqda və olmayanda. Birincisi, səhv olan bir nümunə.

Tutaq ki, master filialında bir fayl var Program.cs, səhvləri ehtiva etməyən və başqa bir filialda, tərtibatçı səhv kod əlavə etdi və birləşmə sorğusu etmək istəyir. Onun hansı səhvə yol verdiyi o qədər də önəmli deyil, əsas odur ki, var. Məsələn, operatoru unutmuşam atmaq (Bəli, belə səhv):

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

Səhvli bir nümunənin təhlilinin nəticəsinə baxaq. Həmçinin, yalnız bir faylın təhlil edildiyinə əmin olmaq üçün bayrağı əlavə etdim -r pvs-studio-dotnet başlanğıc xəttinə:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Analizatorun səhv tapdığını və filialların birləşməsinə icazə vermədiyini görürük.

Məsələni səhvsiz yoxlayaq. Kodun düzəldilməsi:

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

Birləşmə sorğusu təhlilinin nəticələri:

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Gördüyümüz kimi, heç bir səhv tapılmadı və tapşırığın icrası uğurlu oldu, yoxlamaq istədiyimiz budur.

Nəticə

Filialları birləşdirməzdən əvvəl pis kodu aradan qaldırmaq çox rahat və xoşdur. Buna görə də, əgər siz CI/CD istifadə edirsinizsə, onu yoxlamaq üçün statik analizatoru yerləşdirməyə çalışın. Üstəlik, bu olduqca sadə şəkildə edilir.

Diqqətinizə görə təşəkkür edirik.

C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili
Bu məqaləni ingilisdilli auditoriya ilə bölüşmək istəyirsinizsə, tərcümə linkindən istifadə edin: Nikolay Mironov. C# üçün PVS-Studio istifadə edərək GitLab-da birləşmə sorğularının təhlili.

Mənbə: www.habr.com

Добавить комментарий