Analisis statis akan meningkatkan basis kode proyek C ++ yang kompleks

Proyek besar lama

Secara bertahap dan tidak mencolok, sebuah situasi berkembang ketika kompleksitas proyek C ++ yang serius menjadi penghalang. Sayangnya, sekarang seorang programmer C ++ tidak bisa hanya mengandalkan kekuatannya sendiri.

Pertama, ada begitu banyak kode sehingga situasi menjadi tidak mungkin ketika ada setidaknya beberapa programmer dalam proyek yang mengetahui keseluruhan proyek. Sebagai contoh, kernel Linux 1.0.0 berisi sekitar 176 ribu baris kode. Ini banyak, tetapi dimungkinkan untuk menempatkan mesin kopi di dekatnya dan dalam beberapa minggu lebih atau kurang melihat seluruh kode dan memahami prinsip-prinsip umum operasinya. Jika kita menggunakan kernel Linux 5.0.0, maka ukuran basis kode sudah sekitar 26 juta baris kode. Kode kernel telah tumbuh hampir 150 kali. Anda hanya dapat memilih beberapa bagian dari proyek dan mengambil bagian dalam pengembangannya. Tidak mungkin untuk duduk dan mencari tahu bagaimana tepatnya ini semua bekerja, apa hubungan antara berbagai bagian kode.

Kedua, bahasa C ++ terus berkembang dengan cepat. Di satu sisi, ini bagus, karena ada konstruksi yang memungkinkan Anda untuk menulis kode yang lebih ringkas dan aman. Di sisi lain, karena kompatibilitas ke belakang, proyek-proyek besar yang lama menjadi heterogen. Mereka menjalin pendekatan lama dan baru untuk menulis kode. Analogi dengan cincin di bagian pohon memohon. Karena itu, setiap tahun membenamkan diri dalam proyek yang ditulis dalam C ++ menjadi semakin sulit. Penting untuk memahami kode pada saat yang sama, baik ditulis dalam gaya C dengan kelas, dan dalam pendekatan modern (lambda, semantik gerakan, dll.). Butuh terlalu banyak waktu untuk sepenuhnya belajar C ++. Tetapi karena masih diperlukan untuk mengembangkan proyek, orang mulai menulis kode dalam C ++ tanpa mempelajari semua nuansanya sampai akhir. Ini mengarah ke cacat tambahan, tetapi itu tidak rasional karena ini berhenti dan menunggu semua pengembang menjadi sangat akrab dengan C ++.

Apakah situasinya tidak ada harapan? Tidak. Kelas baru alat datang untuk menyelamatkan: analisa kode statis. Banyak programmer berpengalaman saat ini melengkungkan bibir mereka, seolah-olah mereka menyelipkan lemon :). Seperti, kami tahu ini linter Anda ... Ada banyak pesan, sedikit akal ... Ya, dan apa alat kelas baru ini ?! Kami meluncurkan 20 tahun yang lalu.

Namun demikian, saya berani mengklaim bahwa ini adalah alat kelas baru. Apa yang terjadi 10-20 tahun yang lalu sama sekali bukan alat yang sekarang disebut analisis statis. Pertama, saya tidak berbicara tentang alat yang berorientasi pada pemformatan kode. Mereka juga berhubungan dengan alat analisis statis, tetapi sekarang kita berbicara tentang mengidentifikasi kesalahan dalam kode. Kedua, alat modern menggunakan teknologi analisis canggih, dengan mempertimbangkan interkoneksi antara fungsi yang berbeda dan benar-benar menjalankan bagian kode tertentu. Ini bukan linter 20 tahun yang sama yang dibangun di atas ekspresi reguler. Omong-omong, penganalisa statis normal tidak dapat dilakukan pada ekspresi reguler sama sekali. Untuk menemukan kesalahan, teknologi seperti analisis aliran data, anotasi metode otomatis, eksekusi simbolik, dan sebagainya digunakan.

Ini bukan kata-kata abstrak, tetapi kenyataan yang saya amati sebagai salah satu pencipta alat PVS-Studio. Periksa artikel ini untuk melihat mengapa penganalisa dapat menemukan kesalahan yang menarik.

Namun, jauh lebih penting bahwa analis statis modern memiliki pengetahuan luas tentang pola kesalahan. Selain itu, penganalisa tahu lebih dari pengembang profesional sekalipun. Menjadi terlalu sulit untuk memperhitungkan dan mengingat semua nuansa ketika menulis kode. Misalnya, kecuali jika Anda secara khusus membacanya di suatu tempat, Anda tidak akan pernah menebak bahwa panggilan ke fungsi memset untuk menghapus data pribadi kadang-kadang hilang, karena dari sudut pandang kompiler, panggilan ke fungsi memset adalah berlebihan. Sementara itu, ini adalah kelemahan keamanan serius CWE-14 , yang ditemukan secara harfiah di mana-mana . Atau siapa, misalnya, yang tahu apa yang berbahaya dalam mengisi wadah seperti itu?

std::vector<std::unique_ptr<MyType>> v; v.emplace_back(new MyType(123)); 

Saya pikir tidak semua orang akan segera menyadari bahwa kode seperti itu berpotensi berbahaya dan dapat menyebabkan kebocoran memori.

Selain pengetahuan yang luas tentang pola, penganalisa statis sangat memperhatikan dan tidak pernah lelah. Misalnya, tidak seperti seseorang, mereka tidak terlalu malas untuk melihat file header untuk memastikan bahwa ruang dan sprintf adalah fungsi nyata, dan bukan makro gila yang merusak segalanya. Kasus-kasus seperti itu menunjukkan esensi dari kesulitan menemukan kesalahan dalam proyek besar: sesuatu berubah di satu tempat, tetapi pecah di tempat lain.

Saya yakin bahwa analisis statis segera akan menjadi bagian integral dari DevOps - itu akan menjadi alami dan perlu seperti penggunaan sistem kontrol versi. Ini sudah terjadi secara bertahap di konferensi yang ditujukan untuk proses pengembangan, di mana analisis statis semakin disebutkan sebagai salah satu garis pertahanan pertama untuk memerangi serangga.

Analisis statis berfungsi sebagai semacam filter kasar. Tidak efisien untuk mencari kesalahan dan kesalahan ketik yang bodoh menggunakan tes unit atau pengujian manual. Jauh lebih cepat dan lebih murah untuk memperbaikinya segera setelah menulis kode, menggunakan analisis statis untuk mendeteksi masalah. Gagasan ini, serta pentingnya penggunaan rutin penganalisis, dijelaskan dengan baik dalam artikel " Masukkan analisis statis ke dalam proses, dan jangan mencari bug dengan itu ".

Seseorang mungkin mengatakan bahwa tidak ada gunanya alat khusus, karena kompiler juga belajar untuk melakukan pemeriksaan statis. Ya itu. Namun, penganalisa statis secara alami tidak diam dan bagaimana alat khusus mengungguli kompiler. Misalnya, setiap kali kami memeriksa LLVM, kami menemukan kesalahan di sana menggunakan PVS-Studio.

Dunia menawarkan sejumlah besar alat untuk analisis kode statis. Seperti yang mereka katakan, pilihlah sesuai selera Anda. Ingin menemukan banyak kesalahan dan kerentanan potensial bahkan pada tahap penulisan kode? Gunakan penganalisa kode statis dan tingkatkan kualitas basis kode Anda!



Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ini: Andrey Karpov. Mengapa Analisis Statis Dapat Meningkatkan Kompleks Kode C ++

Source: https://habr.com/ru/post/id462399/


All Articles