Zeiger sind kompliziert II: Subtile Fehler in LLVM-Optimierungen

2025-02-02

Dieser Beitrag befasst sich mit der Bedeutung einer präzisen Semantik für Compiler-Zwischensprachen (IR), insbesondere für Sprachen wie C, C++ und Rust, die unsichere Zeigermanipulation erlauben. Der Autor zeigt, wie eine Folge von drei scheinbar korrekten LLVM-Compileroptimierungen zu einem inkorrekten Programmverhalten führen kann. Die Ursache liegt in der Herkunft (Provenance) von Zeigern – den zusätzlichen Informationen in einem Zeiger über seine Speicheradresse hinaus, die beschreiben, wie er berechnet wurde. Dies erfordert eine präzisere LLVM-IR-Spezifikation, einschließlich einer präzisen Definition des undefinierten Verhaltens (UB). Compiler-IRs als eigenständige Programmiersprachen mit strengen Spezifikationen zu behandeln, ist der Schlüssel zur Lösung solcher Probleme.

Entwicklung Zeigersemantik