Bagaimana menghindari perangkap analisis statis

17

Saya bekerja di perusahaan yang mendapat skor 11 pada Tes Joel - setidaknya di atas kertas.

Dalam praktiknya, bagaimanapun, tidak ada yang bekerja sebaik yang diharapkan, dan proyek telah di DEFCON 1 selama setengah tahun. Sekarang, sebagian besar teman saya senang jika mereka bisa pulang pukul 6 sore - pada hari Minggu.

Salah satu praktik yang tampaknya baik yang menurut saya tidak berfungsi adalah penggunaan alat analisis statis. Proyek ini melacak gcc -Wall peringatan dan alat "C / C ++" milik dan sangat mahal .

Peringatan Gcc lebih sering menunjukkan bug nyata (jika sebagian besar tidak ofensif).

Namun, alat-alat yang dipatenkan mencantumkan hal-hal seperti gips implisit dan ukuran string literal. Para pemain implisit juga masuk daftar hitam di stylebook mereka.

Praktik standar adalah bahwa orang ditekan untuk membuat setiap peringatan diam. Perhatikan bahwa ini mengecualikan peringatan yang sebagian besar positif palsu, ini bukan masalahnya.

Hasilnya adalah:

  1. Orang menambahkan tipe gips ke setiap nilai dan setiap argumen menyembunyikan ketidakcocokan tipe nyata yang bermasalah dalam proses.
  2. Orang-orang diperkenalkan oleh satu bug, atau menggunakan fitur bahasa bermasalah yang berbeda. (Strlen bukannya sizeof, strncpy, bukan strcpy, dll.)
  3. Peringatan dibungkam.
  4. Laporan bug mulai bergulir.

Poin utama adalah kode asli berfungsi dan ditulis oleh orang-orang yang bermain aman dalam kemampuan bahasa mereka sedangkan perbaikannya tidak.

Sekarang, saya tidak berpikir perusahaan ini bisa diselamatkan. Namun, saya ingin tahu apakah ada cara yang lebih baik, lebih baik bekerja, untuk menggunakan alat "pro" atau jika saya harus menghindari menggunakannya bersama-sama jika saya yang membuat keputusan di masa depan.

Sebuah solusi yang tidak menganggap semua programmer adalah genius yang tidak bisa berbuat salah. Karena yah, jika memang demikian, maka tidak perlu menggunakan alat di tempat pertama.


sumber
1
Catatan samping: GCC selain «-Wall» juga memiliki opsi «-Wextra», dan bahkan lebih banyak peringatan yang tidak termasuk untuk beberapa alasan di kedua metaoptions. Lihat dokumen untuk informasi lebih lanjut. Secara umum setiap opsi ada disebutkan jika diaktifkan oleh metaoption. Jadi untuk menemukan semua yang tidak diaktifkan, Anda mungkin ingin menyorot seluruh dokumen baik kata «-Dinding» dan «-Wextra», dan Anda akan melihat yang belum digunakan.
Hi-Angel
Saya juga menambahkan bahwa saya ingin tahu bahwa GCC tidak memasukkan banyak «-Wextra» ke dalam «-Wall». Percayalah, beberapa bendera ini sangat berguna ; setidaknya peringatan ini membebaskan saya dari satu jam debug.
Hi-Angel
1
Saya terkejut tidak ada yang menyebutkan ulasan kode dalam jawaban. Bagi saya, orang yang mencoba menyelinap di beberapa hacks jelek akan diblokir oleh ulasan kode ...
dyesdyes

Jawaban:

16

Dalam praktiknya, bagaimanapun, tidak ada yang bekerja sebaik yang diharapkan, dan proyek ini telah di DEFCON 1 selama setengah tahun. Sekarang, sebagian besar teman saya senang jika mereka bisa pulang pukul 6 sore - pada hari Minggu.

