PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps
Kami terus membuat penggunaan PVS-Studio lebih nyaman. Penganalisis kami sekarang tersedia di Chocolatey, manajer paket untuk Windows. Kami yakin hal ini akan memfasilitasi penerapan PVS-Studio, khususnya di layanan cloud. Biar gak jauh-jauh yuk cek source code Chocolateynya sama. Azure DevOps akan bertindak sebagai sistem CI.

Berikut adalah daftar artikel kami yang lain tentang topik integrasi dengan sistem cloud:

Saya menyarankan Anda untuk memperhatikan artikel pertama tentang integrasi dengan Azure DevOps, karena dalam hal ini beberapa poin dihilangkan agar tidak diduplikasi.

Jadi, para pahlawan artikel ini:

PVS-Studio adalah alat analisis kode statis yang dirancang untuk mengidentifikasi kesalahan dan potensi kerentanan dalam program yang ditulis dalam C, C++, C# dan Java. Berjalan pada sistem Windows, Linux, dan macOS 64-bit, dan dapat menganalisis kode yang dirancang untuk platform ARM 32-bit, 64-bit, dan tertanam. Jika ini adalah pertama kalinya Anda mencoba analisis kode statis untuk memeriksa proyek Anda, kami sarankan Anda membiasakan diri dengannya artikel tentang cara cepat melihat peringatan PVS-Studio paling menarik dan mengevaluasi kemampuan alat ini.

Azure DevOps — serangkaian layanan cloud yang secara bersama-sama mencakup seluruh proses pengembangan. Platform ini mencakup alat seperti Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, yang memungkinkan Anda mempercepat proses pembuatan perangkat lunak dan meningkatkan kualitasnya.

Cokelat adalah manajer paket sumber terbuka untuk Windows. Tujuan dari proyek ini adalah untuk mengotomatiskan seluruh siklus hidup perangkat lunak mulai dari instalasi hingga pembaruan dan penghapusan instalasi pada sistem operasi Windows.

Tentang menggunakan Cokelat

Anda dapat melihat cara menginstal manajer paket itu sendiri di sini link. Dokumentasi lengkap untuk memasang penganalisis tersedia di link Lihat bagian Instalasi menggunakan manajer paket Chocolatey. Saya akan mengulangi secara singkat beberapa poin dari sana.

Perintah untuk menginstal penganalisis versi terbaru:

choco install pvs-studio

Perintah untuk menginstal versi tertentu dari paket PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Secara default, hanya inti penganalisis, komponen Inti, yang diinstal. Semua flag lainnya (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) dapat diteruskan menggunakan --package-parameters.

Contoh perintah yang akan menginstal penganalisa dengan plugin untuk Visual Studio 2019:

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

Sekarang mari kita lihat contoh penggunaan penganalisis yang mudah di Azure DevOps.

pengaturan

Izinkan saya mengingatkan Anda bahwa ada bagian terpisah tentang masalah seperti mendaftarkan akun, membuat Build Pipeline, dan menyinkronkan akun Anda dengan proyek yang terletak di repositori GitHub. artikel. Setup kami akan segera dimulai dengan menulis file konfigurasi.

Pertama, mari siapkan pemicu peluncuran, yang menunjukkan bahwa kita meluncurkan hanya untuk perubahan menguasai cabang:

trigger:
- master

Selanjutnya kita perlu memilih mesin virtual. Untuk saat ini agen tersebut akan menjadi agen yang dihosting Microsoft dengan Windows Server 2019 dan Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Mari beralih ke badan file konfigurasi (block tangga). Terlepas dari kenyataan bahwa Anda tidak dapat menginstal perangkat lunak sembarangan ke dalam mesin virtual, saya tidak menambahkan wadah Docker. Kita dapat menambahkan Chocolatey sebagai ekstensi untuk Azure DevOps. Untuk melakukan ini, ayo pergi ke link. Klik Dapatkan secara gratis. Selanjutnya, jika Anda sudah diotorisasi, cukup pilih akun Anda, dan jika belum, lakukan hal yang sama setelah otorisasi.

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Di sini Anda perlu memilih di mana kami akan menambahkan ekstensi dan klik tombol Install.

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Setelah instalasi berhasil, klik Lanjutkan ke organisasi:

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Anda sekarang dapat melihat template untuk tugas Chocolatey di jendela tugas saat mengedit file konfigurasi pipa-biru.yml:

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Klik pada Chocolatey dan lihat daftar bidang:

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Di sini kita perlu memilih install di lapangan bersama tim. DI DALAM Nama File Nuspec tunjukkan nama paket yang diperlukan – pvs-studio. Jika Anda tidak menentukan versinya, versi terbaru akan diinstal, yang sepenuhnya cocok untuk kami. Ayo tekan tombolnya menambahkan dan kita akan melihat tugas yang dihasilkan di file konfigurasi.

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

