LLVM layihəsi C++ dilində buferlə təhlükəsiz işləməni inkişaf etdirir

LLVM layihəsinin tərtibatçıları missiya baxımından kritik C++ layihələrinin təhlükəsizliyini gücləndirməyə və bufer həddi aşması nəticəsində yaranan xətaları aradan qaldırmaq üçün vasitə təmin etməyə yönəlmiş bir sıra dəyişikliklər təklif etmişlər. İş iki sahəyə yönəlib: buferlərlə təhlükəsiz işləməyə imkan verən inkişaf modelinin təmin edilməsi və libc++ standart funksiyalar kitabxanasının təhlükəsizliyinin gücləndirilməsi üzərində işləmək.

C++ üçün təklif olunan təhlükəsiz proqramlaşdırma modeli, çılpaq göstəriciləri manipulyasiya etmək əvəzinə buferlərlə işləyərkən standart kitabxana tərəfindən verilən siniflərdən istifadə etməkdir. Məsələn, std::array, std::vector və std::span siniflərindən istifadə etmək təklif olunur ki, bunlar da həddən artıq ayrılmış yaddaş üçün iş vaxtı yoxlanışı ilə əlavə olunacaq.

Clang-da təhlükəli proqramlaşdırma təcrübələri ilə mübarizə aparmaq üçün dəstəyi aşağıda görünəcək "cppcoreguidelines-pro-bounds-pointer-arithmetic" bayrağından istifadə edərkən clang-tidy-nin linter xəbərdarlıqlarına bənzər bütün göstərici arifmetik əməliyyatları üçün tərtibçi xəbərdarlıqlarının verilməsi təklif olunur. buraxılış LLVM 16. Bu cür xəbərdarlıqları aktivləşdirmək üçün defolt olaraq aktiv olmayan cingiltiyə ayrıca bayraq əlavə olunacaq.

Libc++-da isteğe bağlı bərkidilmiş qorunma rejiminin tətbiqi planlaşdırılır ki, bu da işə salındıqda işləmə zamanı qeyri-müəyyən davranışa səbəb olan bəzi vəziyyətləri tutacaq. Məsələn, std::span və std::vektor siniflərində hüduddan kənar girişə nəzarət ediləcək və bu halda proqram qəzaya uğrayacaq. Tərtibatçılar hesab edirlər ki, bu cür dəyişikliklərin əlavə edilməsi libc++-ı C++ standartlarına uyğun saxlayacaq, çünki qeyri-müəyyən davranış hallarının necə idarə olunması seçimi kitabxananın tərtibatçılarının üzərinə düşür və bu, digər şeylərlə yanaşı, qeyri-müəyyən davranışı bir qəza kimi şərh edə bilər. çıxmaq üçün proqram.

libc++-da icra müddəti yoxlamalarının fərdi olaraq daxil edilə bilən kateqoriyalara bölünməsi planlaşdırılır. Daha mürəkkəb əməliyyatlar və ya ABI dəyişiklikləri ilə nəticələnməyən bəzi təklif olunan yoxlamalar artıq libc++ təhlükəsiz rejimində həyata keçirilir.

Bundan əlavə, kodun düzəldilməsi üçün alətlər dəstinin hazırlanması planlaşdırılır ki, bu da dəyişənləri konteynerlərdə çılpaq göstəricilərlə əvəz etməyə və konteynerin göstəricini birbaşa əvəz edə bilmədiyi hallarda alternativ işləyiciləri tətbiq etməyə imkan verir (məsələn, “if (array_pointer)" konstruksiya “if (span.data ()"-ə çevrilə bilər. Tənzimləmələr təkcə yerli dəyişənlərə deyil, həm də göstəricilərlə tip parametrlərinə tətbiq edilə bilər.

Mənbə: opennet.ru

Добавить комментарий