Ini tentu saja merupakan bagian dari masalah Anda. Seorang insinyur perangkat lunak tidak dapat bekerja secara produktif selama lebih dari 40 jam / minggu. Jika Anda melangkah lebih dari itu, Anda benar-benar merusak kapasitas Anda untuk bekerja - pada titik di mana bahkan bekerja 80 jam / minggu hanya memberikan sedikit nilai bagi proyek, dan kadang-kadang, proyek bahkan dapat mengalami kemunduran karena tim lebih banyak membuat kesalahan daripada tim. mereka dapat memperbaikinya. Jika Anda telah melakukan 60 jam / minggu atau lebih selama setengah tahun, maka seluruh tim Anda membutuhkan istirahat panjang yang baik, dan kembali pada 40 jam / minggu. Anda tidak dapat menyelesaikan apa pun dengan tenaga kerja yang hampir tidak mampu menghantam keyboard karena mereka terlalu banyak bekerja.

Namun, alat-alat yang dipatenkan mencantumkan hal-hal seperti gips implisit dan ukuran string literal. Para pemain implisit juga masuk daftar hitam di stylebook mereka.

Anda benar-benar perlu hanya menjatuhkan alat secara keseluruhan, atau mengkonfigurasi ulang / menggantinya. Peringatan pada setiap pemeran implisit jauh terlalu banyak untuk dihadapi siapa pun.

DeadMG
sumber
Bisakah Anda memberikan referensi untuk penelitian tentang batasan 40 jam seminggu?
11
di sini dan di sini , hanya untuk pemula. Sangat terdokumentasi dengan baik bahwa Anda tidak dapat melakukan lebih dari 40 jam seminggu pekerjaan produktif. Google sederhana akan menemukan Anda rim artikel.
DeadMG
5
Dua koreksi penting kecil, tetapi IMHO: batas 40 jam / minggu adalah nilai rata-rata perkiraan, dan aturan hanya berlaku untuk periode waktu yang lama. Tidak apa-apa bagi tim untuk memasukkan jam ekstra sebelum tenggat waktu yang penting, kemudian pulih sesudahnya (bahkan mungkin mengambil cuti beberapa hari). Juga, batas bervariasi antara orang dan dari waktu ke waktu - beberapa dapat bekerja 43 jam per minggu tanpa masalah, yang lain hanya 35, dan satu lebih produktif pada beberapa minggu daripada yang lain. Namun, menempatkan lembur yang signifikan selama lebih dari beberapa minggu berturut-turut memang akan menyebabkan masalah serius.
Péter Török
13

Saya bekerja di perusahaan yang mendapat skor 11 pada Tes Joel - setidaknya di atas kertas.

Tes itu hanya sedikit relevan dengan perusahaan perangkat lunak. Saya tidak mengerti hype tentang hal itu. Anda dapat skor 12 dan masih memiliki 100% programer omong kosong. Orang lebih penting daripada alat.

Namun, alat-alat yang dipatenkan mencantumkan hal-hal seperti gips implisit dan ukuran string literal. Para pemain implisit juga masuk daftar hitam di stylebook mereka. Praktik standar adalah bahwa orang ditekan untuk membuat setiap peringatan diam. Perhatikan bahwa ini mengecualikan peringatan yang sebagian besar positif palsu, ini bukan masalahnya.

Ini adalah masalah terbesar dengan semua analisa statis: terlalu banyak positif palsu. Satu- satunya cara untuk menangani hal ini adalah dengan mempelajari secara terperinci mengapa alat itu ditetapkan untuk memberikan peringatan untuk masalah tertentu. Hanya dengan begitu Anda dapat membuat asumsi yang memenuhi syarat apakah peringatan itu salah atau tidak.

Untuk pemeran spesifik dari typecasts implisit, itu ada karena beberapa bug yang sangat umum, halus dan berbahaya dalam bahasa C, disebabkan oleh dua aturan promosi tipe implisit (moronik) dalam C. Mereka secara resmi dikenal sebagai aturan promosi integer dan konversi aritmatika yang biasa . Saya pikir kurang dari satu dari sepuluh pemrogram C profesional dapat menjelaskan apa yang dua aturan ini lakukan, dan apa yang tidak mereka lakukan. Namun aturan ini sangat mendasar dan diterapkan ribuan kali di antara baris dalam program C normal.

Standar MISRA-C mengabdikan seluruh bab untuk menjelaskan aturan konversi implisit berbahaya ini, dan kemudian mereka menambahkan banyak aturan yang cukup rumit untuk bagaimana menghindari bug yang disebabkan oleh konversi implisit. Ini memiliki beberapa dampak pada semua analisa statis di pasar.

