Π Π΅Π»ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° компиляторов LLVM 15.0

ПослС ΡˆΠ΅ΡΡ‚ΠΈ мСсяцСв Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСдставлСн Ρ€Π΅Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM 15.0 — GCC-совмСстимого инструмСнтария (компиляторы, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ΄Π°), ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚ΠΊΠΎΠ΄ RISC-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… инструкций (низкоуровнСвая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина с ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ систСмой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ). Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ псСвдокод ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JIT-компилятора Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции нСпосрСдствСнно Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² Clang 15.0:

  • Для систСм Π½Π° Π±Π°Π·Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-fzero-call-used-regs», ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСгистров CPU ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ управлСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Указанная опция позволяСт Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 20% ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ число Π±Π»ΠΎΠΊΠΎΠ², ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹Ρ… для построСния ROP-Π³Π°Π΄ΠΆΠ΅Ρ‚ΠΎΠ² (Return-Oriented Programming) Π² эксплоитах.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° рандомизация размСщСния Π² памяти структур для ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘ΠΈ, которая услоТняСт ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· структур Π² случаС эксплуатации уязвимостСй. Рандомизация Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² randomize_layout ΠΈ no_randomize_layout, ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ установки Π·Π°Ρ‚Ρ€Π°Π²ΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„Π»Π°Π³Π° «-frandomize-layout-seed» ΠΈΠ»ΠΈ «-frandomize-layout-seed-file».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-fstrict-flex-arrays=<arg>», ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ для Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ элСмСнта-массива Π² структурах (Flexible Array Members, массив Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² ΠΊΠΎΠ½Ρ†Π΅ структуры). ΠŸΡ€ΠΈ выставлСнии значСния Π² 0 (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) послСдний элСмСнт структуры с массивом всСгда обрабатываСтся ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΈΠΉ массив, 1 — Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ [], [0] ΠΈ [1] ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΈΠΉ массив, 2 — Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ [] ΠΈ [0] ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΈΠΉ массив.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π‘ΠΈ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ языка HLSL (High-Level Shader Language), примСняСмого Π² DirectX для написания ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ΠΎΠ².
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ «-Warray-parameter», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Π½Π΅ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌΡΡ объявлСниСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², связанных с массивами фиксированной ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с MSVC. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° «#pragma function» (ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ компилятору Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, вмСсто Π΅Ρ‘ inline-развёртывания) ΠΈ «#pragma alloc_text» (опрСдСляСт имя сСкции с ΠΊΠΎΠ΄ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), прСдоставляСмых Π² MSVC. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° совмСстимых с MSVC Ρ„Π»Π°Π³ΠΎΠ² /JMC ΠΈ /JMC.
  • ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… стандартов C2X ΠΈ C++23. Для языка Π‘ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹: Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ noreturn, ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова false ΠΈ true, Ρ‚ΠΈΠΏ _BitInt(N) для Ρ†Π΅Π»Ρ‹Ρ… чисСл Π·Π°Π΄Π°Π½Π½ΠΎΠΉ разрядности, макросы *_WIDTH, прСфикс u8 для символов Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-8.

    Для Π‘++ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹: слияниС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, изоляция ABI Ρ‡Π»Π΅Π½ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, упорядочСнная динамичСская инициализация Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² модулях, ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ индСксныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, auto(x), Π½Π΅Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, goto ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ Π² функциях, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ constexpr, escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с раздСлитСлями, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ escape-символы.

  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности, связанныС с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ OpenCL ΠΈ OpenMP. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° OpenCL-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ cl_khr_subgroup_rotate.
  • Для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ уязвимостСй Π² процСссорах, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… спСкулятивным Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ инструкций послС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ бСзусловного прямого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ инструкций, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π² памяти сразу Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (SLS, Straight Line Speculation). Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° опция «-mharden-sls=[none|all|return|indirect-jmp]».
  • Для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ SSE2 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚ΠΈΠΏ _Float16, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эмулируСтся с использованиСм Ρ‚ΠΈΠΏΠ° float Π² случаС отсутствия ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ инструкций AVX512-FP16.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-m[no-]rdpru» для управлСния использованиСм инструкции RDPRU, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ начиная с процСссоров AMD Zen2.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ„Π»Π°Π³ «-mfunction-return=thunk-extern» для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ уязвимости RETBLEED, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ инструкций, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π²ΠΎΠ²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° спСкулятивного выполнСния для косвСнных ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ².

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π° LLVM 15.0:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CPU Cortex-M85, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ Armv9-A, Armv9.1-A ΠΈ Armv9.2-A, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Armv8.1-M PACBTI-M.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ бэкСнд для DirectX, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DXIL (DirectX Intermediate Language), примСняСмый для ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ΠΎΠ² DirectX. БэкСнд Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ сборкС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° «-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX».
  • Π’ Libc++ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π° рСализация Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй стандартов C++20 ΠΈ C++2b, Π² Ρ‚ΠΎΠΌ числС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° рСализация Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ «format» ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ «ranges».
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ бэкСнды для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ x86, PowerPC ΠΈ RISC-V.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° LLD ΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° LLDB.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru