PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps
Мо минбаъд низ истифодаи PVS-Studio-ро қулайтар мегардонем. Анализатори мо ҳоло дар Chocolatey, мудири баста барои Windows дастрас аст. Мо боварӣ дорем, ки ин ба густариши PVS-Studio, аз ҷумла, дар хидматҳои абрӣ мусоидат мекунад. Барои он ки дур наравем, биёед рамзи сарчашмаи ҳамон Chocolatey-ро тафтиш кунем. Azure DevOps ҳамчун системаи CI амал хоҳад кард.

Ин аст рӯйхати мақолаҳои дигари мо дар мавзӯи ҳамгироӣ бо системаҳои абрӣ:

Ман ба шумо маслиҳат медиҳам, ки ба мақолаи аввал дар бораи ҳамгироӣ бо Azure DevOps диққат диҳед, зеро дар ин ҳолат баъзе нуктаҳо партофта мешаванд, то такрор нашаванд.

Ҳамин тавр, қаҳрамонони ин мақола:

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

Azure DevOps — маҷмӯи хидматҳои абрӣ, ки якҷоя тамоми раванди рушдро фаро мегиранд. Ин платформа асбобҳоеро дар бар мегирад, аз қабили Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, ки ба шумо имкон медиҳанд раванди эҷоди нармафзорро суръат бахшед ва сифати онро беҳтар созед.

Шоколад мудири бастаи кушодаасос барои Windows мебошад. Ҳадафи лоиҳа автоматикунонии тамоми давраи ҳаёти нармафзор аз насб то навсозӣ ва несткунӣ дар системаҳои оператсионии Windows мебошад.

Дар бораи истифодаи Chocolatey

Шумо метавонед дар ин ҷо бинед, ки чӣ гуна худи мудири бастаро насб кардан мумкин аст пайванд. Ҳуҷҷатҳои мукаммал барои насби анализатор дар ин ҷо дастрасанд пайванд Ба Насбкунӣ бо истифода аз бахши мудири бастаи Chocolatey нигаред. Ман аз он ҷо баъзе нуктаҳоро мухтасар такрор мекунам.

Фармони насб кардани версияи охирини анализатор:

choco install pvs-studio

Фармони насб кардани версияи мушаххаси бастаи PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Бо нобаёнӣ, танҳо ядрои анализатор, ҷузъи Core насб карда шудааст. Ҳама парчамҳои дигар (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) метавонанд бо истифода аз --package-parameters интиқол дода шаванд.

Намунаи фармоне, ки анализаторро бо плагин барои Visual Studio 2019 насб мекунад:

choco install pvs-studio --package-parameters="'/MSVS2019'"

Акнун биёед мисоли истифодаи қулайи анализаторро зери Azure DevOps дида бароем.

танзим

Хотиррасон мекунам, ки дар бораи чунин масъалаҳо як бахши алоҳида мавҷуд аст, ба монанди бақайдгирии ҳисоб, сохтани қубур ва ҳамоҳангсозии ҳисоби шумо бо лоиҳае, ки дар анбори GitHub ҷойгир аст. мақола. Танзимоти мо фавран бо навиштани файли конфигуратсия оғоз мешавад.

Аввалан, биёед триггери оғозёбиро насб кунем, ки нишон медиҳад, ки мо танҳо барои тағирот дар усто филиал:

trigger:
- master

Баъдан мо бояд мошини виртуалиро интихоб кунем. Дар айни замон он як агенти аз ҷониби Microsoft ҷойгиршуда бо Windows Server 2019 ва Visual Studio 2019 хоҳад буд:

pool:
  vmImage: 'windows-latest'

Биёед ба бадани файли конфигуратсия (block қадам). Сарфи назар аз он, ки шумо нармафзори ихтиёриро ба мошини виртуалӣ насб карда наметавонед, ман контейнери Docker илова накардаам. Мо метавонем Chocolateyро ҳамчун васеъ барои Azure DevOps илова кунем. Барои ин, биёед ба пайванд. клик кунед Бепул шавед. Баъдан, агар шумо аллакай ваколатдор бошед, танҳо ҳисоби худро интихоб кунед ва агар не, пас аз иҷозатдиҳӣ ҳамон корро кунед.

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Дар ин ҷо шумо бояд интихоб кунед, ки мо васеъкуниро дар куҷо илова мекунем ва тугмаро пахш мекунем Зеркашӣ кунед.

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Пас аз бомуваффақият насб кардан, клик кунед Ба ташкил гузаред:

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Шумо ҳоло метавонед қолаби вазифаи Chocolatey-ро дар равзана бинед вазифаҳо ҳангоми таҳрир кардани файли конфигуратсия azure-pipelines.yml:

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Chocolatey-ро клик кунед ва рӯйхати майдонҳоро бубинед:

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Дар ин ҷо мо бояд интихоб кунем насб кунед дар майдон бо дастахо. ДАР Номи файли Nuspec номи бастаи заруриро нишон диҳед - pvs-studio. Агар шумо версияро муайян накунед, версияи охирин насб карда мешавад, ки ба мо комилан мувофиқ аст. Биёед тугмаро пахш кунем илова кардан ва мо вазифаи тавлидшударо дар файли конфигуратсия мебинем.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