Saya akan merekomendasikan programmer C untuk membaca bab MISRA-C itu, atau setidaknya Google dua aturan promosi yang saya sebutkan dan membaca sebanyak mungkin tentang mereka. Anda hanya bisa mengabaikan penganalisa statis ketika Anda tahu semua yang perlu diketahui tentang aturan ini.

Sekarang, saya tidak berpikir perusahaan ini bisa diselamatkan. Namun, saya ingin tahu apakah ada cara yang lebih baik, lebih baik bekerja, untuk menggunakan alat "pro" atau jika saya harus menghindari menggunakannya bersama-sama jika saya yang membuat keputusan di masa depan.

Sebuah solusi yang tidak menganggap semua programmer adalah genius yang tidak bisa berbuat salah. Karena yah, jika memang demikian, maka tidak perlu menggunakan alat di tempat pertama.

Tidak ada cara mudah untuk mengelilinginya. Masalah sebenarnya sebenarnya bukan alat, tetapi bahasa C yang tidak jelas. Ini mungkin terlihat sebagai bahasa yang mudah pada pandangan singkat, tetapi ada banyak mekanisme tidak logis dan aneh yang terjadi di antara keduanya. Dan ada juga ratusan kasus perilaku yang tidak ditentukan / tidak spesifik / impl.spesifik dalam bahasa. Sebagian besar dari mereka harus Anda pelajari dan hindari.

Jadi, Anda harus menjadi programmer C veteran yang memahami semua peringatan yang tidak jelas ini, atau Anda harus berada dalam tim dengan setidaknya satu orang seperti itu. Perusahaan yang hanya merekrut sekelompok programmer junior tanpa veteran dalam timnya tidak boleh menggunakan alat ini, juga tidak boleh bekerja dengan pengembangan perangkat lunak integritas tinggi.


sumber
Saya mengikuti tes dengan sejumput garam dari awal, tetapi itu bukan alat untuk menguji programmer tetapi alat untuk menguji pengusaha. Saya kira Anda dapat memasukkan rekan kerja yang tepat sebagai "alat terbaik yang dapat dibayar dengan uang". Dan saya mengambil jawaban Anda untuk membuang alat SA, dan merekrut dan / atau melatih dengan lebih baik. Poin yang pertama tampaknya menjadi persamaan umum.
@ qpr Ini juga tidak menguji majikan, hanya kesediaan majikan untuk mengeluarkan uang untuk pengembangan perangkat lunak. Hal-hal seperti prosedur rekrutmen, tujuan perusahaan, pengetahuan pasar, dll. Tidak disebutkan. Saya pikir sebagian besar perusahaan "IT bubble" akan mendapat skor 12 pada tes itu, dengan manajemen yang bahkan tidak tahu produk apa yang sedang dikembangkan atau jika ada pasar untuk mereka sama sekali.
4

Tidak jelas apakah Anda bertanya bagaimana cara memperbaiki masalah, atau bagaimana Anda bisa menghindarinya sejak awal. Saya mengasumsikan yang terakhir.

Sepertinya Anda mengandalkan analisis statis sebagai alat utama untuk mendeteksi dan menghindari bug. Mungkin Anda akan lebih baik memfokuskan lebih banyak pada tes unit, dan alat-alat dinamis ... seperti memory checker.

Adalah ide yang buruk untuk mengandalkan alat yang menghasilkan banyak positif palsu, terutama jika Anda tidak bisa menekan positif palsu itu. Ini mendorong programmer yang lelah / terlalu banyak bekerja (atau malas) untuk membuat "perbaikan" untuk membuat peringatan hilang. Jika Anda tidak dapat secara selektif menekan positif palsu (misalnya dengan komentar) atau menyesuaikan aturan, maka Anda memerlukan alat yang lebih baik. Atau setidaknya, Anda hanya harus menggunakannya dengan hemat.

Sepertinya Anda memiliki masalah dengan orang yang ceroboh dan / atau membuat kesalahan karena terlalu banyak bekerja. Mungkin Anda harus menghabiskan lebih banyak waktu / upaya dalam ulasan kode. Ini secara langsung membahas pengamatan Anda bahwa programmer bukanlah genius.

