PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps
Kita terus nggawe nggunakake PVS-Studio luwih trep. Analisa kita saiki kasedhiya ing Chocolatey, manajer paket kanggo Windows. Kita yakin manawa iki bakal nggampangake panyebaran PVS-Studio, utamane ing layanan awan. Supaya ora adoh, ayo mriksa kode sumber saka Chocolatey padha. Azure DevOps bakal tumindak minangka sistem CI.

Mangkene dhaptar artikel liyane babagan topik integrasi karo sistem awan:

Aku menehi saran supaya sampeyan menehi perhatian marang artikel pisanan babagan integrasi karo Azure DevOps, amarga ing kasus iki sawetara poin diilangi supaya ora diduplikasi.

Dadi, pahlawan artikel iki:

PVS Studio minangka alat analisis kode statis sing dirancang kanggo ngenali kesalahan lan kerentanan potensial ing program sing ditulis ing C, C ++, C # lan Jawa. Nganggo sistem Windows, Linux, lan macOS 64-bit, lan bisa nganalisa kode sing dirancang kanggo platform ARM 32-bit, 64-bit, lan embedded. Yen iki pisanan sampeyan nyoba analisis kode statis kanggo mriksa proyek sampeyan, disaranake sampeyan ngerti artikel babagan carane cepet ndeleng bebaya PVS-Studio sing paling menarik lan ngevaluasi kemampuan alat iki.

DevOps Azure — sakumpulan layanan awan sing nutupi kabeh proses pangembangan. Platform iki kalebu alat kayata Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, sing ngidini sampeyan nyepetake proses nggawe piranti lunak lan ningkatake kualitase.

Chocolatey minangka manajer paket open source kanggo Windows. Tujuan proyek kasebut yaiku ngotomatisasi kabeh siklus urip piranti lunak saka instalasi nganti nganyari lan instal ing sistem operasi Windows.

Babagan nggunakake Chocolatey

Sampeyan bisa ndeleng carane nginstal manager paket dhewe ing iki link. Dokumentasi lengkap kanggo nginstal analyzer kasedhiya ing link Waca Instalasi nggunakake bagean manajer paket Chocolatey. Aku sedhela bakal mbaleni sawetara titik saka ing kono.

Printah kanggo nginstal versi paling anyar saka analyzer:

choco install pvs-studio

Printah kanggo nginstal versi tartamtu saka paket PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Kanthi gawan, mung inti saka analyzer, komponen inti, diinstal. Kabeh gendera liyane (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) bisa dilewati nggunakake --paket-parameter.

Conto printah sing bakal nginstal analyzer karo plugin kanggo Visual Studio 2019:

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

Saiki ayo goleki conto panggunaan analisa sing trep ing Azure DevOps.

imbuhan

Ayo kula ngelingake sampeyan ana bagean sing kapisah babagan masalah kayata ndhaptar akun, nggawe Pipeline Build lan nyinkronake akun sampeyan karo proyek sing ana ing repositori GitHub. artikel. Persiyapan kita bakal langsung diwiwiti kanthi nulis file konfigurasi.

Pisanan, ayo nyiyapake pemicu peluncuran, sing nuduhake yen kita miwiti mung kanggo owah-owahan Master cabang:

trigger:
- master

Sabanjure, kita kudu milih mesin virtual. Saiki bakal dadi agen sing di-host Microsoft karo Windows Server 2019 lan Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Ayo pindhah menyang awak file konfigurasi (block langkah). Sanajan kasunyatane sampeyan ora bisa nginstal piranti lunak sembarangan menyang mesin virtual, aku ora nambah wadhah Docker. Kita bisa nambah Chocolatey minangka extension kanggo Azure DevOps. Kanggo nindakake iki, ayo pindhah menyang link. Klik Entuk gratis. Sabanjure, yen sampeyan wis sah, cukup pilih akun sampeyan, lan yen ora, banjur tindakake padha sawise wewenang.

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Kene sampeyan kudu milih ngendi kita bakal nambah extension lan klik tombol nginstal.

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Sawise instalasi sukses, klik Nerusake menyang organisasi:

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Sampeyan saiki bisa ndeleng cithakan kanggo tugas Chocolatey ing jendhela tugas nalika nyunting file konfigurasi azure-pipelines.yml:

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Klik ing Chocolatey lan deleng dhaptar kolom:

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Ing kene kita kudu milih masang ing lapangan karo tim. ING Jeneng File Nuspec nuduhake jeneng paket sing dibutuhake - pvs-studio. Yen sampeyan ora nemtokake versi, sing paling anyar bakal diinstal, sing cocog karo kita. Ayo pencet tombol nambah lan kita bakal weruh tugas kui ing file konfigurasi.

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

