Analisis statik - dari pengenalan kepada penyepaduan

Bosan dengan semakan atau penyahpepijatan kod yang tidak berkesudahan, kadangkala anda berfikir tentang cara untuk memudahkan hidup anda. Dan selepas mencari sedikit, atau secara tidak sengaja tersandung padanya, anda boleh melihat frasa ajaib: "Analisis statik". Mari lihat apa itu dan bagaimana ia boleh berinteraksi dengan projek anda.

Analisis statik - dari pengenalan kepada penyepaduan
Malah, jika anda menulis dalam mana-mana bahasa moden, maka, tanpa disedari, anda menjalankannya melalui penganalisis statik. Hakikatnya ialah mana-mana pengkompil moden menyediakan, walaupun kecil, set amaran tentang masalah yang berpotensi dalam kod. Sebagai contoh, apabila menyusun kod C++ dalam Visual Studio anda mungkin melihat perkara berikut:

Analisis statik - dari pengenalan kepada penyepaduan
Dalam output ini kita melihat bahawa pembolehubah var tidak pernah digunakan di mana-mana dalam fungsi. Jadi pada hakikatnya, anda hampir selalu menggunakan penganalisis kod statik mudah. Walau bagaimanapun, tidak seperti penganalisis profesional seperti Coverity, Klocwork atau PVS-Studio, amaran yang diberikan oleh pengkompil mungkin hanya menunjukkan sebilangan kecil masalah.

Jika anda tidak tahu dengan pasti apa itu analisis statik dan cara melaksanakannya, baca artikel iniuntuk mengetahui lebih lanjut mengenai metodologi ini.

Mengapa anda memerlukan analisis statik?

Secara ringkas: pecutan dan pemudahan.

Analisis statik membolehkan anda menemui banyak masalah berbeza dalam kod: daripada penggunaan binaan bahasa yang salah kepada kesilapan menaip. Sebagai contoh, bukannya

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Anda menulis kod berikut:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Seperti yang anda lihat, terdapat kesilapan menaip pada baris terakhir. Sebagai contoh, PVS-Studio mengeluarkan amaran berikut:

V537 Pertimbangkan untuk menyemak ketepatan penggunaan item 'y'.

Jika anda ingin memasukkan tangan anda ke dalam ralat ini, cuba contoh siap pakai dalam Penjelajah Pengkompil: *menangis*.

Dan seperti yang anda fahami, tidak selalu mungkin untuk memberi perhatian kepada bahagian kod tersebut dengan segera, dan oleh sebab itu, anda boleh duduk menyahpepijat selama sejam, tertanya-tanya mengapa semuanya berfungsi dengan begitu pelik.

Walau bagaimanapun, ini jelas satu kesilapan. Bagaimana jika pembangun menulis kod suboptimum kerana dia terlupa beberapa kehalusan bahasa? Atau membenarkannya dalam kod tingkah laku yang tidak ditentukan? Malangnya, kes sedemikian adalah perkara biasa dan sebahagian besar masa dihabiskan untuk menyahpepijat secara khusus kod kerja yang mengandungi kesilapan menaip, ralat biasa atau tingkah laku yang tidak ditentukan.

Untuk situasi ini analisis statik muncul. Ini adalah pembantu untuk pembangun yang akan menunjukkan pelbagai masalah dalam kod dan menerangkan dalam dokumentasi mengapa tidak perlu menulis dengan cara ini, apa yang boleh menyebabkannya dan cara membetulkannya. Berikut ialah contoh rupanya: *menangis*.

Anda boleh menemui lebih banyak ralat menarik yang boleh dikesan oleh penganalisis dalam artikel:

Memandangkan anda telah membaca bahan ini dan yakin dengan faedah analisis statik, anda mungkin ingin mencubanya. Tetapi di mana untuk bermula? Bagaimana untuk mengintegrasikan alat baharu ke dalam projek semasa anda? Dan bagaimana untuk memperkenalkan pasukan kepadanya? Anda akan mendapat jawapan kepada soalan-soalan ini di bawah.

Perhatian. Analisis statik tidak menggantikan atau membatalkan perkara yang berguna seperti semakan kod. Ia melengkapkan proses ini, membantu untuk melihat dan membetulkan kesilapan silap, ketidaktepatan dan reka bentuk berbahaya terlebih dahulu. Adalah lebih produktif untuk menumpukan pada ulasan kod pada algoritma dan kejelasan kod, daripada mencari kurungan yang salah letak atau membaca fungsi perbandingan yang membosankan.

