Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Оё GitLab-ро дӯст медоред ва аз хатогиҳо нафрат доред? Мехоҳед сифати рамзи сарчашмаи худро беҳтар кунед? Пас шумо ба ҷои лозима омадед. Имрӯз мо ба шумо мегӯям, ки чӣ гуна таҳлилгари PVS-Studio C# -ро барои тафтиши дархостҳои якҷоякунӣ танзим кардан мумкин аст. Кайфияти ягона ва хониши хуш ба ҳама дошта бошед.

PVS-Студияи асбобест барои муайян кардани хатогиҳо ва осебпазириҳои эҳтимолӣ дар коди сарчашмаи барномаҳое, ки дар C, C++, C# ва Java навишта шудаанд. Дар системаҳои 64-бит дар Windows, Linux ва macOS кор мекунад. Рамзи барои платформаҳои 32-бит, 64-бит ва дарунсохташудаи ARM таҳияшударо таҳлил карда метавонад.

Дар омади гап, мо PVS-Studio 7.08-ро баровардем, ки дар он мо бисёр корҳоро анҷом додем. ҷолиб. Масалан:

  • C# анализатор барои Linux ва macOS;
  • плагин барои Rider;
  • ҳолати нави тафтиши рӯйхати файлҳо.

Ҳолати тафтиши рӯйхати файлҳо

Пештар, барои тафтиши баъзе файлҳо, ба анализатор интиқол додани .xml бо рӯйхати файлҳо лозим буд. Аммо азбаски ин хеле қулай нест, мо қобилияти интиқоли .txt-ро илова кардем, ки ҳаётро хеле содда мекунад.

Барои тафтиши файлҳои мушаххас, шумо бояд парчамро муайян кунед --sourceFiles (-f) ва интиқоли .txt бо рӯйхати файлҳо. Чунин ба назар мерасад:

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

Агар шумо ба танзими санҷиш ё гирифтани дархостҳо таваҷҷӯҳ дошта бошед, шумо инчунин метавонед онро бо истифода аз ин режим иҷро кунед. Фарқият дар гирифтани рӯйхати файлҳо барои таҳлил хоҳад буд ва аз кадом системаҳое, ки шумо истифода мебаред, вобаста хоҳад буд.

Принсипи тафтиши дархости якҷоякунӣ

Моҳияти асосии санҷиш аз он иборат аст, ки мушкилоте, ки анализатор ҳангоми якҷояшавӣ ошкор кардааст, ба усто филиал. Мо инчунин намехоҳем, ки ҳар дафъа тамоми лоиҳаро таҳлил кунем. Ғайр аз он, ҳангоми якҷоя кардани филиалҳо, мо рӯйхати файлҳои тағирёфта дорем. Аз ин рӯ, ман пешниҳод мекунам, ки санҷиши дархости якҷоякунӣ илова кунед.

Пеш аз татбиқи таҳлилгари статикӣ дархости якҷоякунӣ чунин аст:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Яъне хамаи хатохое, ки дар филиал буданд тағйиротҳо, ба филиали усто мегузарад. Азбаски мо инро намехоҳем, мо таҳлил илова мекунем ва ҳоло диаграмма чунин менамояд:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Мо таҳлил мекунем тағирот 2 ва агар ягон хатогӣ набошад, мо дархости якҷоякуниро қабул мекунем, вагарна онро рад мекунем.

Дар омади гап, агар шумо ба таҳлили ӯҳдадориҳо ва гирифтани дархостҳо барои C/C++ таваҷҷӯҳ дошта бошед, шумо метавонед дар ин бора хонед дар ин ҷо.

Гуглаб

Гуглаб як воситаи кушодаи DevOps дар асоси веби даврӣ мебошад, ки системаи идоракунии анбори кодҳоро барои Git бо викии худ, системаи пайгирии масъалаҳо, лӯлаи CI/CD ва дигар хусусиятҳо таъмин мекунад.