Sabanjure, ayo pindhah menyang bagean utama file kita:

- task: CmdLine@2
  inputs:
    script: 

Saiki kita kudu nggawe file kanthi lisensi analisa. kene PVSNAME и PVSKEY – jeneng variabel sing nilai kita nemtokake ing setelan. Dheweke bakal nyimpen login PVS-Studio lan kunci lisensi. Kanggo nyetel nilai, bukak menu Variabel-> Variabel anyar. Ayo nggawe variabel PVSNAME kanggo login lan PVSKEY kanggo tombol analyzer. Aja lali mriksa kothak Simpen nilai iki rahasia kanggo PVSKEY. Kode perintah:

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

Ayo gawe proyek kasebut nggunakake file bat sing ana ing repositori:

сall build.bat

Ayo nggawe folder ing ngendi file kanthi asil analisa bakal disimpen:

сall mkdir PVSTestResults

Ayo miwiti nganalisa proyek kasebut:

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

Kita ngowahi laporan menyang format html nggunakake sarana PlogConverter:

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

Saiki sampeyan kudu nggawe tugas supaya sampeyan bisa ngunggah laporan.

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

File konfigurasi lengkap katon kaya iki:

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()

Ayo klik Simpen->Simpen->Run kanggo mbukak tugas. Ayo download laporan kanthi pindhah menyang tab tugas.

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Proyek Chocolatey mung ngemot 37615 baris kode C #. Ayo goleki sawetara kesalahan sing ditemokake.

Asil tes

Warning N1

Peringatan Analyzer: V3005 Variabel 'Panyedhiya' ditugasake dhewe. CrytpoHashProviderSpecs.cs 38

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

Analisa ndeteksi penugasan variabel kasebut dhewe, sing ora ana gunane. Paling kamungkinan, ing panggonan salah siji saka variabel iki kudu ana sawetara liyane. Ya, utawa iki salah ketik, lan tugas ekstra mung bisa dicopot.

Warning N2

Peringatan Analyzer: V3093 [CWE-480] Operator '&' ngevaluasi loro operand. Mbokmenawa operator '&&' short-circuit kudu digunakake tinimbang. 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;
  }
}

Bedane operator & saka operator && yaiku yen sisih kiwa ekspresi yaiku palsu, banjur sisih tengen isih bakal diwilang, kang ing kasus iki nyebabake telpon cara rasah system.directory_exists.

Ing fragmen sing dianggep, iki minangka cacat cilik. Ya, kondisi iki bisa dioptimalake kanthi ngganti operator & karo operator &&, nanging saka sudut pandang praktis, iki ora mengaruhi apa-apa. Nanging, ing kasus liyane, kebingungan antarane & lan && bisa nyebabake masalah serius nalika sisih tengen ekspresi dianggep kanthi nilai sing salah/ora bener. Contone, ing koleksi kesalahan kita, diidentifikasi nggunakake diagnostik V3093, ana kasus iki:

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

Malah yen indeks k ora bener, bakal digunakake kanggo ngakses unsur array. Akibaté, pangecualian bakal dibuwang IndexOutOfRangeException.

Pènget N3, N4

Peringatan Analyzer: V3022 [CWE-571] Ekspresi 'shortPrompt' mesthi bener. InteractivePrompt.cs 101
Peringatan Analyzer: V3022 [CWE-571] Ekspresi 'shortPrompt' mesthi bener. 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
    ....
  }
  ....
}

Ing kasus iki, ana logika aneh konco operasi operator ternary. Coba deleng maneh: yen syarat sing daktandha karo nomer 1 wis rampung, banjur pindhah menyang kondisi 2, sing tansah bener, sing artine baris 3 bakal dieksekusi. Yen kondisi 1 ternyata palsu, banjur kita bakal pindhah menyang baris sing ditandhani nomer 4, kondisi sing uga tansah bener, sing artine baris 5 bakal dieksekusi. Dadi, kondisi sing ditandhani karo komentar 0 ora bakal kawujud, sing bisa uga ora persis karo logika operasi sing dikarepake programmer.

