Proyek LLVM sedang mengembangkan alat untuk bekerja dengan buffer dengan aman di C++

Pengembang proyek LLVM telah mengusulkan sejumlah perubahan yang bertujuan untuk memperkuat keamanan proyek C++ yang sangat penting dan menyediakan sarana untuk menghilangkan kesalahan yang disebabkan oleh kelebihan buffer. Pekerjaan ini difokuskan pada dua bidang: menyediakan model pengembangan yang memungkinkan kerja aman dengan buffer, dan berupaya memperkuat keamanan pustaka fungsi standar libc++.

Model pemrograman aman yang diusulkan untuk C++ melibatkan penggunaan kelas yang disediakan oleh perpustakaan standar saat bekerja dengan buffer alih-alih memanipulasi pointer kosong. Misalnya, diusulkan untuk menggunakan kelas std::array, std::vector dan std::span, yang akan menambahkan pemeriksaan run-time untuk memori yang dialokasikan secara berlebihan.

Untuk memerangi praktik pemrograman berbahaya di clang, diusulkan untuk menampilkan peringatan kompiler untuk semua operasi aritmatika penunjuk, mirip dengan keluaran peringatan linter clang-tidy saat menggunakan tanda "cppcoreguidelines-pro-bounds-pointer-arithmetic", yang dukungannya akan muncul di rilis LLVM 16. Untuk mengaktifkan peringatan tersebut, tanda terpisah akan ditambahkan ke dentang, tidak aktif secara default.

Direncanakan untuk mengimplementasikan mode perlindungan opsional yang ditingkatkan di libc++, yang bila diaktifkan, akan menangkap beberapa situasi saat runtime yang mengarah pada perilaku tidak terdefinisi. Misalnya, di kelas std::span dan std::vector, akses memori di luar batas akan dipantau, dan jika terdeteksi, program akan crash. Pengembang percaya bahwa menambahkan perubahan tersebut akan menjaga libc++ tetap mematuhi standar C++, karena pilihan cara menangani kasus perilaku tidak terdefinisi ada di tangan pengembang perpustakaan, yang mungkin, antara lain, memperlakukan perilaku tidak terdefinisi sebagai kegagalan, sehingga memerlukan program untuk dihentikan.

Pemeriksaan runtime di libc++ rencananya akan dibagi ke dalam kategori yang dapat diaktifkan satu per satu. Beberapa pemeriksaan yang diusulkan, yang tidak menyebabkan kompleksitas operasi atau perubahan pada ABI, telah diterapkan dalam mode aman libc++.

Selain itu, direncanakan untuk menyiapkan alat untuk menyesuaikan kode, memungkinkan Anda mengganti variabel dengan pointer kosong dengan container dan menggunakan penangan alternatif dalam situasi di mana container tidak dapat langsung mengganti pointer (misalnya, konstruksi “if(array_pointer)” dapat diubah menjadi “if(span.data) ()"). Penyesuaian dapat diterapkan tidak hanya pada variabel lokal, tetapi juga pada parameter tipe pointer.

Sumber: opennet.ru

Tambah komentar