Die von Robin Rowe entwickelte Programmiersprache TrapC ist eine auf Cybersicherheit spezialisierte Variante von C, die darauf abzielt, in C/C++ gängige Speicherprobleme und Pufferüberläufe zu vermeiden. Rowe hat sein Projekt auf dem letzten ISO-C-Meeting im Februar vorgestellt und Ende des Jahres 2025 soll der Compiler Open Source verfügbar sein. Er verarbeitet C- und TrapC-Code und ist auch zu einfachem C++ kompatibel.
Anzeige
Wir sprechen mit Robin über die Sicherheit und Zukunft seiner Idee. Das Interview wurde auf Englisch geführt und an einigen Stellen verweisen wir auf die Originalformulierung.
Robin, warum genau ist TrapC sicherer als C/C++?
Um darüber nachzudenken, was Softwaresicherheit einfach erklärt wirklich bedeutet, sollten wir uns einige grundlegende Fragen darüber stellen, was passiert, wenn typische Fehler in C- und C++-Code – dem heutigen State of the Art – auftreten.
Was passiert, wenn man auf den Inhalt eines Null-Pointers zugreift, das heißt, ungültigen Speicher liest oder schreibt? Oder wenn ein Heap Pointer durch ein Double-free oder Use-after-free falsch verwendet wird? Wenn ein Buffer Overrun, Divide-by-Zero, Integer Overflow, Floating Point NaN oder ein Wild Pointer auftritt? Egal, ob C oder C++: Was dann passiert, ist undefiniertes Verhalten.
Das kann zum Absturz, zu einer ausnutzbaren Zero-Day-Sicherheitslücke oder zu anderem unschönen Verhalten führen. C- und C++-Programmierer müssen vorsichtig sein und antizipieren, wo im Code Fehler auftreten können, um dann defensiv drumherum zu programmieren – eine Welt, in der Programmierer Experten sein müssen und sehr, sehr achtsam sein sollten.
 
      
    
