توسعه دهندگان پروژه LLVM تعدادی تغییرات را با هدف تقویت امنیت پروژه های C ++ حیاتی و ارائه ابزاری برای حذف خطاهای ناشی از بیش از حد بافرها پیشنهاد کرده اند. این کار روی دو حوزه متمرکز است: ارائه یک مدل توسعه که اجازه کار ایمن با بافرها را میدهد و تلاش برای تقویت امنیت کتابخانه استاندارد توابع libc++.
مدل برنامه نویسی ایمن پیشنهادی برای C++ شامل استفاده از کلاس های ارائه شده توسط کتابخانه استاندارد هنگام کار با بافرها به جای دستکاری نشانگرهای خالی است. به عنوان مثال، پیشنهاد می شود از کلاس های std::array، std::vector و std::span استفاده شود که یک بررسی زمان اجرا برای حافظه بیش از حد تخصیص داده شده اضافه می کند.
برای مبارزه با شیوههای برنامهنویسی خطرناک در clang، پیشنهاد میشود که هشدارهای کامپایلر برای همه عملیاتهای محاسباتی نشانگر نمایش داده شود، مشابه خروجی اخطارهای linter clang-tidy هنگام استفاده از پرچم "cppcoreguidelines-pro-bounds-pointer-arithmetic"، که پشتیبانی از آن خواهد بود. در نسخه LLVM 16 ظاهر می شود. برای فعال کردن چنین اخطارهایی، یک پرچم جداگانه به clang اضافه می شود که به طور پیش فرض فعال نیست.
برنامه ریزی شده است که یک حالت حفاظت پیشرفته اختیاری در libc++ پیاده سازی شود، که وقتی فعال شود، برخی موقعیت ها را در زمان اجرا که منجر به رفتار نامشخص می شود، می گیرد. به عنوان مثال، در کلاس های std::span و std::vector، یک دسترسی حافظه خارج از محدوده نظارت می شود و در صورت شناسایی، برنامه از کار می افتد. توسعه دهندگان بر این باورند که افزودن چنین تغییراتی libc++ را مطابق با استانداردهای C++ نگه میدارد، زیرا انتخاب نحوه رسیدگی به موارد رفتار تعریفنشده با توسعهدهندگان کتابخانه است که ممکن است، از جمله موارد دیگر، رفتار تعریفنشده را بهعنوان یک شکست تلقی کنند و نیاز به برنامه برای خاتمه
بررسیهای زمان اجرا در libc++ به دستههایی تقسیم میشوند که میتوانند به صورت جداگانه فعال شوند. برخی از بررسیهای پیشنهادی، که منجر به عملیات پیچیدهتر یا تغییر در ABI نمیشوند، در حال حاضر در حالت امن libc++ اجرا شدهاند.
علاوه بر این، برنامهریزی شده است که ابزارهایی برای بهروزرسانی کد آماده شود که به شما امکان میدهد متغیرها را با نشانگرهای خالی با کانتینر جایگزین کنید و از کنترلکنندههای جایگزین در شرایطی استفاده کنید که ظرف نمیتواند مستقیماً نشانگر را جایگزین کند (به عنوان مثال، ساختار «if(array_pointer)» میتواند به "if(span.data) ()" تبدیل شود. تنظیمات را می توان نه تنها برای متغیرهای محلی، بلکه برای پارامترهای انواع نشانگر اعمال کرد.
منبع: opennet.ru