Пеш аз оғози таҳлили дархостҳои якҷоякунӣ, шумо бояд лоиҳаи худро сабти ном кунед ва бор кунед. Агар шумо намедонед, ки чӣ тавр ин корро кунед, ман тавсия медиҳам мақола хамкасби ман.

эрод гирифтан. Усули ташкили муҳити дар поён тавсифшуда яке аз усулҳои имконпазир аст. Ҳадаф нишон додани қадамҳои ташкили муҳити зарурӣ барои таҳлил ва ба кор андохтани анализатор мебошад. Эҳтимол дар ҳолати шумо ҷудо кардани марҳилаҳои омодасозии муҳити зист (илова кардани анборҳо, насб кардани анализатор) ва таҳлил беҳтартар мебуд: масалан, омода кардани тасвирҳои Docker бо муҳити зарурӣ ва истифодаи онҳо ё ягон усули дигар.

Барои беҳтар фаҳмидани он ки ҳоло чӣ рӯй медиҳад, ман тавсия медиҳам, ки ба диаграммаи зерин нигаред:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Анализатор барои кор кардан .NET Core SDK 3-ро талаб мекунад, бинобар ин пеш аз насб кардани анализатор шумо бояд анборҳои Microsoft-ро илова кунед, ки аз он вобастагӣ барои анализатор насб карда мешаванд. Илова кардани анборҳои Microsoft барои тақсимоти гуногуни Linux дар хуччати дахлдор баён карда шудааст.

Барои насб кардани PVS-Studio тавассути менеҷери бастаҳо, шумо инчунин бояд анборҳои PVS-Studio -ро илова кунед. Илова кардани анборҳо барои тақсимоти гуногун дар муфассалтар тасвир шудааст қисми дахлдори ҳуҷҷатҳо.

Анализатор барои фаъолият калиди литсензияро талаб мекунад. Шумо метавонед литсензияи озмоиширо дар сайт гиред Саҳифаи зеркашии анализатор.

эрод гирифтан. Лутфан таваҷҷӯҳ намоед, ки усули тавсифшудаи кор (таҳлили дархостҳои якҷоякунӣ) иҷозатномаи Enterprise-ро талаб мекунад. Аз ин рӯ, агар шумо хоҳед, ки ин тарзи корро санҷед, фаромӯш накунед, ки дар майдони "Паём" нишон диҳед, ки ба шумо иҷозатномаи Корхона лозим аст.

Агар дархости якҷоякунӣ рух диҳад, мо бояд танҳо рӯйхати файлҳои тағирёфтаро таҳлил кунем, вагарна мо ҳамаи файлҳоро таҳлил мекунем. Пас аз таҳлил, мо бояд гузоришҳоро ба формати лозима табдил диҳем.

Акнун, ки алгоритми кор дар пеши назари шумост, шумо метавонед ба навиштани скрипт гузаред. Барои ин, шумо бояд файлро тағир диҳед .gitlab-ci.yml ё, агар он вуҷуд надошта бошад, онро эҷод кунед. Барои сохтани он, шумо бояд номи лоиҳаи худро пахш кунед -> CI/CD-ро насб кунед.

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Ҳоло мо ба навиштани скрипт омодаем. Биёед аввал кодеро нависед, ки анализаторро насб мекунад ва иҷозатномаро ворид мекунад:

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

Азбаски насб ва фаъолсозӣ бояд пеш аз ҳама скриптҳои дигар сурат гирад, мо тамғаи махсусро истифода мебарем пеш_скрипт. Биёед ман ин порчаро каме шарҳ диҳам.

Омодагӣ ба насби анализатор:

  - 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 ва анализатор:

  - 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

$PVS_NAME - Номи корбар.

$PVS_KEY - калиди маҳсулот.

Барқарор кардани вобастагии лоиҳа дар куҷо $CI_PROJECT_DIR – роҳи пурра ба директорияи лоиҳа:

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