Speichersichere C-Dialekte in der Übersicht
(Bild: Robin Rowe)
TrapC hingegen ist fail-safe. Es reagiert auf Fehler ganz anders als C und C++ oder jede andere Programmiersprache, die ich kenne. Wenn ein unerwartetes Ereignis in der Sprache TrapC auftritt, löst sie ein Trap-Event aus. Wenn der Programmierer einen benutzerdefinierten Trap-Handler geschrieben hat, wird TrapC diesen aufrufen. Andernfalls ruft es den Standard-Trap-Handler auf, der eine hilfreiche Fehlermeldung ausgibt und die Ausführung beendet. Mit TrapC kompilierter C-Code stürzt nicht ab und bietet keine Angriffsfläche für Hacker.
Was müssen Entwicklerinnen und Entwickler überdenken, wenn sie TrapC verwenden?
Programmierer, die sich mit C oder C++ auskennen, müssen in TrapC drei neue Funktionen erlernen: Memory Safe Pointer (auch MSP), trap und alias. Wenn man C++ kennt, hat TrapC Konstruktoren, Destruktoren, Member-Funktionen und Standardargumente, die genauso aussehen wie in C++. TrapC ist dabei nicht schwer zu erlernen, auch ohne C- oder C++-Kenntnisse. TrapC besitzt sechzig Schlüsselwörter, ebenso viele wie C.
trap wird ähnlich verwendet wie catch in C++. Im Gegensatz zu Exceptions ist die Fehlerlogik von TrapC fail-safe. In C++ müssen Programmierer sehr vorsichtig damit sein, Fehler zu antizipieren, um etwas auswerfen ("throw" im Original) zu lassen. In TrapC kann ein Programm etwas einfangen ("trappen“ im Original), das nie ausgeworfen wurde, zum Beispiel Division-by-Zero. TrapC-Traps sind viel schneller und leichtgängiger als Exceptions, weil TrapC keinen komplizierten alternativen Return Stack wie die C++ Exceptions besitzt.
alias lässt sich ähnlich verwenden wie #define in C. Es gibt jedoch viel mehr Nuancen, die alias bietet, als das, was die Präprozessorsubstitution tut. TrapC hat keine Templates oder Operator Overloading, und dennoch ermöglicht alias Container und Bibliotheken zu erzeugen, die die API der C++-STL-Container und iostream nachahmen.
TrapC Memory Safe Pointer vermeiden Lücken wie Buffer Overrun, Memory Leak, Double-free und Use-after-free. Andererseits vermeiden sie auch eine Garbage Collection mit fünffachen Performance-Einbußen und inakzeptablen Sweep-Latenzen. Die hochperformante, automatische Speicherverwaltung von TrapC mit ihrer Speichersicherheit hat jedoch den Preis, dass sie die traditionelle Pointer-Dynamik verändert und manchen Legacy-C-Code unbrauchbar macht.
MSPs funktionieren so: Ein MSP, der ursprünglich Speicher von malloc erhalten hat, ist der anfängliche Owner Pointer. Jeder andere MSP, der auf denselben Speicherblock zeigt, ist ein Alias, kein Owner. MSPs müssen weder Reference Count noch Garbage Collection durchführen, da es immer nur einen Besitzer gibt. C++-Programmierer haben einige Erfahrung mit Owner Pointern durch die Verwendung von std::unique_ptr. Ein Owner Pointer gibt Speicher frei, wenn er den Scope verlässt. MSPs können aber mehr als unique_ptr. TrapC hat Regeln dafür, wann ein Alias befördert wird, um dem ursprünglichen Owner Pointer den Besitz zu entziehen. Alle Pointer in TrapC sind MSPs und speichersicher, obwohl ihre Syntax die gleiche ist wie die in C- oder C++.
TrapC kann Speicher freigeben und einen Pointer früher auf Null setzen, als ein C- oder C++-Programmierer erwarten würde. In C und C++ existieren Heap-Allokationen, die mit malloc oder new erstellt wurden, für immer, bis sie manuell freigegeben werden. C- und C++-Pointer-Aliase werden nie bereinigt, sondern hängen ewig herum. MSP verhindert Probleme mit Use-after-free, indem es Owner Pointer, die den Scope verlassen, freigibt und deren Aliase auf Null setzt. TrapC ist strenger im Umgang mit Pointern als C und C++. Man kann sich die Neukompilierung mit TrapC wie die umsichtige Praxis einer Kompilierung mit den Flags -Wall und -Wextra unter Linux vorstellen.
Was ist Deine Vision mit TrapC? Wird es einmal ein vollständiger Ersatz für C oder sogar C++ sein?
Die aktuelle Frage ist, wie sehr können wir der Codeerzeugung durch generative KI vertrauen? Die CEOs von Google und Nvidia haben jeweils erklärt, dass zwanzig Prozent ihres Codes inzwischen von KI erstellt wird und dass dieser Anteil weiter steigt. Generative KI wurde mit Quellcode von Microsoft GitHub und anderen Repositories trainiert, die nicht fehlerfrei sind. Um eine sichere Superintelligenz ("Safe Super Intelligence" im Original) zu erreichen, um eine KI zu haben, die besser ist als das, was menschliche Programmierer tun können, benötigen wir eine fail-safe Programmiersprache wie TrapC, um vergangenen und zukünftigen Code zu desinfizieren.
TrapC ist der Weg zu "Safe Super Intelligence", zu generativer KI, die Code erzeugt, der nicht abstürzen kann. Meine Vision für die Sprache TrapC ist, dass sie die einzige fail-safe, absturzsichere und hochperformante Programmiersprache sein wird, die einfach zu verstehen ist und häufige Programmierfehler ausschließt. Wenn TrapC bei seiner Veröffentlichung später im Jahr 2025 diese Vision erfüllt, warum sollte jemand eine andere Sprache zum Programmieren mit oder ohne KI-Hilfe einsetzen?
Robin, vielen Dank für die Antworten!
In der Serie "Drei Fragen und Antworten" will die iX die heutigen Herausforderungen der IT auf den Punkt bringen – egal ob es sich um den Blick des Anwenders vorm PC, die Sicht des Managers oder den Alltag eines Administrators handelt. Haben Sie Anregungen aus Ihrer tagtäglichen Praxis oder der Ihrer Nutzer? Wessen Tipps zu welchem Thema würden Sie gerne kurz und knackig lesen? Dann 
(
 
				
 
						 
		
				
Kommentare