Open-Source-Compiler

Großartige Tools, aber mit Vorsicht zu benutzen

28. Mai 2024, 6:00 Uhr | Harry Schubert
© Tanakorn – stock.adobe.com

Die GCC- und LLVM-Communities leisten beachtliches, indem sie Compiler implementieren, die mit ihrem Verhalten den Komplexitäten des C++-Standards gerecht werden. Aber das bedeutet nicht automatisch, dass Entwickler diesen beiden Open-Source-Compilern blind vertrauen können.

Diesen Artikel anhören

Ahmed Abdulbaki Ibrahim, Software-Ingenieur bei Solid Sands, hat die Open-Source-Compiler GCC (GNU Compiler Collection) und LLVM (ehemals die Abkürzung für Low Level Virtual Machine) mit Clang unter die Lupe genommen. Mit dem Tool SuperTest von Solid Sands hat er beide Compiler geprüft, um die Frage der Vertrauenswürdigkeit zu beantworten. Das Testergebnis ergab eine Vielzahl von Diskrepanzen in der Funktionsweise der Compiler. Auf die Fehler wurde er während der routinemäßigen Entwicklung des SuperTest-Tools aufmerksam. Sie wurden entdeckt, weil in den Testläufen Unstimmigkeiten in der Ausgabe des Tools zwischen GCC und Clang identifiziert wurden.

Die Testmethode und die wichtigsten fünf Fehler hat er in einem Vortrag „Compiler Black-Box Testing and Peculiar Bugs Encountered“ auf der emBO++ embedded C++ Conference in Bochum (14.3.–15.3., Bochum, Ruhr-Universität) präsentiert. Zu den wichtigsten Fehlern der Open-Source-Compiler zählt er:

  • Bug Nr. 1: Diskrepanz zwischen zwei Typen.
    In GCC 13.2 gibt es offensichtlich einen Unterschied in der Behandlung und Darstellung von zwei identischen Variablen vom Typ Double - eine Inkonsistenz, die sich bei arithmetischen Operationen mit Gleitkomma als problematisch erweisen könnte.
  • Bug Nr. 2: Schwachstelle bei Hash-Funktionen für boolesche Vektoren.
    Die Hash-Funktion von Clang für boolesche Vektoren hat eine Schwachstelle. Es wurde nachgewiesen, dass sie nur eine geringe Kollisionsresistenz aufweist und daher für sicherheitskritische Anwendungen nicht geeignet ist.
  • Bug Nr. 3: Erlaubtes undefiniertes Verhalten in konstanten Ausdrücken.
    GCC kompiliert Quellcode mit einer Core Constant Expression, die undefiniertes Verhalten aufweist, und meldet keine Fehler. Dies verstößt gegen die Spezifikation, die besagt, dass ein Ausdruck e eine Core Constant Expression ist, wenn ihre Überprüfung keine Operation enthält, die ein undefiniertes Verhalten zur Folge hätte.
  • Bug Nr. 4: Nicht-bool-konvertierbare Template-Werte werden akzeptiert.
    Während des Aufrufs der Class Template std::conjunction<> lassen sowohl GCC als auch Clang fälschlicherweise Traits mit Werten zu, die nicht in boolean konvertierbar sind. Dies steht in direktem Widerspruch zum C++-Standard, der ausdrücklich besagt, dass jedes Template-Argument einen Wert haben muss, der in einen boolschen Wert konvertierbar ist.
  • Bug Nr. 5: Erlauben verbotener Specifier.
    Die Verwendung des constexpr Specifiers in einer expliziten Instanziierung einer Variablen-Template ist in Clang erlaubt, aber in der Sprachspezifikation verboten.

Diese Fehler zeigen, wie gefährlich ein bedingungsloses Vertrauen in Open-Source-Compiler-Tools sein kann. Der Einsatz von Compiler-Test-Tools wie SuperTest hilft Entwicklern, um der Arbeit von Compilern zu vertrauen. Auch wenn die oben genannten Fehler ausschließlich bei Open-Source-Compilern festgestellt wurden: Es gibt solche Fehler auch in proprietären Compilern.

passend zum Thema


Lesen Sie mehr zum Thema


Jetzt kostenfreie Newsletter bestellen!

Weitere Artikel zu Componeers GmbH

Weitere Artikel zu Software (M2M)

Weitere Artikel zu Security-Software

Weitere Artikel zu Echtzeit-/Embedded Software

Weitere Artikel zu Software/Entwicklung

Weitere Artikel zu Softwareentwicklung