Барои таҳлили дуруст, лоиҳа бояд бомуваффақият сохта шавад ва вобастагии он барқарор карда шавад (масалан, бастаҳои зарурии NuGet бояд бор карда шаванд).

Шумо метавонед тағирёбандаҳои муҳити дорои маълумоти литсензияро тавассути клик танзим кунед Параметри, ва баъд аз он CI/CD.

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Дар равзанаи кушодашуда ашёро пайдо кунед Тағирдиҳандаҳо, тугмаи ростро пахш кунед Биёед ва тағирёбандаҳоро илова кунед. Натиҷа бояд чунин бошад:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Акнун шумо метавонед ба таҳлил гузаред. Аввалан, биёед скриптро барои таҳлили пурра илова кунем. Ба байрак -t мо рохи халли байракро мегузарем -o роҳи файлеро нависед, ки дар он натиҷаҳои таҳлил навишта мешаванд. Мо инчунин ба рамзи бозгашт манфиатдорем. Дар ин ҳолат, мо манфиатдорем, ки амалиёт қатъ карда шавад, вақте ки рамзи бозгашт маълумотро дар бар мегирад, ки ҳангоми таҳлил огоҳӣ дода шудааст. Ин порча чунин аст:

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

Рамзҳои бозгашт аз рӯи принсипи ниқоби каме кор мекунанд. Масалан, агар дар натиҷаи таҳлил огоҳиҳо дода шуда бошанд, пас рамзи бозгашт ба 8 баробар мешавад. Агар мӯҳлати иҷозатнома дар давоми як моҳ тамом шавад, рамзи баргардонидан ба 4 баробар мешавад. Агар ҳангоми таҳлил хатогиҳо ошкор карда шаванд, ва иҷозатнома дар давоми як моҳ ба охир мерасад, баргардонидани код, ҳарду арзишҳо навишта мешаванд: рақамҳоро якҷоя кунед ва рамзи бозгашти ниҳоиро гиред - 8+4=12. Ҳамин тариқ, тавассути санҷиши битҳои мувофиқ, маълумотро дар бораи ҳолати гуногун ҳангоми таҳлил ба даст овардан мумкин аст. Рамзҳои бозгашт ба таври муфассал дар бахши "Рамзҳои бозгашти pvs-studio-dotnet (Linux / macOS)" -и ҳуҷҷат тавсиф карда шудаанд.Санҷиши лоиҳаҳои Visual Studio / MSBuild / .NET Core аз сатри фармон бо истифода аз PVS-Studio".

Дар ин ҳолат, мо ба ҳамаи рамзҳои бозгашт, ки дар он 8 пайдо мешавад, манфиатдорем.

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

Мо 1-ро мегирем, вақте ки рамзи бозгашт бит рақами ба мо таваҷҷӯҳ дорад, дар акси ҳол мо 0 мегирем.

Вақти он расидааст, ки таҳлили дархости якҷояро илова кунед. Пеш аз он ки ин корро кунем, биёед барои скрипт ҷой омода кунем. Мо бояд онро танҳо вақте иҷро кунем, ки дархости якҷоякунӣ рух диҳад. Чунин ба назар мерасад:

merge:
  script:
  only:
  - merge_requests

Биёед ба худи скрипт гузарем. Ман бо он дучор шудам, ки мошини виртуалӣ дар бораи чизе намедонад пайдоиш / устод. Пас биёед ба ӯ каме кумак кунем:

  - git fetch origin

Акнун мо фарқияти байни шохаҳоро мегирем ва натиҷаро дар он захира мекунем txt файл:

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

Дар куҷо $CI_COMMIT_SHA – хэш аз ӯҳдадории охирин.

Баъдан, мо ба таҳлили рӯйхати файлҳо бо истифода аз парчам шурӯъ мекунем -f. Мо файли .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

Скрипти мукаммал барои тафтиши дархости якҷоякунӣ чунин хоҳад буд:

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