Akhirnya, sepertinya Anda menderita di bawah tenggat waktu yang tidak realistis, orang miskin mencari sumber daya dan / atau mengubah persyaratan. Ini adalah masalah manajemen, dan harus diatasi pada tingkat itu ... atau ada risiko kegagalan proyek yang meningkat secara signifikan, dan kerusakan jangka panjang pada produktivitas dan moral staf.

Stephen C
sumber
3

Selain jawaban yang sangat bagus dari user29079, saya ingin menambahkan satu lagi kekurangan bahasa C yang menambah masalah. Saya tidak menyadari kekurangan ini sampai saya pindah ke Jawa.

Tujuan dari suatu peringatan adalah untuk menarik perhatian penulis dan pembaca kode tentang fakta bahwa ada sesuatu yang mencurigakan sedang terjadi. Itu, sebagai sebuah konsep, baik-baik saja: semakin banyak peringatan yang Anda aktifkan, semakin banyak hal mencurigakan yang Anda temukan.

Apa yang salah , adalah gagasan bahwa setiap benda mencurigakan harus diperbaiki dengan cara apa pun, dengan mengubah kode . Itulah yang menyebabkan masalah yang digambarkan OP: upaya yang gagal untuk segera membuat peringatan hilang dengan mengubah kode yang berfungsi dengan baik.

Pada saat yang sama, kami tidak ingin kode kami memuntahkan ratusan peringatan setiap kali kami kompilasi, karena segera peringatan menjadi tidak berarti, dan tidak ada yang memperhatikan peringatan baru lagi.

Jadi, ini tampaknya merupakan kasus tujuan yang saling bertentangan; sebuah kontradiksi.

Solusi yang sangat baik untuk masalah yang tampaknya mustahil ini adalah untuk dapat secara selektif menekan peringatan tertentu berdasarkan pernyataan demi pernyataan, sehingga kita dapat menekannya tepat di mana kita ingin menunjukkan bahwa kita benar-benar tahu apa yang kita lakukan, tanpa harus mengubah kode apa pun.

Java memiliki solusi yang bagus untuk ini, dengan @SuppressWarnings( "" )anotasi. Jika Anda membuat, katakanlah, apa yang disebut konversi yang tidak dicentang di java, kompiler mengeluarkan peringatan untuk menarik perhatian Anda, Anda memeriksanya, Anda menentukan bahwa ini adalah satu lagi kasus di mana Anda tahu apa yang Anda lakukan, jadi Anda mendahului pernyataan yang menyinggung dengan @SuppressWarnings( "unchecked" )anotasi yang hanya memengaruhi pernyataan yang segera mengikutinya, dan Anda melanjutkan hidup Anda.

Jadi, peringatan hilang, kode tetap tidak berubah, dan anotasi penindasan berdiri di sana, diwarnai hijau dengan penyorotan sintaks, untuk mendokumentasikan fakta bahwa konversi yang rapuh sedang terjadi, tetapi janji penulis bagus. (*) Semua orang bahagia.

Di java, Anda bahkan dapat awalan parameter individual ke fungsi @SuppressWarnings(), sehingga menonaktifkan peringatan khusus yang mungkin dikeluarkan pada parameter tertentu saja.

Namun, sejauh yang saya tahu, C tidak pernah mendukung mekanisme standar untuk secara selektif menekan peringatan pada pernyataan, dan kompiler tertentu yang menerapkan mekanisme kepemilikan mereka sendiri melakukannya dengan cara yang cerdas, misalnya #pragma warning (nnn:N)arahan dari Microsoft C. Masalah dengan arahan ini adalah bahwa Anda memerlukan dua jalur arahan untuk menekan peringatan untuk satu pernyataan dan membiarkan peringatan itu diaktifkan untuk pernyataan berikutnya. Oleh karena itu, programmer C sangat tidak mungkin untuk mengambil kebiasaan menekan peringatan atas dasar pernyataan individu, bahkan ketika mereka tahu bahwa peringatan khusus ini pada pernyataan khusus ini baik-baik saja.