0. Mengenal alatan

Semuanya bermula dengan versi percubaan. Memang, sukar untuk membuat keputusan untuk melaksanakan sesuatu ke dalam proses pembangunan jika anda tidak pernah melihat alat itu secara langsung sebelum ini. Oleh itu, perkara pertama yang perlu anda lakukan ialah memuat turun versi Percubaan.

Apa yang anda akan pelajari pada peringkat ini:

  • Apakah cara untuk berinteraksi dengan penganalisis;
  • Adakah penganalisis serasi dengan persekitaran pembangunan anda?
  • Apakah masalah yang terdapat dalam projek anda pada masa ini?

Selepas anda memasang semua yang anda perlukan, perkara pertama yang perlu anda lakukan ialah menjalankan analisis keseluruhan projek (Windows, Linux, MacOS). Dalam kes PVS-Studio dalam Visual Studio anda akan melihat gambar yang serupa (boleh diklik):

Analisis statik - dari pengenalan kepada penyepaduan
Hakikatnya ialah penganalisis statik biasanya mengeluarkan sejumlah besar amaran untuk projek dengan asas kod yang besar. Tidak perlu membetulkannya semua, kerana projek anda sudah berfungsi, yang bermaksud masalah ini tidak kritikal. Walau bagaimanapun, anda anda boleh melihat amaran yang paling menarik dan betulkan jika perlu. Untuk melakukan ini, anda perlu menapis output dan meninggalkan hanya mesej yang paling boleh dipercayai. Dalam pemalam PVS-Studio untuk Visual Studio, ini dilakukan dengan menapis mengikut tahap ralat dan kategori. Untuk keluaran yang paling tepat, biarkan sahaja Tinggi ΠΈ Umum (juga boleh diklik):

Analisis statik - dari pengenalan kepada penyepaduan
Sesungguhnya, 178 amaran lebih mudah dilihat daripada beberapa ribu...

Dalam tab sederhana ΠΈ Rendah Selalunya terdapat amaran yang baik, tetapi kategori ini termasuk diagnostik yang kurang ketepatan (kebolehpercayaan). Maklumat lanjut tentang tahap amaran dan pilihan untuk bekerja di bawah Windows boleh didapati di sini: *menangis*.

Setelah berjaya menyemak ralat yang paling menarik (dan berjaya membetulkannya) adalah berbaloi menyekat amaran yang tinggal. Ini adalah perlu supaya amaran baru tidak hilang di kalangan yang lama. Di samping itu, penganalisis statik ialah pembantu untuk pengaturcara, dan bukan senarai pepijat. πŸ™‚

1. Automasi

Selepas berkenalan, tiba masanya untuk mengkonfigurasi pemalam dan menyepadukan ke dalam CI. Ini mesti dilakukan sebelum pengaturcara mula menggunakan penganalisis statik. Hakikatnya ialah pengaturcara mungkin terlupa untuk membolehkan analisis atau tidak mahu melakukannya sama sekali. Untuk melakukan ini, anda perlu melakukan beberapa semakan akhir semua supaya kod yang belum diuji tidak boleh masuk ke dalam cawangan pembangunan umum.

Apa yang anda akan pelajari pada peringkat ini:

  • Apakah pilihan automasi yang disediakan oleh alat;
  • Adakah penganalisis serasi dengan sistem pemasangan anda?

Oleh kerana dokumentasi yang sempurna tidak wujud, kadangkala anda perlu menulis sokongan itu. Ini adalah perkara biasa dan kami gembira dapat membantu anda. πŸ™‚

Sekarang mari kita beralih kepada perkhidmatan integrasi berterusan (CI). Mana-mana penganalisis boleh dilaksanakan ke dalamnya tanpa sebarang masalah yang serius. Untuk melakukan ini, anda perlu membuat peringkat berasingan dalam saluran paip, yang biasanya terletak selepas ujian binaan dan unit. Ini dilakukan menggunakan pelbagai utiliti konsol. Sebagai contoh, PVS-Studio menyediakan utiliti berikut:

Untuk menyepadukan analisis ke dalam CI, anda perlu melakukan tiga perkara:

  • Pasang penganalisis;
  • Jalankan analisis;
  • Sampaikan hasil.

Sebagai contoh, untuk memasang PVS-Studio pada Linux (Debian-base), anda perlu menjalankan arahan berikut:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Pada sistem yang menjalankan Windows, tiada cara untuk memasang penganalisis daripada pengurus pakej, tetapi adalah mungkin untuk menggunakan penganalisis daripada baris arahan:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Anda boleh membaca lebih lanjut tentang menggunakan PVS-Studio pada sistem yang menjalankan Windows *di sini*.

