پس از شش ماه توسعه، انتشار پروژه LLVM 15.0 ارائه شد - یک جعبه ابزار سازگار با GCC (کامپایلر، بهینه ساز و تولید کننده کد) که برنامه ها را در بیت کد میانی دستورالعمل های مجازی RISC مانند (یک ماشین مجازی سطح پایین با سیستم بهینه سازی چند سطحی). شبه کد تولید شده را می توان با استفاده از یک کامپایلر JIT به دستورات ماشین مستقیماً در زمان اجرای برنامه تبدیل کرد.
پیشرفت های عمده در Clang 15.0:
- برای سیستم های مبتنی بر معماری x86، پرچم "-fzero-call-used-regs" اضافه شده است، که تضمین می کند که تمام ثبات های CPU استفاده شده در تابع قبل از بازگرداندن کنترل از تابع، به صفر بازنشانی می شوند. این گزینه به شما امکان می دهد در برابر نشت اطلاعات از توابع محافظت کنید و تعداد بلوک های مناسب برای ساخت ابزارهای ROP (برنامه نویسی بازگشت گرا) در اکسپلویت ها را تا حدود 20 درصد کاهش دهید.
- تصادفی سازی مکان حافظه ساختارها برای کد C پیاده سازی شده است که استخراج داده ها از ساختارها را در صورت بهره برداری از آسیب پذیری ها پیچیده می کند. تصادفیسازی با استفاده از ویژگیهای randomize_layout و no_randomize_layout روشن و خاموش میشود و نیاز به تنظیم یک دانه با استفاده از پرچم "-frandomize-layout-seed" یا "-frandomize-layout-seed-file" دارد.
- پرچم "-fstrict-flex-arrays=" اضافه شد "، که با آن می توانید مرزهای یک عنصر آرایه انعطاف پذیر در ساختارها را کنترل کنید (Flexible Array Members، آرایه ای با اندازه نامحدود در انتهای ساختار). وقتی روی 0 تنظیم می شود (پیش فرض)، آخرین عنصر ساختار دارای یک آرایه همیشه به عنوان یک آرایه انعطاف پذیر پردازش می شود، 1 - فقط اندازه های []، [0] و [1] به عنوان یک آرایه انعطاف پذیر پردازش می شوند، 2 - فقط اندازه ها [] و [0] مانند یک آرایه انعطاف پذیر پردازش می شوند.
- پشتیبانی آزمایشی برای زبان C-مانند HLSL (زبان سایهزن سطح بالا)، که در DirectX برای نوشتن سایهزن استفاده میشود، اضافه شد.
- "-Warray-parameter" اضافه شد تا در مورد توابع نادیده گرفته شده با اعلان های آرگومان ناسازگار مرتبط با آرایه های با طول ثابت و متغیر هشدار دهد.
- سازگاری بهبود یافته با MSVC. پشتیبانی اضافه شده برای "#pragma function" (به کامپایلر دستور می دهد تا یک فراخوانی تابع را به جای توسعه درون خطی ایجاد کند) و "#pragma alloc_text" (نام بخش را با کد تابع تعریف می کند) ارائه شده در MSVC. پشتیبانی از پرچم های /JMC و /JMC سازگار با MSVC اضافه شده است.
- کار برای پشتیبانی از استانداردهای آینده C2X و C++23 ادامه دارد. برای زبان C، موارد زیر اجرا می شوند: ویژگی noreturn، کلمات کلیدی false و true، نوع _BitInt(N) برای اعداد صحیح با عمق بیت معین، *_WIDTH ماکروها، پیشوند u8 برای کاراکترهای رمزگذاری شده UTF-8.
برای C++، موارد زیر پیادهسازی میشوند: ادغام ماژول، جداسازی ABI از اعضای تابع، مقدار دهی اولیه دینامیکی مرتب متغیرهای غیرمحلی در ماژولها، عملگرهای شاخص چند بعدی، خودکار(x)، متغیرهای غیرلفظی، goto و برچسبها در توابع اعلامشده بهعنوان constexpr ، توالی های فرار را محدود کرد، کاراکترهای فرار نامگذاری شده است.
- قابلیت های مرتبط با پشتیبانی OpenCL و OpenMP گسترش یافته است. پشتیبانی برای افزونه OpenCL cl_khr_subgroup_rotate اضافه شده است.
- برای معماری x86، حفاظت در برابر آسیبپذیریها در پردازندهها اضافه شده است که ناشی از اجرای گمانهزنی دستورالعملها پس از عملیات پرش بدون قید و شرط به جلو است. مشکل به دلیل پردازش پیشگیرانه دستورالعمل ها بلافاصله پس از دستورالعمل شاخه در حافظه (SLS، Straight Line Speculation) رخ می دهد. برای فعال کردن حفاظت، گزینه "-mharden-sls=[none|all|return|indirect-jmp]" پیشنهاد شده است.
- برای پلتفرم هایی که از پسوند SSE2 پشتیبانی می کنند، نوع _Float16 اضافه شده است که در صورت عدم پشتیبانی از دستورالعمل های AVX512-FP16 با استفاده از نوع float شبیه سازی می شود.
- پرچم "-m[no-]rdpru" برای کنترل استفاده از دستورالعمل RDPRU اضافه شده است که با شروع پردازنده های AMD Zen2 پشتیبانی می شود.
- پرچم "-mfunction-return=thunk-extern" را برای محافظت در برابر آسیبپذیری RETBLEED اضافه کرد، که با افزودن یک سری دستورالعملها کار میکند که دخالت مکانیسم اجرای گمانهزنی برای شاخههای غیرمستقیم را حذف میکند.
نوآوری های کلیدی در LLVM 15.0:
- پشتیبانی از پردازندههای Cortex-M85، معماریهای Armv9-A، Armv9.1-A و Armv9.2-A، پسوندهای Armv8.1-M PACBTI-M اضافه شده است.
- یک Backend آزمایشی برای DirectX اضافه شده است که از فرمت DXIL (DirectX Intermediate Language) برای سایه زن های DirectX پشتیبانی می کند. پشتیبان با تعیین پارامتر "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" در طول مونتاژ فعال می شود.
- Libc++ به پیادهسازی ویژگیهای جدید استانداردهای C++20 و C++2b، از جمله تکمیل اجرای کتابخانه «فرمت» و نسخه آزمایشی پیشنهادی کتابخانه «محدودهها» ادامه میدهد.
- پشتیبان های بهبود یافته برای معماری های x86، PowerPC و RISC-V.
- قابلیت های پیوند دهنده LLD و دیباگر LLDB افزایش یافته است.
منبع: opennet.ru