LLVM 15.0 kompilaatorite komplekti väljaanne

Kuue kuu arendustöö järel on esitatud LLVM 15.0 versioon — GCC-iga ühilduv tööriistakomplekt (kompilaatorid, optimeerijad ja koodi generaatorid), mis kompileerib programme RISC-sarnaste virtuaalsete käskude vahepealeseks bittideks (madala taseme virtuaalne masin mitmeastmelise optimeerimisse süsteemiga). Genereritud pseudokood võib olla JIT-kompilaatori abil muudetud otse programmi täitmise hetkel masinakeele käskudeks.

Clang 15.0 peamised täiustused:

  • x86-arhitektuuril põhinevatele süsteemidele on lisatud lipp „-fzero-call-used-regs“, mis tagab, et kõik funktsioonis kasutatud CPU registrid nullitakse enne juhtimise tagastamist funktsioonist. Antud valik võimaldab kaitsta teabe leke vastu funktsioonidest ning vähendab ROP-gadgetite (Return-Oriented Programming) loomise jaoks sobilike plokkide arvu ligikaudu 20% võrra eksploiteerimisel.
  • Реализована рандомизация размещения в памяти структур для кода на языке Си, которая усложняет извлечение данных из структур в случае эксплуатации уязвимостей. Рандомизация включается и выключается при помощи атрибутов 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», который предупреждает о переопределении функций с не сочетающимся объявлением аргументов, связанных с массивами фиксированной и переменной длины.
  • Parandatud ühilduvust MSVC-ga. Lisatud tugi „#pragma function” (märk, mis näitab kompilaatorile, et ta genereeriks funktsiooni kutsumise, selle inline-keeramise asemel) ja „#pragma alloc_text” (määrab funktsiooni koodile sektsiooni nime), mida pakutakse MSVC-s. Lisatud MSVC-ga ühilduvad lipud /JMC ja /JMC.
  • Tööd jätkatakse tulevaste C2X ja C++23 standardite toetamise nimel. C keele jaoks on rakendatud: atribuut noreturn, võtmesõnad false ja true, tüüp _BitInt(N) määratud bitilaiusega täisarvude jaoks, makrod *_WIDTH, u8 eelmine märkUTF-8 kodeeringu jaoks.

    C++ jaoks on rakendatud: moodulite liitmine, ABI liikmete funktsioonide isoleerimine, mittesüsteemsete muutuja ordeneeritud dünaamiline algatamine moodulites, mitmemõõtmelised indeksioperaatorid, auto(x), mitteliteral muutujad, goto ja sildid funktsioonides, mis on määratletud kui constexpr, escape-järjestused eraldajatega, nimega escape-märgid.

  • Suurendatud OpenCL ja OpenMP toe seonduvaid võimalusi. Lisatud OpenCL laienduse cl_khr_subgroup_rotate tugi.
  • x86 arhitektuurile on lisatud kaitse protsessorite haavatavuste eest, mis on põhjustatud spekulatiivsest käskude täitmisest pärast tingimusteta otsepöörde operatsioone. Probleem tuleneb proaktiivsest käskude töötlemisest, mis järgneb mälus otsepöörde käsklusele (SLS, Straight Line Speculation). Kaitse aktiveerimiseks on pakutud valik "-mharden-sls=[none|all|return|indirect-jmp]".
  • SSE2 laiendust toetavates platvormides on lisatud tüüp _Float16, mis emuleeritakse tüübiga float juhul, kui AVX512-FP16 käsu toimetamine ei ole toetatud.
  • Lisatud on lipp "-m[no-]rdpru" RDPRU käsu kasutamise juhtimiseks, mis on toetatud alates AMD Zen2 protsessoritest.
  • Lisatud on lipp "-mfunction-return=thunk-extern" kaitseks RETBLEED haavatavuste vastu, mis töötavad kaudsete pöördena spekulatiivsest täitmisest kõrvalehoidmise käskude järjestuse kaudu.

LLVM 15.0 peamised uuendused:

  • Lisatud on CPU Cortex-M85 tugi, arhitektuurid Armv9-A, Armv9.1-A ja Armv9.2-A, Armv8.1-M PACBTI-M laiendused.
  • Lisatud eksperimentaalne DirectX taust, mis toetab DXIL (DirectX vahekeel) formaati, mida kasutatakse DirectX shaderite jaoks. Taust aktiveeritakse kogumisel parameetri „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” seadistamisega.
  • Libc++s jätkub C++20 ja C++2b standardite uute võimaluste rakendamine, sealhulgas on lõpetatud „format” raamatukogu rakendamine ja eksperimentaalne versioon „ranges” raamatukogust on ette pandud.
  • Parendatud taustasid arhitektuuridele x86, PowerPC ja RISC-V.
  • LDL kompakti ja LLDB siluri võimalusi on laiendatud.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster