LLVM projesi, C++'da arabelleklerle güvenli bir şekilde çalışmak için araçlar geliştiriyor

LLVM projesinin geliştiricileri, görev açısından kritik C++ projelerinin güvenliğini güçlendirmeyi ve ara bellek taşmalarından kaynaklanan hataları ortadan kaldıracak bir araç sağlamayı amaçlayan bir dizi değişiklik önerdi. Çalışma iki alana odaklanıyor: arabelleklerle güvenli çalışmayı sağlayan bir geliştirme modeli sağlamak ve libc++ standart işlev kitaplığının güvenliğini güçlendirmek için çalışmak.

C++ için önerilen güvenli programlama modeli, arabelleklerle çalışırken çıplak işaretçileri değiştirmek yerine standart kitaplık tarafından sağlanan sınıfların kullanılmasını içerir. Örneğin, aşırı tahsis edilmiş hafıza için çalışma zamanı kontrolü ekleyecek olan std::array, std::vector ve std::span sınıflarının kullanılması önerilmektedir.

Clang'da tehlikeli programlama uygulamalarıyla mücadele etmek için, "cppcoreguidelines-pro-bounds-pointer-arithmetic" bayrağı kullanıldığında, clang-tidy linter warnings çıktısına benzer şekilde, tüm işaretçi aritmetik işlemleri için derleyici uyarılarının görüntülenmesi önerilir. LLVM 16 sürümünde görünür. Bu tür uyarıları etkinleştirmek için clang'a varsayılan olarak etkin olmayan ayrı bir bayrak eklenecektir.

Libc++'da, etkinleştirildiğinde çalışma zamanında tanımsız davranışa yol açan bazı durumları yakalayacak isteğe bağlı bir gelişmiş koruma modunun uygulanması planlanmaktadır. Örneğin, std::span ve std::vector sınıflarında, sınırların dışında bir bellek erişimi izlenecek ve tespit edilmesi halinde program çökecektir. Geliştiriciler, bu tür değişikliklerin eklenmesinin libc++'ı C++ standartlarıyla uyumlu tutacağına inanıyor; çünkü tanımlanmamış davranış durumlarının nasıl ele alınacağına ilişkin seçim, diğer şeylerin yanı sıra, tanımlanmamış davranışı bir başarısızlık olarak ele alabilecek kitaplık geliştiricilerine aittir. sonlandırmak için program.

Libc++'daki çalışma zamanı kontrollerinin ayrı ayrı etkinleştirilebilecek kategorilere bölünmesi planlanmaktadır. İşlemlerin karmaşıklığına veya ABI'de değişikliklere yol açmayan önerilen kontrollerden bazıları, libc++ güvenli modunda zaten uygulanmıştır.

Ek olarak, kodun güncellenmesine yönelik araçların hazırlanması, çıplak işaretçilerle değişkenlerin konteynerlerle değiştirilmesine ve konteynerin doğrudan işaretçinin yerini alamadığı durumlarda alternatif işleyicilerin kullanılmasına olanak sağlanması planlanmaktadır (örneğin, “if(array_pointer)” yapısı “if(span.data) ()")'ye dönüştürülebilir. Ayarlamalar yalnızca yerel değişkenlere değil aynı zamanda işaretçi türlerinin parametrelerine de uygulanabilir.

Kaynak: opennet.ru

Yorum ekle