Warning N5

Peringatan Analyzer: V3123 [CWE-783] Mbok operator '?:' dianggo ing cara sing beda saka samesthine. Prioritas kasebut luwih murah tinimbang prioritas operator liyane ing kondisi kasebut. Pilihan.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);
  }
}

Diagnosa makarya kanggo baris:

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

Wiwit variabel j sawetara baris ndhuwur wis initialized kanggo nul, operator ternary bakal bali Nilai palsu. Amarga kondisi kasebut, awak loop bakal dieksekusi mung sapisan. Iku misale jek kula sing Piece saka kode iki ora bisa ing kabeh minangka programmer dimaksudaké.

Warning N6

Peringatan Analyzer: V3022 [CWE-571] Ekspresi 'installedPackageVersions.Count != 1' mesthi bener. 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);
    }
    ....
  }
  ....
}

Ana kahanan aneh ing kene: InstallPackageVersions.Count!= 1kang bakal tansah bener. Asring bebaya kuwi nuduhake kesalahan logis ing kode, lan ing kasus liyane mung nuduhake mriksa keluwih.

Warning N7

Peringatan Analyzer: V3001 Ana sub-ekspresi identik 'commandArguments.contains("-apikey")' ing sisih kiwa lan ing sisih tengen '||' operator. 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");
}

Programmer sing nulis bagean kode iki nyalin lan nempel rong baris pungkasan lan kelalen nyunting. Amarga iki, pangguna Chocolatey ora bisa ngetrapake parameter kasebut apikey saperangan cara liyane. Kaya paramèter ing ndhuwur, aku bisa menehi pilihan ing ngisor iki:

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

Kesalahan nyalin-tempel duwe kemungkinan dhuwur kanggo katon cepet utawa mengko ing proyek apa wae kanthi kode sumber sing akeh, lan salah sawijining alat sing paling apik kanggo nglawan yaiku analisis statis.

PS Lan minangka tansah, kesalahan iki cenderung katon ing mburi kondisi multi-line :). Deleng publikasi "Efek baris pungkasan".

Warning N8

Peringatan Analyzer: V3095 [CWE-476] Obyek 'installedPackage' digunakake sadurunge diverifikasi marang null. Priksa baris: 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)
  {
    ....
  }
  ....
}

Kesalahan klasik: obyek pisanan diinstalPaket digunakake banjur dipriksa null. Diagnosa iki ngandhani babagan siji saka rong masalah ing program: salah siji diinstalPaket ora tau padha null, kang mamang, banjur mriksa keluwih, utawa kita bisa duweni potensi kesalahan serius ing kode - nyoba kanggo ngakses referensi null.

kesimpulan

Dadi, kita wis njupuk langkah cilik liyane - saiki nggunakake PVS-Studio dadi luwih gampang lan luwih trep. Aku uga kaya ngomong sing Chocolatey manager paket apik karo nomer cilik saka kasalahan ing kode, kang bisa dadi malah kurang nalika nggunakake PVS-Studio.

Kita ngajak sampeyan скачать lan nyoba PVS-Studio. Panggunaan analisa statis kanthi rutin bakal nambah kualitas lan linuwih kode sing dikembangake dening tim sampeyan lan mbantu nyegah akeh kerentanan nul dina.

PS

Sadurunge diterbitake, kita ngirim artikel kasebut menyang pangembang Chocolatey, lan dheweke nampa kanthi apik. Kita ora nemu apa-apa kritis, nanging padha, contone, seneng bug kita ketemu related kanggo tombol "api-tombol".

PVS-Studio saiki ana ing Chocolatey: mriksa Chocolatey saka ing Azure DevOps

Yen sampeyan pengin nuduhake artikel iki karo pamirsa sing nganggo basa Inggris, gunakake tautan terjemahan: Vladislav Stolyarov. PVS-Studio Saiki ing Chocolatey: Priksa Chocolatey ing Azure DevOps.

Source: www.habr.com

Add a comment