Go's Speichersicherheit: Die verborgene Gefahr unsicherer Threads

2025-07-25

Dieser Artikel hinterfragt das allgemeine Verständnis von Speichersicherheit in Go. Der Autor argumentiert, dass einfache Speichersicherheit (z. B. Verhinderung von Out-of-Bounds-Zugriffen) nicht ausreichend für robuste Programme ist; wahre Sicherheit liegt in der Vermeidung von undefiniertem Verhalten (UB). Ein Go-Programmbeispiel zeigt, wie Datenkonkurrenz zu UB und Abstürzen führen kann, sogar ohne `unsafe`-Operationen. Der Autor behauptet, dass Go's Umgang mit Datenkonkurrenz nicht streng genug ist, im Widerspruch zu seinen Behauptungen der Speichersicherheit, wodurch Go-Programme anfälliger für Sicherheitslücken werden. Die Schlussfolgerung betont, dass Sprachsicherheit nicht binär ist, aber das Verständnis der Sicherheitsgarantien einer Sprache und der Kompromisse entscheidend ist.

Mehr lesen
Entwicklung Datenkonkurrenz

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.

Mehr lesen
Entwicklung Zeigersemantik