(*) seseorang mungkin berpendapat bahwa jika Anda mengizinkan ini, maka setiap programmer di rumah akan menekan peringatan tanpa memikirkannya; jawaban untuk ini adalah bahwa Anda dapat melakukan apa saja untuk membantu programmer melakukan pekerjaan mereka dengan lebih baik, tetapi tidak ada yang dapat Anda lakukan jika mereka secara aktif memutuskan untuk menyabot Anda.

Mike Nakis
sumber
Dengan kata lain, sementara mengubah sumber untuk menghapus setiap peringatan terakhir adalah kunci untuk praktik yang baik, mengubah kode yang dapat dikompilasi tidak, karena menghilangkan kode langsung yang hanya benar tanpa alasan yang baik. Perbedaan yang bagus.
Nathan Tuggy
2

Saya akan mengatakan (tanpa mengetahui perinciannya) bahwa perusahaan Anda telah membuat kesalahan yang lebih signifikan dan ini hanyalah gejalanya: ia gagal menentukan dengan tepat domain perangkat lunak yang dihasilkan, mengelola tim dengan benar, dan menentukan tujuan yang masuk akal.

Jika perangkat lunak yang ditulis oleh tim Anda adalah sesuatu yang penting yang menjadi sandaran kehidupan manusia, alat analisis statis itu penting dan bermanfaat. Karena "biaya" bug, yang diukur dalam uang (mengabaikan betapa sinisnya itu) tinggi, ada alat khusus yang diperlukan untuk pekerjaan itu. Ada pedoman untuk C dan C ++ untuk menggunakan fitur bahasa dengan aman (baca apa yang harus dihindari dan seberapa jauh untuk menghindarinya).
Namun, dalam situasi seperti itu membuat karyawan bekerja pada hari Minggu adalah ide yang sangat buruk, apalagi dari konteks yang Anda berikan, saya memperkirakan bahwa pekerjaan yang ceroboh tidak jarang terjadi. Jadi jika ini masalahnya, masalahnya sangat sangatbesar, dan manajemen Anda mencoba menyelesaikannya dengan menggunakan alat yang "lebih baik". Sayangnya, itu bukan cara kerja. Jika saya bahkan hampir benar, saya akan menyarankan Anda mulai mencari pekerjaan yang berbeda. Perangkat lunak mission-critical yang dilakukan dengan buruk adalah sesuatu yang dapat menghantui Anda dan merusak reputasi profesional Anda, belum lagi prospek gugatan.

Jika, di sisi lain, tim Anda menulis sesuatu yang jauh lebih tidak kritis, alat 'analisis statis' dengan tingkat false-positive yang tinggi hanya akan memperlambat Anda, dan, seperti yang telah Anda catat, orang biasanya bereaksi terhadap hal ini dengan menemukan maksimum lokal dalam efektivitas mereka, dalam hal ini hanya dengan menipu jalan mereka di sekitar peringatan, daripada mencoba untuk memperbaiki alasan yang mendasarinya. Jadi dalam situasi Anda, menggunakan alat-alat ini sebenarnya dapat menurunkan kualitas kode sumber, dan umumnya harus dihindari.

Jika Anda perlu mengelola tim perangkat lunak yang menulis beberapa kode C atau C ++, pertama-tama saya akan menentukan apa tujuan proyek utama. Jika menulis kode bebas bug sangat penting (misalnya, aplikasi sosial super mengagumkan baru untuk iOS dan Android tidak cocok untuk ini), maka gunakan analisis statis, bahkan mungkin sejauh spesifikasi formal dan verifikasi formal. Tetapi jika ini masalahnya, memilih programmer yang baik dan membiarkan mereka bekerja di lingkungan yang waras dengan beban kerja yang memadai dan tepat 40 jam per minggu jauh lebih penting.

Orang tidak dapat bekerja secara bertanggung jawab jika mereka diperlakukan seperti budak (dan seseorang yang menghabiskan liburan saya persis seperti ini) dan programmer yang baik hanya akan menolak untuk melakukan ini secara teratur, kecuali mereka tidak tahu yang lebih baik (dan jika mereka baik, kemungkinannya adalah mereka melakukannya).

Poin bawah: Gambar tujuan Anda, lalu tentukan alat dan proses yang Anda gunakan, jangan biarkan alat yang tersedia menentukan proses (ergo tujuan) karena manajemen (buruk) mungkin ingin memaksa Anda.

K.Steff
sumber
1

Seperti yang dinyatakan dalam jawaban k.steff, alat analisis statis untuk 'C' berguna jika Anda membangun perangkat lunak dalam situasi kritis (perangkat lunak pesawat) dan harus digunakan sejak hari pertama (tidak setelah berbulan-bulan pengembangan ketika bug yang tidak dapat direproduksi terjadi. ).

Menggunakan alat-alat semacam ini di akhir proses pengembangan biasanya merupakan tanda pilihan desain yang buruk di awal proses.

Dalam perangkat lunak yang tidak kritis, alat-alat semacam ini berguna untuk:
-menyiapkan manajemen, membuat mereka merasa berguna (kami telah melakukan sesuatu, kami telah menghabiskan banyak uang untuk memperbaiki perangkat lunak). Ini memberi mereka tindakan yang mudah dipenuhi dalam laporan powerpoint mereka).
-Jaga sibuk pengembang 'beracun'. Biarkan mereka mengkonfigurasi alat dan menganalisis hasil alat, sehingga Anda dapat memiliki waktu untuk memperbaiki bug jahat mereka.
-lakukan aturan pengkodean. Dalam hal ini harus digunakan sejak hari pertama. Tetapi alat peninjau kode yang baik mungkin merupakan pilihan yang lebih baik.

Jadi pendapat saya adalah Anda harus menghindari alat-alat mahal dan memakan waktu seperti ini atau menggunakannya untuk menyibukkan orang-orang 'beracun'.

FrenchKiss Dev
sumber
1

Saya bekerja di perusahaan yang mendapat skor 11 pada Tes Joel - setidaknya di atas kertas.

Validasi oleh Joel Test bukan merupakan ukuran praktik yang baik; Validasi oleh Joel Test adalah ukuran praktik buruk / hilang. Dengan kata lain, itu bisa dipandang perlu, tetapi tidak cukup.

Sekarang, sebagian besar teman saya senang jika mereka bisa pulang pukul 6 sore - pada hari Minggu.

Sepertinya Anda memiliki masalah manajemen. Kerja lembur sistematis bukanlah solusi untuk menyelesaikan sesuatu; jika ada, itu adalah solusi untuk membuat hal-hal terlihat seperti mereka bekerja dan mengakumulasi hutang teknis.

Sekarang, saya tidak berpikir perusahaan ini bisa diselamatkan. Namun, saya ingin tahu apakah ada cara yang lebih baik, lebih baik bekerja, untuk menggunakan alat "pro" atau jika saya harus menghindari menggunakannya bersama-sama jika saya yang membuat keputusan di masa depan.

Ya, ada cara untuk menggunakan analisis kode statis secara waras.

Mereka bisa, dan biasanya memberikan banyak nilai. Anda hanya perlu mengingat bahwa, (seperti peringatan kompiler) alat analisis statis dapat (paling banyak) memberikan petunjuk tentang sesuatu yang salah - bukan laporan bug, dan tidak ada kepastian apapun.

Sepertinya pembuat keputusan Anda mengacaukan bendera analisis statis dengan cacat aplikasi.

Para pemain implisit juga masuk daftar hitam di stylebook mereka.

Ini kedengarannya seperti masalah kompetensi manajemen, bukan masalah analisis statis.

Hasilnya adalah:

Orang menambahkan tipe gips ke setiap nilai dan setiap argumen menyembunyikan ketidakcocokan tipe nyata yang bermasalah dalam proses.

Orang-orang diperkenalkan oleh satu bug, atau menggunakan fitur bahasa bermasalah yang berbeda. (Strlen bukannya sizeof, strncpy, bukan strcpy, dll.)

Peringatan dibungkam.

Laporan bug mulai bergulir.

Semua ini adalah cara untuk membuat laporan berkala terlihat bagus, bukan cara untuk memperbaiki masalah dalam kode (sepertinya Anda memiliki masalah kompetensi manajemen, lagi).

utnapistim
sumber