Llançament del conjunt de compiladors LLVM 15.0

Després de sis mesos de desenvolupament, es va presentar el llançament del projecte LLVM 15.0: un conjunt d'eines compatible amb GCC (compiladors, optimitzadors i generadors de codi) que compila programes en codi de bits intermedi d'instruccions virtuals semblants a RISC (una màquina virtual de baix nivell amb un sistema d'optimització multinivell). El pseudocodi generat es pot convertir mitjançant un compilador JIT en instruccions de màquina directament en el moment de l'execució del programa.

Millores importants a Clang 15.0:

  • Per als sistemes basats en l'arquitectura x86, s'ha afegit el senyalador "-fzero-call-used-regs", que garanteix que tots els registres de CPU utilitzats a la funció es reiniciïn a zero abans de retornar el control de la funció. Aquesta opció us permet protegir contra les fuites d'informació de les funcions i reduir el nombre de blocs adequats per construir gadgets ROP (programació orientada al retorn) en exploits en un 20%.
  • S'ha implementat l'aleatorització de la col·locació de memòria d'estructures per al codi C, la qual cosa complica l'extracció de dades de les estructures en cas d'explotació de vulnerabilitats. L'aleatorització s'activa i desactiva mitjançant els atributs randomize_layout i no_randomize_layout, i requereix establir una llavor amb el senyalador "-frandomize-layout-seed" o "-frandomize-layout-seed-file".
  • S'ha afegit el senyalador "-fstrict-flex-arrays=" ", amb el qual podeu controlar els límits d'un element de matriu flexible a les estructures (Flexible Array Members, una matriu de mida indefinida al final de l'estructura). Quan s'estableix a 0 (per defecte), l'últim element de l'estructura amb una matriu sempre es processa com una matriu flexible, 1 - només les mides [], [0] i [1] es processen com una matriu flexible, 2 - només mides [] i [0] es processen com una matriu flexible.
  • S'ha afegit suport experimental per al llenguatge C-like HLSL (High-Level Shader Language), utilitzat a DirectX per escriure shaders.
  • S'ha afegit "-Warray-parameter" per advertir sobre les funcions anul·lades amb declaracions d'arguments incompatibles associades amb matrius de longitud fixa i variable.
  • Compatibilitat millorada amb MSVC. S'ha afegit suport per a "funció #pragma" (indica al compilador que generi una crida de funció en lloc d'expansió en línia) i "#pragma alloc_text" (defineix el nom de la secció amb el codi de funció) proporcionats a MSVC. S'ha afegit suport per a senyals /JMC i /JMC compatibles amb MSVC.
  • El treball continua donant suport als futurs estàndards C2X i C++23. Per al llenguatge C, s'implementen els següents: l'atribut noreturn, les paraules clau false i true, el tipus _BitInt(N) per a nombres enters d'una profunditat de bits determinada, macros *_WIDTH, el prefix u8 per a caràcters codificats UTF-8.

    Per a C++, s'implementa el següent: fusió de mòduls, aïllament ABI dels membres de la funció, inicialització dinàmica ordenada de variables no locals en mòduls, operadors d'índex multidimensionals, auto(x), variables no literals, goto i etiquetes en funcions declarades com a constexpr , seqüències d'escapament delimitades, caràcters d'escapament amb nom.

  • S'han ampliat les capacitats associades amb el suport OpenCL i OpenMP. S'ha afegit suport per a l'extensió OpenCL cl_khr_subgroup_rotate.
  • Per a l'arquitectura x86, s'ha afegit protecció contra les vulnerabilitats dels processadors causades per l'execució especulativa d'instruccions després d'operacions de salt endavant incondicionals. El problema es produeix a causa del processament preventiu d'instruccions immediatament després de la instrucció de branca a la memòria (SLS, Straight Line Speculation). Per habilitar la protecció, es proposa l'opció “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Per a les plataformes que admeten l'extensió SSE2, s'ha afegit el tipus _Float16, que s'emula amb el tipus float en cas de manca de suport per a les instruccions AVX512-FP16.
  • S'ha afegit la bandera "-m[no-]rdpru" per controlar l'ús de la instrucció RDPRU, compatible a partir dels processadors AMD Zen2.
  • S'ha afegit la bandera "-mfunction-return=thunk-extern" per protegir-se de la vulnerabilitat RETBLEED, que funciona afegint una seqüència d'instruccions que exclou la implicació del mecanisme d'execució especulativa per a branques indirectes.

Innovacions clau en LLVM 15.0:

  • S'ha afegit suport per a les arquitectures Cortex-M85 CPU, Armv9-A, Armv9.1-A i Armv9.2-A, extensions Armv8.1-M PACBTI-M.
  • S'ha afegit un backend experimental per a DirectX que admet el format DXIL (DirectX Intermediate Language) utilitzat per als shaders de DirectX. El backend s'habilita especificant el paràmetre "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" durant el muntatge.
  • Libc++ continua implementant noves característiques dels estàndards C++20 i C++2b, inclosa la finalització de la implementació de la biblioteca "format" i la versió experimental proposada de la biblioteca "rangs".
  • Backends millorats per a arquitectures x86, PowerPC i RISC-V.
  • S'han millorat les capacitats de l'enllaçador LLD i del depurador LLDB.

Font: opennet.ru

Afegeix comentari