PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө
Биз PVS-Studio колдонууну ыңгайлуураак кылууну улантабыз. Биздин анализатор азыр Windows үчүн пакет менеджери Chocolateyде жеткиликтүү. Бул PVS-Studio, атап айтканда, булут кызматтарында жайылтууну жеңилдетет деп ишенебиз. Алыска барбоо үчүн ошол эле Шоколадинин баштапкы кодун текшерип көрөлү. Azure DevOps CI системасы катары иштейт.

Булут тутумдары менен интеграция темасындагы башка макалаларыбыздын тизмеси:

Мен сизге Azure DevOps менен интеграция жөнүндө биринчи макалага көңүл бурууну кеңеш кылам, анткени бул учурда кайталанбоо үчүн кээ бир пункттар алынып салынган.

Ошентип, бул макаланын каармандары:

PVS-Studio 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 астында анализаторду ыңгайлуу колдонуунун мисалын карап көрөлү.

тууралоо

Эсиңиздерге сала кетейин, эсепти каттоо, Build Pipeline түзүү жана GitHub репозиторийинде жайгашкан долбоор менен аккаунтуңузду синхрондоштуруу сыяктуу маселелер жөнүндө өзүнчө бөлүм бар. макала. Биздин орнотуу дароо конфигурация файлын жазуу менен башталат.

Биринчиден, биз өзгөртүүлөр үчүн гана ишке киргизебиз деп, ишке киргизүү триггерин орнотолу кожоюн филиалы:

trigger:
- master

Андан кийин биз виртуалдык машинаны тандап алышыбыз керек. Азырынча ал Windows Server 2019 жана Visual Studio 2019 менен Microsoft тарабынан уюштурулган агент болот:

pool:
  vmImage: 'windows-latest'

Конфигурация файлынын негизги бөлүгүнө өтөбүз (блок кадамдар). Сиз виртуалдык машинага каалаган программалык камсыздоону орното албасаңыз да, мен Docker контейнерин кошкон жокмун. Биз Chocolateyди Azure DevOps үчүн кеңейтүү катары кошо алабыз. Бул үчүн, келгиле, баралы байланыш. Click Аны акысыз алыңыз. Андан кийин, эгер сиз буга чейин уруксат алган болсоңуз, жөн гана каттоо эсебиңизди тандаңыз, эгер жок болсо, авторизациядан кийин ошол эле нерсени жасаңыз.

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Бул жерде сиз кеңейтүүнү кошо турган жерди тандап, баскычты басышыңыз керек орнотуу.

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Ийгиликтүү орнотуудан кийин чыкылдатыңыз Уюштурууга өтүңүз:

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Эми терезеден Chocolatey тапшырмасынын шаблонун көрө аласыз милдеттери конфигурация файлын түзөтүүдө azure-pipelines.yml:

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Chocolatey баскычын чыкылдатып, талаалардын тизмесин көрүңүз:

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Бул жерде биз тандоо керек орнотуу командалар менен талаада. IN Nuspec файл аты талап кылынган пакеттин атын көрсөтүңүз - pvs-studio. Эгер версияны көрсөтпөсөңүз, эң акыркысы орнотулат, ал бизге толугу менен туура келет. Келиңиз, баскычты басалы кошуу жана биз конфигурация файлында түзүлгөн тапшырманы көрөбүз.

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

Андан кийин, файлыбыздын негизги бөлүгүнө өтөбүз:

- task: CmdLine@2
  inputs:
    script: 

Эми биз анализатор лицензиясы менен файл түзүшүбүз керек. Мына PVSNAME и ПВСКЕЙ – жөндөөлөрдөн маанилерин көрсөткөн өзгөрмөлөрдүн аттары. Алар PVS-Studio логин жана лицензия ачкычын сакташат. Алардын баалуулуктарын коюу үчүн менюну ачыңыз Variables->Жаңы өзгөрмө. Өзгөрмөлөрдү түзөлү 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()

келгиле Save->Save->Run тапшырманы аткаруу үчүн. Келгиле, тапшырмалар өтмөгүнө өтүп, отчетту жүктөп алалы.

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Chocolatey долбоору C# кодунун 37615 сабын гана камтыйт. Келгиле, табылган каталардын айрымдарын карап көрөлү.

Тесттин жыйынтыгы

Эскертүү 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 "||' оператор. 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 колдонуучулары параметрди колдоно алышкан жок apikey дагы бир нече жолу. Жогорудагы параметрлерге окшош, мен төмөнкү параметрлерди сунуш кыла алам:

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

Көчүрүү жана чаптоо каталары чоң көлөмдөгү баштапкы коддор менен кандайдыр бир долбоордо эртеби-кечпи пайда болуу мүмкүнчүлүгүнө ээ жана алар менен күрөшүүнүн эң жакшы куралдарынын бири бул статикалык талдоо.

PS Жана адаттагыдай эле, бул ката көп саптык шарттын аягында пайда болот :). Жарыялоону көрүү "Акыркы сап эффекти".

Эскертүү N8

Анализатор эскертүүсү: V3095 [CWE-476] "installedPackage" объекти нөлгө каршы текшерилгенге чейин колдонулган. Текшерүү саптары: 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-ачкыч" ачкыч менен байланышкан ката жакты.

PVS-Studio азыр Chocolateyде: Azure DevOps астынан Chocolatey текшерилүүдө

Бул макаланы англис тилдүү аудитория менен бөлүшкүңүз келсе, котормо шилтемесин колдонуңуз: Владислав Столяров. PVS-Studio азыр шоколадда: Azure DevOps астында шоколадды текшерүү.

Source: www.habr.com

Комментарий кошуу