Баъд, биёед ба қисми асосии файли худ гузарем:

- task: CmdLine@2
  inputs:
    script: 

Ҳоло мо бояд файлеро бо иҷозатномаи анализатор эҷод кунем. Ин ҷо PVSNAME и ПВСКЕЙ - номҳои тағирёбандаҳое, ки мо арзишҳои онҳоро дар танзимот муайян мекунем. Онҳо воридшавӣ ва калиди литсензияи PVS-Studio -ро нигоҳ медоранд. Барои муқаррар кардани арзишҳои онҳо, менюро кушоед Тағйирёбанда->Тағйирёбандаи нав. Биёед тағирёбандаҳоро эҷод кунем PVSNAME барои ворид шудан ва ПВСКЕЙ барои калиди анализатор. Фаромӯш накунед, ки қуттиро тафтиш кунед Ин арзишро махфӣ нигоҳ доред барои ПВСКЕЙ. Рамзи фармон:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
–u $(PVSNAME) –n $(PVSKEY)

Биёед лоиҳаро бо истифода аз файли bat, ки дар анбор ҷойгир аст, созем:

сall build.bat

Биёед папкаеро созем, ки дар он файлҳо бо натиҷаҳои анализатор нигоҳ дошта мешаванд:

сall mkdir PVSTestResults

Биёед ба таҳлили лоиҳа шурӯъ кунем:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
–t .srcchocolatey.sln –o .PVSTestResultsChoco.plog 

Мо бо истифода аз утилитаи PlogСonverter гузориши худро ба формати html табдил медиҳем:

сall "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
–t html –o PVSTestResults .PVSTestResultsChoco.plog

Акнун шумо бояд вазифаеро эҷод кунед, то шумо метавонед гузоришро бор кунед.

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

Файли пурраи конфигуратсия чунин менамояд:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

- task: CmdLine@2
  inputs:
    script: |
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      credentials –u $(PVSNAME) –n $(PVSKEY)
      call build.bat
      call mkdir PVSTestResults
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      –t .srcchocolatey.sln –o .PVSTestResultsChoco.plog
      call "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
      –t html –o .PVSTestResults .PVSTestResultsChoco.plog

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

Биёед клик кунем Захира-> Захира-> Иҷро барои ичрои вазифа. Биёед бо гузаштан ба ҷадвали вазифаҳо гузоришро зеркашӣ кунем.

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Лоиҳаи Chocolatey танҳо 37615 сатри рамзи C#-ро дар бар мегирад. Биёед ба баъзе хатогиҳои ошкоршуда назар андозем.

Натиҷаҳои санҷиш

Огоҳӣ N1

Огоҳии таҳлилгар: V3005 Тағйирёбандаи "Провайдер" ба худ таъин карда мешавад. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

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

Огоҳӣ N2

Огоҳии таҳлилгар: V3093 [CWE-480] Оператори '&' ҳарду операндро арзёбӣ мекунад. Шояд ба ҷои он оператори '&&'-и кӯтоҳ истифода шавад. Platform.cs 64

public static PlatformType get_platform()
{
  switch (Environment.OSVersion.Platform)
  {
    case PlatformID.MacOSX:
    {
      ....
    }
    case PlatformID.Unix:
    if(file_system.directory_exists("/Applications")
      & file_system.directory_exists("/System")
      & file_system.directory_exists("/Users")
      & file_system.directory_exists("/Volumes"))
      {
        return PlatformType.Mac;
      }
        else
          return PlatformType.Linux;
    default:
      return PlatformType.Windows;
  }
}

Фарқияти оператор & аз оператор && аст, ки агар тарафи чапи ифода бошад бардурӯғ, он гоҳ тарафи рост ҳоло ҳам ҳисоб карда мешавад, ки дар ин ҳолат зангҳои усули нолозимро дар назар дорад system.directory_exists.