Selepas pemasangan, anda perlu menjalankan analisis secara langsung. Walau bagaimanapun, adalah disyorkan untuk melakukan ini hanya selepas kompilasi dan ujian telah berlalu. Ini kerana analisis statik biasanya mengambil masa dua kali lebih lama daripada penyusunan.

Memandangkan kaedah pelancaran bergantung pada platform dan ciri projek, saya akan menunjukkan pilihan untuk C++ (Linux) sebagai contoh:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

Perintah pertama akan melakukan analisis, dan yang kedua sampul suratmenukar laporan ke dalam format teks, memaparkannya pada skrin dan mengembalikan kod pemulangan selain 0 jika terdapat amaran. Mekanisme seperti ini boleh digunakan dengan mudah untuk menyekat binaan apabila terdapat mesej ralat. Walau bagaimanapun, anda sentiasa boleh mengalih keluar bendera -w dan jangan sekat perhimpunan yang mengandungi amaran.

Perhatian. Format teks menyusahkan. Ia disediakan hanya sebagai contoh. Beri perhatian kepada format laporan yang lebih menarik - FullHtml. Ia membolehkan anda menavigasi melalui kod.

Anda boleh membaca lebih lanjut tentang menyediakan analisis pada CI dalam artikel "PVS-Studio dan Integrasi Berterusan" (Windows) atau "Bagaimana untuk menyediakan PVS-Studio dalam Travis CI"(Linux).

Okay, anda telah mengkonfigurasi penganalisis pada pelayan binaan. Sekarang, jika seseorang memuat naik kod yang belum diuji, peringkat pengesahan akan gagal, dan anda akan dapat mengesan masalah itu, bagaimanapun, ini tidak sepenuhnya mudah, kerana lebih cekap untuk menyemak projek itu bukan selepas cawangan telah digabungkan, tetapi sebelum itu, pada peringkat permintaan tarik.

Secara umum, menyediakan analisis permintaan tarik tidak jauh berbeza daripada pelancaran biasa analisis pada CI. Kecuali keperluan untuk mendapatkan senarai fail yang diubah. Ini biasanya boleh diperolehi dengan menanyakan perbezaan antara cawangan menggunakan git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Sekarang anda perlu menghantar senarai fail ini kepada penganalisis sebagai input. Sebagai contoh, dalam PVS-Studio ini dilaksanakan menggunakan bendera -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Anda boleh mengetahui lebih lanjut tentang menganalisis permintaan tarik *di sini*. Walaupun CI anda tiada dalam senarai perkhidmatan yang disebut dalam artikel, anda akan mendapati bahagian umum yang dikhaskan untuk teori jenis analisis ini berguna.

Dengan menyediakan analisis permintaan tarik, anda boleh menyekat komit yang mengandungi amaran, dengan itu mewujudkan sempadan yang tidak boleh dilalui oleh kod yang belum diuji.

Ini semua sudah tentu bagus, tetapi saya ingin dapat melihat semua amaran di satu tempat. Bukan sahaja daripada penganalisis statik, tetapi juga daripada ujian unit atau daripada penganalisis dinamik. Terdapat pelbagai perkhidmatan dan pemalam untuk ini. PVS-Studio, sebagai contoh, mempunyai pemalam untuk penyepaduan ke dalam SonarQube.

2. Integrasi pada mesin pembangun

Kini tiba masanya untuk memasang dan mengkonfigurasi penganalisis untuk kegunaan pembangunan harian. Pada ketika ini anda sudah biasa dengan kebanyakan cara bekerja, jadi ini boleh dipanggil bahagian paling mudah.

Sebagai pilihan yang paling mudah, pembangun boleh memasang sendiri penganalisis yang diperlukan. Walau bagaimanapun, ini akan mengambil banyak masa dan mengalihkan perhatian mereka daripada pembangunan, jadi anda boleh mengautomasikan proses ini menggunakan pemasang dan bendera yang diperlukan. Untuk PVS-Studio ada pelbagai bendera untuk pemasangan automatik. Walau bagaimanapun, sentiasa ada pengurus pakej, contohnya, Chocolatey (Windows), Homebrew (macOS) atau berdozen pilihan untuk Linux.

Kemudian anda perlu memasang pemalam yang diperlukan, contohnya untuk Visual Studio, IDEA, Rider dan lain-lain.

3. Penggunaan harian

