Projek LLVM sedang membangunkan alat untuk bekerja dengan penimbal dengan selamat dalam C++

Pembangun projek LLVM telah mencadangkan beberapa perubahan yang bertujuan untuk mengukuhkan keselamatan projek C++ yang kritikal misi dan menyediakan cara untuk menghapuskan ralat yang disebabkan oleh lebihan penimbal. Kerja ini tertumpu pada dua bidang: menyediakan model pembangunan yang membolehkan kerja selamat dengan penimbal dan berusaha untuk mengeraskan perpustakaan fungsi standard libc++.

Model pengaturcaraan selamat yang dicadangkan untuk C++ melibatkan penggunaan kelas yang disediakan oleh perpustakaan standard apabila bekerja dengan penimbal dan bukannya memanipulasi penunjuk kosong. Sebagai contoh, adalah dicadangkan untuk menggunakan kelas std::array, std::vector dan std::span, yang akan menambah semakan masa jalan untuk memori yang terlalu diperuntukkan.

Untuk memerangi amalan pengaturcaraan berbahaya dalam denting, adalah dicadangkan untuk memaparkan amaran pengkompil untuk semua operasi aritmetik penunjuk, serupa dengan keluaran amaran linter denting kemas apabila menggunakan bendera "cppcoreguidelines-pro-bounds-pointer-aritmetik", sokongan untuknya akan muncul dalam keluaran LLVM 16. Untuk mendayakan amaran sedemikian, bendera yang berasingan akan ditambahkan pada denting, tidak aktif secara lalai.

Ia dirancang untuk melaksanakan mod perlindungan dipertingkat pilihan dalam libc++, yang, apabila didayakan, akan menangkap beberapa situasi pada masa jalan yang membawa kepada tingkah laku yang tidak ditentukan. Contohnya, dalam kelas std::span dan std::vector, akses memori di luar sempadan akan dipantau dan jika dikesan, program akan ranap. Pembangun percaya bahawa penambahan perubahan sedemikian akan memastikan libc++ mematuhi piawaian C++, kerana pilihan cara mengendalikan kes tingkah laku yang tidak ditentukan terletak pada pembangun perpustakaan, yang mungkin, antara lain, menganggap tingkah laku yang tidak ditentukan sebagai kegagalan, yang memerlukan program untuk ditamatkan.

Semakan masa jalan dalam libc++ dirancang untuk dibahagikan kepada kategori yang boleh didayakan secara individu. Beberapa semakan yang dicadangkan, yang tidak membawa kepada operasi yang lebih kompleks atau perubahan kepada ABI, telah dilaksanakan dalam mod selamat libc++.

Selain itu, ia dirancang untuk menyediakan alatan untuk mengemas kini kod, membolehkan anda menggantikan pembolehubah dengan penunjuk kosong dengan bekas dan menggunakan pengendali alternatif dalam situasi di mana bekas tidak boleh menggantikan penunjuk secara langsung (contohnya, binaan "jika(array_pointer)" boleh ditukar kepada β€œif(span.data) ()"). Pelarasan boleh digunakan bukan sahaja pada pembolehubah setempat, tetapi juga pada parameter jenis penuding.

Sumber: opennet.ru

Tambah komen