Selanjutnya, mari beralih ke bagian utama file kita:

- task: CmdLine@2
  inputs:
    script: 

Sekarang kita perlu membuat file dengan lisensi penganalisa. Di Sini NAMA PVS и PVSKEY – nama variabel yang nilainya kita tentukan di pengaturan. Mereka akan menyimpan login PVS-Studio dan kunci lisensi. Untuk mengatur nilainya, buka menu Variabel->Variabel baru. Mari kita membuat variabel NAMA PVS untuk masuk dan PVSKEY untuk kunci penganalisa. Jangan lupa untuk mencentang kotaknya Jaga kerahasiaan nilai ini untuk PVSKEY. Kode perintah:

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

Mari kita membangun proyek menggunakan file bat yang terletak di repositori:

сall build.bat

Mari buat folder tempat file dengan hasil analisa akan disimpan:

сall mkdir PVSTestResults

Mari kita mulai menganalisis proyek ini:

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

Kami mengonversi laporan kami ke format html menggunakan utilitas PlogСonverter:

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

Sekarang Anda perlu membuat tugas agar Anda dapat mengunggah laporannya.

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

File konfigurasi lengkapnya terlihat seperti ini:

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 Simpan->Simpan->Jalankan untuk menjalankan tugas. Mari unduh laporan dengan membuka tab tugas.

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Proyek Chocolatey hanya berisi 37615 baris kode C#. Mari kita lihat beberapa kesalahan yang ditemukan.

Hasil tes

Peringatan N1

Peringatan penganalisis: V3005 Variabel 'Penyedia' ditetapkan ke dirinya sendiri. CrytpoHashProviderSpecs.cs 38

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

Penganalisis mendeteksi penetapan variabel ke dirinya sendiri, yang tidak masuk akal. Kemungkinan besar, sebagai pengganti salah satu variabel ini, harus ada variabel lain. Ya, atau ini salah ketik, dan tugas tambahan bisa dihapus begitu saja.

Peringatan N2

Peringatan penganalisis: V3093 [CWE-480] Operator '&' mengevaluasi kedua operan. Mungkin operator '&&' hubungan pendek harus digunakan sebagai gantinya. 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;
  }
}

Perbedaan operator & dari operator && adalah jika sisi kiri ekspresi adalah palsu, maka sisi kanan akan tetap dihitung, yang dalam hal ini menyiratkan pemanggilan metode yang tidak perlu sistem.direktori_ada.

Dalam bagian yang dibahas, ini adalah cacat kecil. Ya, kondisi ini bisa dioptimalkan dengan mengganti operator & dengan operator &&, namun dari segi praktis, hal ini tidak berpengaruh apa-apa. Namun, dalam kasus lain, kebingungan antara & dan && dapat menyebabkan masalah serius ketika sisi kanan ekspresi diperlakukan dengan nilai yang salah/tidak valid. Misalnya, dalam kumpulan kesalahan kami, diidentifikasi menggunakan diagnostik V3093, ada kasus ini:

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

Bahkan jika indeks k salah, itu akan digunakan untuk mengakses elemen array. Akibatnya, pengecualian akan dilempar IndexOutOfRangeException.

Peringatan N3, N4

Peringatan penganalisis: V3022 [CWE-571] Ekspresi 'shortPrompt' selalu benar. InteraktifPrompt.cs 101
Peringatan penganalisis: V3022 [CWE-571] Ekspresi 'shortPrompt' selalu benar. InteraktifPrompt.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
    ....
  }
  ....
}

