Apa perbedaan antara analisis kode statis dan tinjauan kode?

9

Saya hanya ingin tahu apa perbedaan antara analisis kode statis dan tinjauan kode. Bagaimana masing-masing dilakukan? Lebih khusus lagi, alat apa yang tersedia saat ini untuk tinjauan kode / analisis statis PHP? Saya juga ingin tahu tentang alat yang baik untuk meninjau kode untuk bahasa apa pun.

Thomas Owens
sumber
Peninjauan kode pada umumnya adalah proses manual di mana programmer lain memeriksa kode Anda. Ini adalah cara untuk menemukan kesalahan kecil atau penyimpangan dari konvensi pengkodean dll, dan cara yang baik untuk meningkatkan kualitas kode secara keseluruhan. Analisis kode statis adalah sesuatu yang dapat Anda gunakan untuk alat, meskipun saya belum pernah melakukannya sendiri. Tertarik untuk melihat apa jawaban orang lain
9
Dalam dua kata? "Otak".
MSalters

Jawaban:

19

Ulasan kode adalah sesuatu yang dilakukan orang, analisis statis adalah sesuatu yang dilakukan mesin. Ada (kadang-kadang baik) alat analisis statis. Peninjauan kode adalah ketika seorang kolega / mentor / profesor / teman memeriksa kode Anda dan memberi Anda kritik yang membangun.

Analisis statis, di sisi lain, adalah proses otomatis di mana sebuah mesin, diinformasikan oleh apa yang ia ketahui tentang bahasa yang dianalisis (biasanya dari sistem tipe), menganalisis suatu program dan mencoba untuk memilih hal-hal yang bisa salah, tidak efisien, gaya buruk, atau tidak optimal.

Rafe Kettler
sumber
2
Saya selalu mendapat kesan bahwa tinjauan kode adalah semacam analisis statis, karena ini adalah cara untuk mengukur kesehatan perangkat lunak tanpa menjalankannya.
Buhb
4
@ Buhb: ini sangat menambah pengetahuan tentang konteksnya. Peninjau kode harus memahami jika kode melakukan apa yang diharapkan untuk dilakukan. Alat statis akan (paling baik, jika bahasa memungkinkan untuk itu melalui beberapa dekorasi / pernyataan / kontrak) memeriksa bahwa semuanya resmi ok ... Jadi Anda bisa mengatakannya dengan cara lain: analisis statis adalah semacam tinjauan kode, dilakukan secara algoritmik.
Francesco
Hanya untuk menambahkan, Lint (analis statis): Bung itu tidak diperlukan !! Rekan (Peninjau): Anda juga bisa melakukannya !!
Kushal
11

Analisis statis adalah proses menganalisis perangkat lunak tanpa menjalankannya. Ini sangat bagus dan direkomendasikan, tetapi Anda harus mengingatnya

  1. alat analisis statis yang berbeda memiliki pemahaman yang berbeda dari kode yang mereka pelajari, maka mereka dapat memberi sinyal (atau tidak memberi sinyal) masalah yang berbeda. Satu alat dapat memberikan laporan yang bersih, dan yang lainnya dapat mengeluh tentang sejuta hal.
  2. alat yang dinamis (untuk memberi contoh, pikirkan valgrind) dapat menemukan banyak masalah lain, dengan harga beban serius pada konsumsi sumber daya (waktu, penggunaan memori). Ini karena Anda biasanya menjalankan versi perangkat lunak yang diinstrumentasi. Perhatikan bahwa, dengan diinstruksikan dalam beberapa cara (ganti malloc Anda dengan debugging malloc) itu tidak persis sama dengan perangkat lunak Anda (seperti yang dapat Anda lihat dari waktu eksekusi)

Kedua pendekatan ini menderita karena kurangnya konteks: mereka tidak tahu apa yang harus dicapai oleh sw.

Peninjauan kode dilakukan oleh pembuat kode lain, yang konon tahu dan bisa memeriksanya

  1. jika kodenya benar
  2. jika perangkat lunak secara semantik benar.

Ini jauh lebih mahal dan memiliki tingkat pengulangan yang bervariasi tetapi sangat membantu.