Дар порчаи баррасӣ, ин як камбудии хурд аст. Бале, ин ҳолатро бо иваз кардани оператори & бо оператори && оптимизатсия кардан мумкин аст, аммо аз нуқтаи назари амалӣ, ин ба ҳеҷ чиз таъсир намекунад. Аммо, дар ҳолатҳои дигар, иштибоҳ байни & ва && метавонад мушкилоти ҷиддиро ба бор орад, вақте ки тарафи рости ифода бо арзишҳои нодуруст/беэътибор кор карда мешавад. Масалан, дар ҷамъоварии хатоҳои мо, бо истифода аз ташхиси V3093 муайян карда шудааст, ин ҳолат вуҷуд дорад:

if ((k < nct) & (s[k] != 0.0))

Ҳатто агар индекс k нодуруст аст, он барои дастрасӣ ба элементи массив истифода мешавад. Дар натиҷа, истисно партофта мешавад IndexOutOfRangeException.

Огоҳӣ N3, N4

Огоҳии таҳлилгар: V3022 [CWE-571] Ифодаи 'shortPrompt' ҳамеша дуруст аст. InteractivePrompt.cs 101
Огоҳии таҳлилгар: V3022 [CWE-571] Ифодаи 'shortPrompt' ҳамеша дуруст аст. InteractivePrompt.cs 105

public static string 
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
  ....
  if (shortPrompt)
  {
    var choicePrompt = choice.is_equal_to(defaultChoice) //1
    ?
    shortPrompt //2
    ?
    "[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
    choice.Substring(1,choice.Length - 1))
    :
    "[{0}]".format_with(choice.ToUpperInvariant()) //0
    : 
    shortPrompt //4
    ? 
    "[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
    choice.Substring(1,choice.Length - 1)) 
    :
    choice; //0
    ....
  }
  ....
}

Дар ин маврид дар паси амалиёти оператори сегона мантиқи аҷибе ҳаст. Биёед бодиққат назар кунем: агар шарти бо рақами 1 қайдкардаам иҷро шавад, мо ба шарти 2 мегузарем, ки ҳамеша ҳақиқӣ, ки маънои сатри 3 иҷро мешавад.Агар шарти 1 бардурӯғ гардад, пас мо ба сатри бо рақами 4 ишорашуда меравем, ки шарт дар он низ ҳамеша аст. ҳақиқӣ, ки маънои сатри 5 иҷро хоҳад шуд. Ҳамин тавр, шартҳои бо шарҳи 0 нишондодашуда ҳеҷ гоҳ иҷро намешаванд, ки шояд мантиқи амалиёте, ки барномасоз интизор буд, набошад.

Огоҳӣ N5

Огоҳии таҳлилгар: V3123 [CWE-783] Шояд оператори '?:' ба тарзи дигар аз он ки интизор мерафт, кор мекунад. Афзалияти он аз афзалияти дигар операторҳо дар ҳолати худ пасттар аст. Options.cs 1019

