Die Veröffentlichung des LLVM-Compiler-Pakets 15.0

Nach sechs Monaten Entwicklung wurde die Version 15.0 von LLVM veröffentlicht – eines GCC-kompatiblen Tools (Compiler, Optimierer und Code-Generatoren), das Programme in einen intermedären Bitcode von RISC-ähnlichen virtuellen Instruktionen kompiliert (eine Low-Level-VM mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann mithilfe eines JIT-Compilers in Maschineninstruktionen direkt zur Laufzeit des Programms umgewandelt werden.

Hauptverbesserungen in Clang 15.0:

  • Für Systeme mit x86-Architektur wurde das Flag „-fzero-call-used-regs“ hinzugefügt, das sicherstellt, dass alle in der Funktion verwendeten CPU-Register vor der Rückgabe der Kontrolle aus der Funktion auf Null gesetzt werden. Diese Option schützt vor Informationslecks aus Funktionen und reduziert die Anzahl der Blöcke, die für den Aufbau von ROP-Gadgets (Return-Oriented Programming) in Exploits verwendet werden können, um etwa 20 %.
  • Die Randomisierung der Platzierung im Speicher von Strukturen für C-Code wurde implementiert, um das Extrahieren von Daten aus Strukturen bei der Ausnutzung von Schwachstellen zu erschweren. Die Randomisierung kann mit den Attributen randomize_layout und no_randomize_layout ein- und ausgeschaltet werden und erfordert die Festlegung eines Seeds mit der Option „-frandomize-layout-seed“ oder „-frandomize-layout-seed-file“.
  • Ein Flag „-fstrict-flex-arrays=“ wurde hinzugefügt, mit dem die Grenzen für flexible Array-Elemente in Strukturen (Flexible Array Members, Array mit variabler Größe am Ende einer Struktur) gesteuert werden können. Wird der Wert auf 0 (Standard) gesetzt, wird das letzte Element der Struktur mit dem Array stets als flexibles Array behandelt, bei 1 werden nur die Größen [], [0] und [1] als flexibles Array behandelt, und bei 2 werden nur die Größen [] und [0] als flexibles Array behandelt.
  • Experimentelle Unterstützung für die C-ähnliche Sprache HLSL (High-Level Shader Language), die in DirectX zum Schreiben von Shaders verwendet wird, wurde hinzugefügt.
  • Ein Parameter „-Warray-parameter“ wurde hinzugefügt, der vor der Neuimplementierung von Funktionen mit inkompatiblen Argumentdeklarationen für Arrays fester und variabler Länge warnt.
  • Die Kompatibilität mit MSVC wurde verbessert. Unterstützung für „#pragma function“ (weist den Compiler an, einen Funktionsaufruf zu generieren, anstatt sie inline zu entrollen) und „#pragma alloc_text“ (definiert den Abschnittsnamen des Funktionscodes), die in MSVC bereitgestellt werden, wurde hinzugefügt. Kompatible MSVC-Flags /JMC und /JMC wurden ebenfalls implementiert.
  • Die Arbeiten zur Unterstützung zukünftiger Standards C2X und C++23 wurden fortgesetzt. Für die Programmiersprache C wurden Implementierungen hinzugefügt: das Attribut noreturn, die Schlüsselwörter false und true, der Typ _BitInt(N) für Ganzzahlen mit festgelegter Bit-Breite, Makros *_WIDTH und das Präfix u8 für Zeichen im UTF-8-Zeichensatz.

    Für C++ wurden folgende Funktionen realisiert: Modul-Merging, Isolation von ABI-Mitgliedern von Funktionen, geordnete dynamische Initialisierung nicht-lokaler Variablen in Modulen, mehrdimensionale Indexoperatoren, auto(x), nicht-literal variablen, goto und Labels in als constexpr deklarierten Funktionen sowie Escape-Sequenzen mit Trennzeichen und benannte Escape-Zeichen.

  • Die Möglichkeiten zur Unterstützung von OpenCL und OpenMP wurden erweitert. Unterstützung für die OpenCL-Erweiterung cl_khr_subgroup_rotate wurde hinzugefügt.
  • Für die x86-Architektur wurde ein Schutz gegen Sicherheitsanfälligkeiten in Prozessoren eingeführt, die durch spekulative Ausführung von Instruktionen nach bedingungslosen Sprungoperationen verursacht werden. Das Problem tritt aufgrund der vorzeitigen Verarbeitung von Instruktionen auf, die im Speicher unmittelbar nach dem Sprungbefehl folgen (SLS, Straight Line Speculation). Zur Aktivierung des Schutzes wird die Option „-mharden-sls=[none|all|return|indirect-jmp]“ vorgeschlagen.
  • Für Plattformen, die die SSE2-Erweiterung unterstützen, wurde der Typ _Float16 hinzugefügt, der im Falle fehlender AVX512-FP16-Instruktionen mit dem Typ float emuliert wird.
  • Ein Flag „-m[no-]rdpru“ wurde hinzugefügt, um die Verwendung der RDPRU-Instruktion zu steuern, die ab den AMD Zen2-Prozessoren unterstützt wird.
  • Ein Flag „-mfunction-return=thunk-extern“ wurde hinzugefügt, um vor der Sicherheitsanfälligkeit RETBLEED zu schützen, die durch die Hinzufügung einer Instruktionssequenz besteht, die die Einbeziehung des spekulativen Ausführungsmechanismus für indirekte Sprünge ausschließt.

Die wichtigsten Neuerungen in LLVM 15.0:

  • Unterstützung für die CPU Cortex-M85, die Architekturen Armv9-A, Armv9.1-A und Armv9.2-A sowie die Armv8.1-M PACBTI-M-Erweiterungen wurden hinzugefügt.
  • Ein experimenteller Backend für DirectX wurde hinzugefügt, der das DXIL-Format (DirectX Intermediate Language) unterstützt, das für DirectX-Shader verwendet wird. Der Backend wird aktiviert, indem beim Build der Parameter „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX“ angegeben wird.
  • In Libc++ wurde die Implementierung neuer Funktionen der C++20- und C++2b-Standards fortgesetzt, einschließlich des Abschlusses der Implementierung der "format"-Bibliothek und der Einführung einer experimentellen Version der "ranges"-Bibliothek.
  • Die Backends für die Architekturen x86, PowerPC und RISC-V wurden verbessert.
  • Die Funktionen des Linkers LLD und des Debuggers LLDB wurden erweitert.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster