Dalam C dan C ++, sangat mudah untuk menulis kode berikut dengan kesalahan serius.
char responseChar = getchar();
int confirmExit = 'y' == tolower(responseChar);
if (confirmExit = 1)
{
exit(0);
}
Kesalahannya adalah bahwa pernyataan if seharusnya:
if (confirmExit == 1)
Sebagai kode, itu akan keluar setiap waktu, karena penugasan confirmExit
variabel terjadi, kemudian confirmExit
digunakan sebagai hasil dari ekspresi.
Adakah cara yang baik untuk mencegah kesalahan semacam ini?
c++
coding-standards
Pengembang Don
sumber
sumber
if (confirmExit)
.a = b
ataua == b
di dalam suatu kondisi.Jawaban:
Teknik terbaik adalah meningkatkan tingkat peringatan kompiler Anda. Ini kemudian akan memperingatkan Anda tentang penugasan potensial dalam kondisi jika.
Pastikan Anda mengkompilasi kode Anda dengan nol peringatan (yang seharusnya Anda lakukan). Jika Anda ingin menjadi jagoan maka atur kompiler Anda untuk memperlakukan peringatan sebagai kesalahan.
Menggunakan kondisi Yoda (meletakkan konstanta di sisi kiri) adalah teknik lain yang populer sekitar satu dekade lalu. Tetapi mereka membuat kode lebih sulit untuk dibaca (dan dengan demikian mempertahankan karena cara mereka membaca tidak wajar (kecuali Anda Yoda)) dan tidak memberikan manfaat lebih besar daripada meningkatkan tingkat peringatan (yang juga memiliki manfaat tambahan dari lebih banyak peringatan).
Peringatan adalah kesalahan yang benar-benar logis dalam kode dan harus diperbaiki.
sumber
if (0 == ret)
kengerian.a == b
!!0==a && 0==b || 1==a && 1==b || 2==a && 2==b || ...
(ulangi untuk semua nilai yang mungkin). Jangan lupa...|| 22==a && 22==b || 23==a && 24==b || 25==a && 25==b ||
kesalahan wajib ..., atau programmer pemeliharaan tidak akan bersenang-senang.Anda selalu dapat melakukan sesuatu yang radikal seperti menguji perangkat lunak Anda. Saya bahkan tidak bermaksud pengujian unit otomatis, hanya tes yang dilakukan oleh setiap pengembang yang berpengalaman karena menjalankan kode barunya dua kali, sekali mengkonfirmasikan pintu keluar dan sekali tidak. Itulah alasan sebagian besar programmer menganggapnya sebagai tidak masalah.
sumber
rc=MethodThatRarelyFails(); if(rc = SUCCESS){
lebih dari satu kali, terutama jika metode ini gagal hanya dalam kondisi yang sulit untuk diuji.Cara tradisional untuk mencegah penggunaan tugas yang salah dalam ekspresi adalah dengan meletakkan konstanta di sebelah kiri dan variabel di sebelah kanan.
Kompiler akan melaporkan kesalahan untuk penugasan ilegal ke konstanta yang mirip dengan yang berikut ini.
Revisi jika kondisinya adalah:
Seperti yang ditunjukkan oleh komentar di bawah, ini dianggap oleh banyak orang sebagai metode yang tidak pantas.
sumber
Saya setuju dengan semua orang yang mengatakan "peringatan kompiler" tetapi saya ingin menambahkan teknik lain: Ulasan kode. Jika Anda memiliki kebijakan untuk meninjau semua kode yang dikomit, lebih disukai sebelum dikomit, maka kemungkinan hal semacam ini akan ditangkap selama peninjauan.
sumber
Pertama, menaikkan level peringatan Anda tidak pernah sakit.
Jika Anda tidak ingin persyaratan Anda untuk menguji hasil penugasan dalam pernyataan if itu sendiri, maka setelah bekerja dengan banyak programmer C dan C ++ selama bertahun-tahun, dan tidak pernah mendengar bahwa membandingkan konstanta pertama
if(1 == val)
adalah hal yang buruk, Anda bisa mencoba konstruk itu.Jika pemimpin proyek Anda menyetujui Anda melakukan ini, jangan khawatir tentang apa yang dipikirkan orang lain. Bukti nyata adalah apakah Anda atau orang lain dapat memahami kode Anda berbulan-bulan dan bertahun-tahun dari sekarang.
Namun, jika Anda bermaksud menguji hasil dari suatu tugas, maka menggunakan peringatan yang lebih tinggi mungkin [mungkin akan] menangkap tugas tersebut menjadi konstan.
sumber
if ( auto myPtr = dynamic_cast<some_ptr>(testPtr) ) {
karena menghindari menjaga ruangnullptr
lingkup yang tidak berguna jika para pemain gagal - yang mungkin alasan C ++ memiliki kemampuan terbatas ini untuk menetapkan dalam kondisi. Untuk selebihnya, ya, sebuah definisi harus mendapatkan garisnya sendiri, saya katakan - jauh lebih mudah untuk dilihat sekilas dan kurang rentan terhadap berbagai macam slip-of-the-mind.Terlambat ke pesta seperti biasanya, tetapi Analisis Kode Statis adalah kuncinya di sini
Sebagian besar IDE sekarang menyediakan SCA melebihi dan di atas pemeriksaan sintaksis dari kompiler, dan alat-alat lain tersedia, termasuk yang mengimplementasikan pedoman MISRA (*) dan / atau CERT-C.
Deklarasi: Saya bagian dari kelompok kerja MISRA C, tetapi saya memposting dalam kapasitas pribadi. Saya juga independen dari vendor alat apa pun
sumber
Cukup gunakan tugas sebelah kiri, peringatan kompiler dapat membantu tetapi Anda harus memastikan Anda mendapatkan tingkat yang tepat jika tidak, Anda akan dibanjiri dengan peringatan tidak berguna atau tidak akan diberitahu yang ingin Anda lihat.
sumber