Dalam hal ini, ada logika aneh di balik pengoperasian operator ternary. Mari kita perhatikan lebih dekat: jika syarat yang saya tandai dengan angka 1 terpenuhi, maka kita lanjutkan ke syarat 2 yang selalu benaryang artinya akan dieksekusi baris 3. Jika kondisi 1 ternyata salah maka kita akan menuju ke baris bertanda angka 4 yang kondisinya juga selalu benar, yang berarti baris 5 akan dieksekusi. Dengan demikian, kondisi yang ditandai dengan komentar 0 tidak akan pernah terpenuhi, yang mungkin tidak sesuai dengan logika operasi yang diharapkan oleh pemrogram.

Peringatan N5

Peringatan penganalisis: V3123 [CWE-783] Mungkin operator '?:' bekerja dengan cara yang berbeda dari yang diharapkan. Prioritasnya lebih rendah dibandingkan prioritas operator lain dalam kondisinya. Opsi.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);
  }
}

Diagnostik berfungsi untuk saluran:

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

Sejak variabel j beberapa baris di atas diinisialisasi ke nol, operator ternary akan mengembalikan nilainya palsu. Karena kondisi ini, badan perulangan hanya akan dieksekusi satu kali. Bagi saya, potongan kode ini tidak berfungsi sama sekali seperti yang diinginkan pemrogram.

Peringatan N6

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

Ada kondisi bersarang yang aneh di sini: diinstalPackageVersions.Count!= 1yang akan selalu terjadi benar. Seringkali peringatan seperti itu menunjukkan kesalahan logis dalam kode, dan dalam kasus lain peringatan itu hanya menunjukkan pemeriksaan yang berlebihan.

Peringatan N7

Peringatan penganalisis: V3001 Ada sub-ekspresi yang identik 'commandArguments.contains("-apikey")' di kiri dan kanan '||' operator. ArgumenUtility.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");
}

Pemrogram yang menulis bagian kode ini menyalin dan menempelkan dua baris terakhir dan lupa mengeditnya. Karena itu, pengguna Chocolatey tidak dapat menerapkan parameter tersebut kunci API beberapa cara lagi. Mirip dengan parameter di atas, saya dapat menawarkan opsi berikut:

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

Kesalahan salin-tempel memiliki peluang besar untuk muncul cepat atau lambat di proyek apa pun dengan kode sumber dalam jumlah besar, dan salah satu alat terbaik untuk memeranginya adalah analisis statis.

PS Dan seperti biasa, error ini cenderung muncul di akhir kondisi multi-line :). Lihat publikasi "Efek baris terakhir".

Peringatan N8

Peringatan penganalisis: V3095 [CWE-476] Objek 'installedPackage' digunakan sebelum diverifikasi terhadap null. Periksa 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: menolak terlebih dahulu paket terinstal digunakan dan kemudian diperiksa nol. Diagnostik ini memberi tahu kita tentang salah satu dari dua masalah dalam program: salah satunya paket terinstal tidak pernah sama nol, yang diragukan, dan kemudian pemeriksaan menjadi mubazir, atau kita berpotensi mendapatkan kesalahan serius dalam kode - upaya untuk mengakses referensi nol.

Kesimpulan

Jadi kami telah mengambil langkah kecil lainnya - sekarang menggunakan PVS-Studio menjadi lebih mudah dan nyaman. Saya juga ingin mengatakan bahwa Chocolatey adalah manajer paket yang baik dengan sedikit kesalahan kode, yang mungkin lebih sedikit lagi saat menggunakan PVS-Studio.

Kami mengundang mendownload dan coba PVS-Studio. Penggunaan penganalisis statis secara teratur akan meningkatkan kualitas dan keandalan kode yang dikembangkan tim Anda dan membantu mencegah banyak hal kerentanan zero-day.

PS

Sebelum dipublikasikan, kami mengirimkan artikel ke pengembang Chocolatey, dan mereka menerimanya dengan baik. Kami tidak menemukan sesuatu yang penting, tetapi mereka, misalnya, menyukai bug yang kami temukan terkait dengan kunci “api-key”.

PVS-Studio sekarang ada di Chocolatey: memeriksa Chocolatey dari Azure DevOps

Jika Anda ingin membagikan artikel ini kepada audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Vladislav Stolyarov. PVS-Studio Kini dalam Chocolatey: Memeriksa Chocolatey di bawah Azure DevOps.

Sumber: www.habr.com

Tambah komentar