Pada peringkat ini, sudah tiba masanya untuk menyatakan beberapa perkataan tentang cara mempercepatkan penganalisis semasa penggunaan harian. Analisis lengkap keseluruhan projek memerlukan banyak masa, tetapi berapa kerapkah kita menukar kod sepanjang keseluruhan projek sekaligus? Hampir tidak ada sebarang pemfaktoran semula yang terlalu besar yang akan menjejaskan keseluruhan pangkalan kod dengan serta-merta. Bilangan fail yang diubah pada satu masa jarang melebihi sedozen, jadi masuk akal untuk menganalisisnya. Untuk keadaan sedemikian ada mod analisis tambahan. Cuma jangan risau, ini bukan alat lain. Ini ialah mod khas yang membolehkan anda menganalisis hanya fail yang diubah dan kebergantungannya, dan ini berlaku secara automatik selepas membina jika anda bekerja dalam IDE dengan pemalam dipasang.

Jika penganalisis mengesan masalah dalam kod yang diubah baru-baru ini, ia akan melaporkannya secara bebas. Sebagai contoh, PVS-Studio akan memberitahu anda tentang perkara ini menggunakan amaran:

Analisis statik - dari pengenalan kepada penyepaduan
Sudah tentu, memberitahu pembangun untuk menggunakan alat itu tidak mencukupi. Kita perlu memberitahu mereka apa itu dan bagaimana keadaannya. Di sini, sebagai contoh, ialah artikel tentang permulaan pantas untuk PVS-Studio, tetapi anda boleh menemui tutorial serupa untuk mana-mana alat yang anda suka:

Artikel sedemikian menyediakan semua maklumat yang diperlukan untuk kegunaan harian dan tidak mengambil banyak masa. πŸ™‚

Walaupun pada peringkat mengenali alat itu, kami telah menahan banyak amaran semasa salah satu pelancaran pertama. Malangnya, penganalisis statik tidak sempurna, jadi dari semasa ke semasa mereka memberikan positif palsu. Ia biasanya mudah untuk menyekatnya; sebagai contoh, dalam pemalam PVS-Studio untuk Visual Studio anda hanya perlu mengklik satu butang:

Analisis statik - dari pengenalan kepada penyepaduan
Walau bagaimanapun, anda boleh melakukan lebih daripada sekadar menekannya. Sebagai contoh, anda boleh melaporkan masalah kepada sokongan. Jika positif palsu boleh dibetulkan, maka dalam kemas kini masa hadapan anda dapat melihat bahawa setiap kali terdapat semakin sedikit positif palsu khusus untuk pangkalan kod anda.

Selepas integrasi

Jadi kami telah melalui semua peringkat mengintegrasikan analisis statik ke dalam proses pembangunan. Walaupun pentingnya menyediakan alat sedemikian pada CI, tempat yang paling penting untuk menjalankannya ialah komputer pembangun. Lagipun, penganalisis statik bukan hakim yang mengatakan di tempat yang jauh dari anda bahawa kod itu tidak bagus. Sebaliknya, ia adalah pembantu yang memberitahu anda jika anda letih dan mengingatkan anda jika anda terlupa sesuatu.

Benar, tanpa penggunaan biasa, analisis statik tidak mungkin dapat memudahkan pembangunan dengan ketara. Lagipun, faedah utamanya untuk pembangun bukan terletak pada pencarian bahagian kod yang kompleks dan kontroversi, tetapi pada pengesanan awalnya. Setuju bahawa menemui masalah selepas suntingan dihantar untuk ujian bukan sahaja tidak menyenangkan, tetapi juga memakan masa yang lama. Analisis statik, apabila digunakan secara kerap, melihat setiap perubahan secara langsung pada komputer anda dan melaporkan tempat yang mencurigakan semasa bekerja pada kod.

Dan jika anda atau rakan sekerja anda masih tidak pasti sama ada ia berbaloi untuk melaksanakan penganalisis, maka saya cadangkan anda sekarang mula membaca artikel "Sebab untuk memperkenalkan penganalisis kod statik PVS-Studio ke dalam proses pembangunan". Ia menangani kebimbangan biasa pembangun bahawa analisis statik akan mengambil masa mereka dan sebagainya.

Analisis statik - dari pengenalan kepada penyepaduan

Jika anda ingin berkongsi artikel ini dengan khalayak berbahasa Inggeris, sila gunakan pautan terjemahan: Maxim Zvyagintsev. Analisis Statik: Dari Bermula kepada Penyepaduan.

Sumber: www.habr.com

Tambah komen