Танҳо пас аз коркарди ҳамаи скриптҳо, илова кардани табдили гузориш боқӣ мемонад. Мо тамғаро истифода мебарем after_script ва фоиданок табдилдиҳандаи plog:

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

Коммуналӣ табдилдиҳандаи plog лоиҳаи кушодаасос аст, ки барои табдил додани гузоришҳои хатогиҳои таҳлилгар ба шаклҳои гуногун, ба мисли HTML истифода мешавад. Тавсифи муфассали ин утилита дар зербахши "Plog Converter Utility" оварда шудааст. қисми дахлдори ҳуҷҷатҳо.

Дар омади гап, агар шумо хоҳед, ки бо гузоришҳои .json ба таври маҳаллӣ аз IDE кор кунед, ман тавсия медиҳам вироиш барои IDE Rider. Истифодаи он дар муфассалтар тавсиф шудааст ҳуҷҷати дахлдор.

Барои роҳат, ин ҷост .gitlab-ci.yml пурра:

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

Пас аз он ки шумо ҳама чизро ба файл илова кардед, клик кунед Тағйиротро ворид кунед. Барои дидани он ки ҳама чиз дуруст аст, равед CI / CD -> Масъулият -> якбора. Равзанаи мошини виртуалӣ кушода мешавад, ки дар охири он бояд инҳо бошанд:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
дид Кор муваффақ шуд - Муваффақият, ҳамааш хуб аст. Акнун шумо метавонед кореро, ки кардаед, санҷед.

Намунаҳои кор

Барои мисоли кор, биёед як лоиҳаи оддӣ эҷод кунем (дар усто) ки якчанд файлро дар бар мегирад. Пас аз он, дар филиали дигар мо танҳо як файлро тағир медиҳем ва кӯшиш мекунем, ки дархости якҷоякуниро пешниҳод кунем.

Биёед ду ҳолатро баррасӣ кунем: вақте ки файли тағирёфта хато дорад ва вақте ки хато надорад. Якум, як мисол бо хато.

Фарз мекунем, ки дар филиали усто файл мавҷуд аст Program.cs, ки хатогиҳоро дар бар намегирад, аммо дар филиали дигар таҳиякунанда рамзи хаторо илова кардааст ва мехоҳад дархости муттаҳидсозӣ кунад. Чӣ гуна хатое содир кардааст, чандон муҳим нест, чизи асосӣ он аст, ки он вуҷуд дорад. Масалан, оператор фаромуш кардааст партофтан (Бале, чунон хато):

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

Биёед ба натиҷаи таҳлили мисол бо хато назар кунем. Инчунин барои боварӣ ҳосил кардан, ки танҳо як файл таҳлил карда шудааст, ман парчамро илова кардам -r ба хати ифтитоҳи pvs-studio-dotnet:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Мо мебинем, ки анализатор хато пайдо кард ва ба якҷоя кардани шохаҳо иҷозат надод.

Биёед мисолро бе хато тафтиш кунем. Ислоҳи код:

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

Натиҷаҳои таҳлили дархости якҷоякунӣ:

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Тавре ки мо мебинем, ягон хатогие ёфт нашуд ва иҷрои вазифа бомуваффақият анҷом ёфт, ки мо мехостем тафтиш кунем.

хулоса

Тоза кардани рамзи бад пеш аз якҷоя кардани шохаҳо хеле қулай ва гуворо аст. Пас, агар шумо CI/CD-ро истифода баред, кӯшиш кунед, ки таҳлилгари статикиро барои тафтиш ворид кунед. Илова бар ин, ин хеле содда анҷом дода мешавад.

Ташаккур ба диққататон.

Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #
Агар шумо хоҳед, ки ин мақоларо бо шунавандагони англисзабон мубодила кунед, лутфан истиноди тарҷумаро истифода баред: Николай Миронов. Таҳлили дархостҳои якҷоякунӣ дар GitLab бо истифода аз PVS-Studio барои C #.

Манбаъ: will.com

Илова Эзоҳ