Seperti biasa, tidak ada satu pun peluru perak yang akan memperbaiki semua bug dan menghindari semua masalah. Menerapkan - sebanyak mungkin diberikan tempat, kode, waktu, tiga bentuk pemeriksaan (statis, dinamis, lebih banyak mata (dan otak) yang benar-benar melihat kode) disarankan.

ps: Saya harus mencatat bahwa biasanya lebih baik untuk menerapkan alat dari awal. Mengubah sistem warisan adalah pengalaman yang jauh lebih tidak menyenangkan, karena positif palsu. Jika Anda mulai dari awal dan selalu bertujuan untuk menjaga alat analisis tetap bersih, Anda mungkin akan menghindari banyak masalah.

pps: untuk alat, itu tergantung pada bahasa. Di dunia C dan C ++ Anda bisa mulai dengan melihat Visual Studio itu sendiri, yang berisi alat analisis statis bawaan. Sebuah relatif lengkap daftar dapat ditemukan di Wikipedia.

ppps: Analisis statis lebih cocok untuk bahasa statis, seperti C atau C ++. Untuk Python bisa sangat sulit untuk mengatakan apakah nama yang merujuk ke daftar pada suatu titik akan merujuk ke daftar untuk sisa program, karena sifat dinamisnya. Ini tidak berarti bahwa tidak ada yang bisa dilakukan, seperti upaya JIT seperti yang ditunjukkan PyPy .

Francesco
sumber
2

Peninjauan Kode adalah ketika otoritas senior atau khusus memeriksa kode Anda, cara pengkodean Anda, standar yang diikuti dalam kode dan khususnya tingkat logika kode

Sejauh menyangkut analisis statis, analisis perangkat lunak komputer dilakukan tanpa benar-benar menjalankan program yang dibangun dari perangkat lunak tersebut (analisis yang dilakukan pada program pelaksana dikenal sebagai analisis dinamis)

Daftar alat sesuai teknologi diberikan dalam tautan di bawah ini

Daftar Alat untuk Analisis Statis

Karenanya tinjauan kode dan analisis statis adalah istilah yang sama sekali berbeda.

OM The Eternity
sumber
7
Jawaban OM pada dasarnya benar, kecuali bahwa saya berdalih dengan 'Seorang Senior atau Otoritas Khusus memeriksa kode Anda ...'. Memang benar bahwa beberapa toko disfungsional melakukan tinjauan kode dengan cara orang tua / anak ini, banyak toko (dan lebih baik) memiliki sistem peninjauan kode peer-to-peer yang tidak menyerupai seorang guru yang menilai masalah pekerjaan rumah. Di tempat saya bekerja, seorang junior biasa meninjau pekerjaan senior. Tujuannya adalah untuk membuat sepasang mata kedua melihat semua kode sebelum diperiksa.
Jim In Texas
2
@ JimInTexas, sama di toko kami. Saya akan mengatakan hasil paling penting (jangka panjang) dari tinjauan kode adalah menyebarkan pengetahuan, praktik pemersatu dan visi arsitektur / desain di seluruh tim. Dalam hal ini, seorang junior yang meninjau kode senior paling buruk adalah cara yang bagus untuk mempelajari praktik-praktik terbaik lokal - tetapi siapa bilang senior tidak pernah melakukan kesalahan dan seorang junior tidak pernah bisa menemukannya?
Péter Török
1

Tinjauan kode adalah penilaian yang lebih kualitatif, analisis kode statis adalah penilaian yang lebih kuantitatif.

Hei nak, metode ini bisa ditulis lebih baik

vs, fe

Kinerja menurun. Tidak efisien untuk mengidentifikasi string kosong dengan menggunakan konstruksi 'wcslen (str)> 0'. Cara yang lebih efisien adalah dengan memeriksa: str [0]! = '\ 0'.

Kinerja menurun. Ekspresi jenis strlen (MyStr.c_str ()) dapat ditulis ulang sebagai MyStr.length ()

Kinerja menurun. Jika 'Pesanan' adalah iterator, akan lebih efektif menggunakan bentuk kenaikan awalan. Ganti iterator ++ dengan ++ iterator.

Sementara kesalahan nyata dapat (jelas) ada dan terdeteksi oleh SCA

Format salah. Pertimbangkan untuk memeriksa argumen N aktual dari fungsi 'Foo'

