PVS-Studio енді Chocolatey-де: Chocolatey-ді Azure DevOps астынан тексеру

PVS-Studio енді Chocolatey-де: Chocolatey-ді Azure DevOps астынан тексеру
Біз PVS-Studio пайдалануды ыңғайлы етуді жалғастырамыз. Біздің анализаторымыз енді Windows жүйесіне арналған пакет менеджері Chocolatey ішінде қол жетімді. Бұл PVS-Studio-ны, атап айтқанда, бұлттық қызметтерде орналастыруды жеңілдетеді деп ойлаймыз. Алысқа бармас үшін сол Шоколадының бастапқы кодын тексеріп көрейік. 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 сияқты құралдарды қамтиды.

Chocolatey Windows жүйесіне арналған ашық бастапқы пакет менеджері болып табылады. Жобаның мақсаты - Windows операциялық жүйелерінде орнатудан жаңартуға және жоюға дейінгі бағдарламалық жасақтаманың бүкіл өмірлік циклін автоматтандыру.

Шоколадты қолдану туралы

Пакет менеджерінің өзін орнату жолын осы жерден көре аласыз байланыс. Талдағышты орнатуға арналған толық құжаттама мына жерден қол жетімді байланыс 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 контейнерін қоспадым. Шоколадты 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 астынан тексеру

Мұнда біз таңдауымыз керек орнату командалармен далада. IN 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 жобасында 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 '||' сол және оң жағында бірдей '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 пайдаланушылары параметрді қолдана алмады 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)
  {
    ....
  }
  ....
}

Классикалық қате: алдымен объект орнатылған бума пайдаланылады, содан кейін тексеріледі NULL. Бұл диагностика бағдарламадағы екі мәселенің бірі туралы айтады: не орнатылған бума ешқашан тең емес NULL, бұл күмәнді, содан кейін тексеру артық немесе кодта елеулі қате алуымыз мүмкін - нөлдік сілтемеге қол жеткізу әрекеті.

қорытынды

Сонымен, біз тағы бір кішігірім қадам жасадық - енді PVS-Studio-ны пайдалану оңайырақ және ыңғайлы болды. Сондай-ақ, Chocolatey PVS-Studio пайдалану кезінде кодта аздаған қателер бар жақсы пакет менеджері екенін айтқым келеді.

Біз шақырамыз скачать және PVS-Studio қолданбасын қолданып көріңіз. Статикалық анализаторды үнемі пайдалану сіздің командаңыз әзірлейтін кодтың сапасы мен сенімділігін арттырады және көптеген қателердің алдын алуға көмектеседі. нөлдік күндік осалдықтар.

PS

Жарияланбас бұрын біз мақаланы Chocolatey әзірлеушілеріне жібердік, олар оны жақсы қабылдады. Біз маңызды ештеңе таппадық, бірақ олар, мысалы, «api-key» кілтіне қатысты біз тапқан қатені ұнатты.

PVS-Studio енді Chocolatey-де: Chocolatey-ді Azure DevOps астынан тексеру

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

Ақпарат көзі: www.habr.com

пікір қалдыру