Alat-alat seperti pc-lint atau QAC dapat digunakan untuk melakukan analisis kode statis pada basis kode.
Dalam pengalaman saya analisis statis sering menghasilkan sejumlah besar kebisingan, yaitu peringatan pada hal-hal yang bukan bug nyata tetapi entah bagaimana melanggar salah satu aturan dalam aturan yang ditetapkan. Menonaktifkan aturan tertentu (baik untuk kebaikan dalam set aturan atau melalui komentar khusus dalam kode) dapat menjadi proses rumit yang nyata.
Saya bekerja di tempat yang menggunakan sistem analisis kode statis komersial yang disebut Coverity Prevent, dan itu luar biasa! Ini sangat canggih dan cerdas.
Kami melemparkan sekitar 18 GB kode open-source dan C dan C ++ miliknya, dan itu akan menelusuri jalur kode dan dengan cepat menemukan bug halus yang membutuhkan manusia selamanya untuk dilacak. Itu juga hebat dalam menentukan hal-hal yang biasanya Heisenbugs.
Itu berjalan setiap beberapa hari terhadap basis kode kami, dan fitur yang bagus adalah bahwa kami dapat mengatakannya, "Ini bukan bug," dan itu akan mengingatnya di masa depan.
Gotcha adalah, Coverity sangat mahal. Mereka tidak mempublikasikan biayanya, tetapi saya memahami bahwa untuk proyek komersial, harganya mencapai ratusan ribu dolar per tahun. Tapi itu mungkin menyelamatkan kami karena harus mempekerjakan sejumlah besar pengembang dan staf QA, jadi secara keseluruhan manajemen kami tampaknya berpikir itu adalah pembelian yang baik.
Setelah memiliki pengalaman itu, saya melihat analisis kode statis yang cukup menguntungkan.
Saat memulai dengan bahasa baru, senang memiliki pelatih. Begitulah cara saya memikirkan alat analisis statis. Saya menulis banyak javascript dan pada awalnya saya mengambil beberapa kebiasaan buruk terutama karena saya mentransfer beberapa hal dari bahasa sebelumnya. Javascript cukup fleksibel sehingga Anda bisa lolos dengan cukup banyak hal, tetapi jika saya ingin jslint memperingatkan saya tentang pola-pola tertentu, saya akan mengambil pola pengkodean yang lebih baik sejak awal daripada harus mempelajari kembali barang-barang nanti.
Analisis statis pada dasarnya adalah ulasan kode bantuan mesin. Mereka akan menunjukkan area yang dipertanyakan yang mungkin terlewatkan selama pengujian reguler.
Sebagai contoh, apakah penulis benar-benar bermaksud membuat tugas dalam persyaratan ini?
if (x = 1) {
...
}
Atau mungkin seorang pemula membingungkan para pemain leksikal:
char* number = "123";
int converted = number;
Tentu saja analisis statis memerlukan penyesuaian. Kemudian lagi, kontrol revisi, wiki, pelacak bug, printer cantik dan alat-alat lain juga memerlukan beberapa pengaturan. Semakin besar proyek, semakin baik hadiah untuk kerja awal.
Dari sudut pandang konsultan, setiap alat analisis statis akan memiliki beberapa kebisingan tetapi tidak semua alat analisis statis dibuat sama. Alat analisis statis seperti Coverity, Klocwork, Grammatech memiliki teknik analisis yang baik yang harus menghasilkan hasil yang lebih akurat. Jika Anda menyetel dan mengubah beberapa lagi, Anda akan mendapatkan hasil yang lebih baik biasanya (setelah semua, penganalisa statis harus dapat berjalan pada semua jenis kode yang berbeda dari perangkat medis kecil ke sistem operasi jaringan). Mendefinisikan "noise" juga tergantung pada kriteria Anda untuk apa yang merupakan laporan yang layak diperbaiki. Di satu sisi spektrum, beberapa pengembang menandai semua laporan yang tidak mereka perbaiki sebagai "false" (bahkan kode yang ditulis dengan buruk yang tidak sempat mereka perbaiki) dan di ujung lainnya,
Beberapa alat ini lebih fokus analisis pusat dan yang lain lebih fokus desktop - meskipun ketiganya memiliki fitur yang mendukung keduanya. Seperti yang disebutkan @Bob, mereka membutuhkan biaya.
Di perusahaan saya sebelumnya, kami telah menggunakan analisa statis oleh Parasoft. Dan diyakini dalam tim bahwa setidaknya 60% dari bug run time ditangkap sebelum kompilasi.
Analisis statis juga dapat dilakukan tanpa alat, dengan melakukan tinjauan manual pada kode perangkat lunak. Ini seringkali merupakan cara yang paling hemat biaya untuk meningkatkan kualitas kode.
Pilihan terbaik kedua adalah berinvestasi untuk satu atau lebih alat analisis statis kelas atas (seperti Coverity yang disebutkan sebelumnya, atau KLOCwork). Karena alat ini melakukan analisis yang jauh lebih dalam daripada serat, misalnya, rasio sinyal-ke-suara jauh lebih baik.
Saya menganggap menggunakan serat sebagai opsi ketiga, karena tingkat kebisingan yang tinggi. Menerapkan serat ke proyek yang ada bisa menjadi tugas yang menakutkan.
Secara umum analisis program statis telah banyak berkembang selama beberapa tahun terakhir. Alat analisis statis saat ini mampu melakukan analisis antar-prosedur yang mendalam, dan dapat secara otomatis mengidentifikasi misalnya prosedur pra dan pasca kondisi. Ini bisa sangat membantu untuk ulasan kode nanti.
Karena tingkat positif palsu yang tinggi, Anda tidak boleh menggunakan alat analisis statis (seperti serat atau FindBugs) untuk setiap kompilasi.
Sebaliknya, ini adalah pemeriksaan kewarasan yang bagus untuk berkonsultasi setelah Anda memiliki bug dan tidak bisa mengetahuinya . Dalam hal ini, Anda dapat menghibur positif palsu, dan Anda mungkin telah mempersempit sumber kesalahan yang mungkin terjadi. Misalnya, jika Anda mereproduksi bug Anda bahkan tanpa menjalankan beberapa modul, Anda dapat mengabaikan apa yang dikatakan FindBugs untuk mereka. Ini sangat membantu ketika Anda melihat sepotong kode dan berpikir itu mengatakan satu hal, sedangkan kompiler membacanya secara harfiah (seperti di Jawa ketika Anda memiliki equalsmetode yang mengambil jenis kelas bukan Object).
Anda juga dapat memiliki alat analisis statis menjadi bagian dari proses pengembangan Anda: Ketika seorang pengembang mendapat ulasan kode, mereka juga harus menjalankan FindBugs di atasnya. Singkatnya, ini berguna, tetapi Anda tidak akan menggunakannya sesering kompiler atau editor teks.
Saya akan membantah hal itu. Ini adalah anekdotal, dan saya yakin itu lebih buruk pada proyek yang lebih besar / lebih besar, tetapi memilah-milah suara tidak seburuk itu. Saya telah mengatur PC-lint untuk mengabaikan banyak pemicu yang menghasilkan banyak kesalahan positif dan menjalankannya lebih sering (dan kemudian menjalankannya lebih jarang). Semakin lama Anda menunggu - semakin buruk!
Saat memulai dengan bahasa baru, senang memiliki pelatih. Begitulah cara saya memikirkan alat analisis statis. Saya menulis banyak javascript dan pada awalnya saya mengambil beberapa kebiasaan buruk terutama karena saya mentransfer beberapa hal dari bahasa sebelumnya. Javascript cukup fleksibel sehingga Anda bisa lolos dengan cukup banyak hal, tetapi jika saya ingin jslint memperingatkan saya tentang pola-pola tertentu, saya akan mengambil pola pengkodean yang lebih baik sejak awal daripada harus mempelajari kembali barang-barang nanti.
sumber
Analisis statis pada dasarnya adalah ulasan kode bantuan mesin. Mereka akan menunjukkan area yang dipertanyakan yang mungkin terlewatkan selama pengujian reguler.
Sebagai contoh, apakah penulis benar-benar bermaksud membuat tugas dalam persyaratan ini?
Atau mungkin seorang pemula membingungkan para pemain leksikal:
Tentu saja analisis statis memerlukan penyesuaian. Kemudian lagi, kontrol revisi, wiki, pelacak bug, printer cantik dan alat-alat lain juga memerlukan beberapa pengaturan. Semakin besar proyek, semakin baik hadiah untuk kerja awal.
sumber
Dari sudut pandang konsultan, setiap alat analisis statis akan memiliki beberapa kebisingan tetapi tidak semua alat analisis statis dibuat sama. Alat analisis statis seperti Coverity, Klocwork, Grammatech memiliki teknik analisis yang baik yang harus menghasilkan hasil yang lebih akurat. Jika Anda menyetel dan mengubah beberapa lagi, Anda akan mendapatkan hasil yang lebih baik biasanya (setelah semua, penganalisa statis harus dapat berjalan pada semua jenis kode yang berbeda dari perangkat medis kecil ke sistem operasi jaringan). Mendefinisikan "noise" juga tergantung pada kriteria Anda untuk apa yang merupakan laporan yang layak diperbaiki. Di satu sisi spektrum, beberapa pengembang menandai semua laporan yang tidak mereka perbaiki sebagai "false" (bahkan kode yang ditulis dengan buruk yang tidak sempat mereka perbaiki) dan di ujung lainnya,
Beberapa alat ini lebih fokus analisis pusat dan yang lain lebih fokus desktop - meskipun ketiganya memiliki fitur yang mendukung keduanya. Seperti yang disebutkan @Bob, mereka membutuhkan biaya.
sumber
Di perusahaan saya sebelumnya, kami telah menggunakan analisa statis oleh Parasoft. Dan diyakini dalam tim bahwa setidaknya 60% dari bug run time ditangkap sebelum kompilasi.
sumber
Analisis statis juga dapat dilakukan tanpa alat, dengan melakukan tinjauan manual pada kode perangkat lunak. Ini seringkali merupakan cara yang paling hemat biaya untuk meningkatkan kualitas kode.
Pilihan terbaik kedua adalah berinvestasi untuk satu atau lebih alat analisis statis kelas atas (seperti Coverity yang disebutkan sebelumnya, atau KLOCwork). Karena alat ini melakukan analisis yang jauh lebih dalam daripada serat, misalnya, rasio sinyal-ke-suara jauh lebih baik.
Saya menganggap menggunakan serat sebagai opsi ketiga, karena tingkat kebisingan yang tinggi. Menerapkan serat ke proyek yang ada bisa menjadi tugas yang menakutkan.
Secara umum analisis program statis telah banyak berkembang selama beberapa tahun terakhir. Alat analisis statis saat ini mampu melakukan analisis antar-prosedur yang mendalam, dan dapat secara otomatis mengidentifikasi misalnya prosedur pra dan pasca kondisi. Ini bisa sangat membantu untuk ulasan kode nanti.
sumber
Karena tingkat positif palsu yang tinggi, Anda tidak boleh menggunakan alat analisis statis (seperti serat atau FindBugs) untuk setiap kompilasi.
Sebaliknya, ini adalah pemeriksaan kewarasan yang bagus untuk berkonsultasi setelah Anda memiliki bug dan tidak bisa mengetahuinya . Dalam hal ini, Anda dapat menghibur positif palsu, dan Anda mungkin telah mempersempit sumber kesalahan yang mungkin terjadi. Misalnya, jika Anda mereproduksi bug Anda bahkan tanpa menjalankan beberapa modul, Anda dapat mengabaikan apa yang dikatakan FindBugs untuk mereka. Ini sangat membantu ketika Anda melihat sepotong kode dan berpikir itu mengatakan satu hal, sedangkan kompiler membacanya secara harfiah (seperti di Jawa ketika Anda memiliki
equals
metode yang mengambil jenis kelas bukanObject
).Anda juga dapat memiliki alat analisis statis menjadi bagian dari proses pengembangan Anda: Ketika seorang pengembang mendapat ulasan kode, mereka juga harus menjalankan FindBugs di atasnya. Singkatnya, ini berguna, tetapi Anda tidak akan menggunakannya sesering kompiler atau editor teks.
sumber