private static string GetArgumentName (...., string description)
{
  string[] nameStart;
  if (maxIndex == 1)
  {
    nameStart = new string[]{"{0:", "{"};
  }
  else
  {
    nameStart = new string[]{"{" + index + ":"};
  }
  for (int i = 0; i < nameStart.Length; ++i) 
  {
    int start, j = 0;
    do 
    {
      start = description.IndexOf (nameStart [i], j);
    } 
    while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

Ташхис барои хат кор кард:

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

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

Огоҳӣ N6

Огоҳии таҳлилгар: V3022 [CWE-571] Ифодаи 'installedPackageVersions.Count != 1' ҳамеша дуруст аст. NugetService.cs 1405

private void remove_nuget_cache_for_package(....)
{
  if (!config.AllVersions && installedPackageVersions.Count > 1)
  {
    const string allVersionsChoice = "All versions";
    if (installedPackageVersions.Count != 1)
    {
      choices.Add(allVersionsChoice);
    }
    ....
  }
  ....
}

Дар ин ҷо як ҳолати аҷибе вуҷуд дорад: installPackageVersions.Count != 1ки хамеша хохад буд ҳақиқӣ. Аксар вақт чунин огоҳӣ хатогии мантиқии кодро нишон медиҳад ва дар дигар ҳолатҳо он танҳо тафтиши зиёдатиро нишон медиҳад.

Огоҳӣ N7

Огоҳии таҳлилгар: V3001 Зер ифодаҳои якхела 'commandArguments.contains("-apikey")' дар тарафи чап ва рости '||' мавҷуданд. оператор. ArgumentsUtility.cs 42

public static bool arguments_contain_sensitive_information(string
 commandArguments)
{
  return commandArguments.contains("-install-arguments-sensitive")
  || commandArguments.contains("-package-parameters-sensitive")
  || commandArguments.contains("apikey ")
  || commandArguments.contains("config ")
  || commandArguments.contains("push ")
  || commandArguments.contains("-p ")
  || commandArguments.contains("-p=")
  || commandArguments.contains("-password")
  || commandArguments.contains("-cp ")
  || commandArguments.contains("-cp=")
  || commandArguments.contains("-certpassword")
  || commandArguments.contains("-k ")
  || commandArguments.contains("-k=")
  || commandArguments.contains("-key ")
  || commandArguments.contains("-key=")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key");
}

Барномасозе, ки ин қисмати кодро навишт, ду сатри охиринро нусхабардорӣ ва часпондааст ва таҳрир кардани онҳоро фаромӯш кардааст. Аз ин сабаб, корбарони Chocolatey натавонистанд параметрро татбиқ кунанд апикей якчанд роҳи дигар. Монанди параметрҳои дар боло овардашуда, ман метавонам имконоти зеринро пешниҳод кунам:

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

Хатогиҳои нусхабардорӣ ва часбонед, шонси баланде доранд, ки дер ё зуд дар ҳама гуна лоиҳа бо миқдори зиёди рамзи сарчашма пайдо шаванд ва яке аз беҳтарин абзорҳои мубориза бо онҳо таҳлили статикӣ мебошад.

PS Ва чун ҳамеша, ин хато дар охири ҳолати бисёрсатрӣ пайдо мешавад :). Ба нашр нигаред "Таъсири сатри охирин".

Огоҳӣ N8

Огоҳии таҳлилгар: V3095 [CWE-476] Объекти 'installedPackage' пеш аз тасдиқи он дар муқобили null истифода шуда буд. Хатҳои тафтиш: 910, 917. NugetService.cs 910

public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
  ....
  var pinnedPackageResult = outdatedPackages.GetOrAdd(
    packageName, 
    new PackageResult(installedPackage, 
                      _fileSystem.combine_paths(
                        ApplicationParameters.PackagesLocation, 
                        installedPackage.Id)));
  ....
  if (   installedPackage != null
      && !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion) 
      && !config.UpgradeCommand.ExcludePrerelease)
  {
    ....
  }
  ....
}

Хатои классикӣ: аввал объект бастаи насбшуда истифода мешавад ва баъд санҷида мешавад ночиз. Ин ташхис ба мо дар бораи яке аз ду мушкилоти барнома нақл мекунад: ё бастаи насбшуда ҳеҷ гоҳ баробар нест ночиз, ки шубҳанок аст, ва он гоҳ чек зиёдатист, ё мо эҳтимолан дар код хатои ҷиддиро ба даст орем - кӯшиши дастрасӣ ба истинод ба нул.

хулоса

Ҳамин тавр, мо боз як қадами хурде гузоштем - ҳоло истифодаи PVS-Studio боз ҳам осонтар ва қулайтар шудааст. Ман инчунин мехоҳам бигӯям, ки Chocolatey як мудири бастаи хуби дорои шумораи ками хатогиҳо дар код аст, ки ҳангоми истифодаи PVS-Studio метавонад ҳатто камтар бошад.

Мо таклиф мекунем скачать ва PVS-Studio -ро санҷед. Истифодаи мунтазами анализатори статикӣ сифат ва эътимоднокии кодеро, ки дастаи шумо таҳия мекунад, беҳтар мекунад ва ба пешгирии бисёр чизҳо кӯмак мекунад осебпазирии рӯзи сифр.

PS

Пеш аз нашр, мо мақоларо ба таҳиягарони Chocolatey фиристодем ва онҳо онро хуб қабул карданд. Мо ягон чизи муҳимро наёфтем, аммо ба онҳо, масалан, хатогие, ки мо бо калиди "api-key" пайдо кардем, писанд омад.

PVS-Studio ҳоло дар Chocolatey аст: тафтиши Chocolatey аз зери Azure DevOps

Агар шумо хоҳед, ки ин мақоларо бо шунавандагони англисзабон мубодила кунед, лутфан истиноди тарҷумаро истифода баред: Владислав Столяров. PVS-Studio ҳоло дар Chocolatey аст: Санҷиши Chocolatey зери Azure DevOps.

Манбаъ: will.com

Илова Эзоҳ