Ekspresi tertutup oleh tanda kurung dua kali: ((ekspresi)). Sepasang tanda kurung tidak perlu atau salah cetak ada

Panggilan fungsi 'memset' akan menyebabkan underflow buffer 'dest.lfFaceName'

Malas Badger
sumber
maaf telah menghinamu Sejauh apa komentar saya (menghilang?) Dimaksudkan untuk mengatakan - apakah Anda tahu alasan mengapa manusia tidak dapat menawarkan komentar yang sama yang Anda berikan sebagai contoh hasil dari analisis kode statis?
sq33G
@ sq33G: Tidak. Siapa pun yang memiliki perlengkapan kantor (kertas dalam jumlah tak terbatas) dapat mensimulasikan mesin Turing yang sewenang-wenang. Namun itu membosankan dan memakan waktu. (Mungkin bukan yang diberikan tetapi mengatakan perilaku tidak terdefinisi dalam C).
Maciej Piechotka
Ah. Jadi jawaban sebenarnya untuk pertanyaan OP adalah bahwa mesin Turing tidak lengkap manusia.
sq33G
0

Analisis statis adalah ketika artefak dianalisis tanpa dieksekusi. Meskipun dapat diterapkan pada artefak apa pun, sering kali diterapkan pada kode sumber atau kode objek dan merujuk pada penggunaan alat khusus untuk menganalisis dan mendapatkan informasi tentang produk kerja ini. Alat-alat ini menghasilkan laporan yang ditafsirkan oleh seorang insinyur untuk digunakan dalam menentukan kualitas sistem yang sedang dibangun, dan sebagai panduan untuk perencanaan pengembangan dan pemeliharaan. Wikipedia memiliki daftar alat untuk analisis statis , yang disusun berdasarkan bahasa dan dengan deskripsi singkat tentang kemampuan mereka.

Ulasan adalah evaluasi manusia terhadap beberapa produk kerja, yang bisa berupa kode. Ulasan juga dapat dilakukan pada desain atau dokumen lain juga. Idenya adalah bahwa orang yang akrab dengan produk kerja selain dari pengembang melihatnya untuk menemukan kesalahan, mulai dari masalah keamanan hingga pelanggaran standar pengkodean.

Secara teknis, tinjauan kode dapat dianggap sebagai bentuk analisis statis, karena kode tersebut tidak benar-benar dieksekusi selama tinjauan. Namun, dalam terminologi umum, "analisis statis" biasanya mengacu pada parsing mesin dari file sumber atau objek sementara "review" menunjukkan bahwa manusia adalah orang yang melakukan analisis.

Thomas Owens
sumber
-2

Review kode adalah teknik yang berguna untuk mencium masalah dalam kode sumber tahap sangat awal. Sebagai bagian dari latihan ini, banyak masalah seperti kinerja, skalabilitas, dan standar pengkodean diidentifikasi dan diperbaiki. Ini akan meningkatkan kualitas kode.

Analisis statis digunakan untuk menganalisis metrik kualitas kode seperti kompleksitas cyclometric, indeks rawatan, kedalaman pewarisan, dan kopling kelas. Berbagai alat tersedia di pasar untuk menganalisis kualitas kode. Pengembang C # menggunakan Microsoft visual studio untuk menghasilkan laporan metrik.

Balasubramanian.S
sumber
-3

analisis kode statis dilakukan oleh alat otomatis, tinjauan kode dilakukan dengan orang-orang sebelum kode tersebut dilakukan.

Alat untuk meninjau kode:

1.bandingkan tanpa

2. perbedaan perangkat lunak kontrol versi

Alat-alat ini selalu digunakan untuk menghasilkan perbedaan antara versi lama dan versi baru.

Upton
sumber
2
1) Tidak harus sebelum kode dikomit - review kode dilakukan oleh orang-orang dan 2) Saya menemukan deskripsi alat diff sebagai alat review kode "menarik" tentu mereka adalah alat yang digunakan untuk mengidentifikasi kode untuk ditinjau tetapi jika Saya ditanya tentang alat peninjau kode yang mungkin saya tunjukkan pada orang-orang yang membantu mengelola proses (saya telah menggunakan Kiln dan Crucible misalnya).
Murph