Das Startup Trasec entwickelt die Programmiersprache TrapC, ein Dialekt von C, der ein sicheres Arbeiten mit Speicher ermöglicht. Um Fehler beim Umgang mit Speicher, wie das Überlaufen eines zugewiesenen Puffers und den Zugriff auf bereits freigegebenen Speicher, zu verhindern, wendet TrapC einen grundlegend anderen Ansatz im Umgang mit Zeigern und einen speziellen Mechanismus zur Fehlererfassung auf Basis von Ausnahmebehandlern (trap) an. Der Quellcode des Compilers für TrapC soll 2025 veröffentlicht werden.
Es wurde erklärt, dass die Besonderheiten im Umgang mit Zeigern möglichst den vertrauten Arbeitsablauf nicht stören und durch den Compiler umgesetzt werden. Nach der Vorstellung der Sprachentwickler wird der Compiler garantieren, dass Zeiger nur auf die zugehörigen Speicherbereiche verweisen und alle Pufferrandgrenzen überprüfen. Der Compiler merkt sich die Typen und erlaubt keine unsichere Typumwandlung. Alle erstellten Variablen und Puffer werden eindeutig initialisiert oder vom Compiler mit Nullen gefüllt.
Anstelle von malloc wird im TrapC ein ähnlicher Konstruktor wie in C++ verwendet: new. Aufrufe von free und delete fehlen, und die Speicherfreigabe obliegt dem Compiler, was vor Fehlern schützt, die zu Speicherlecks führen könnten. Im Heap wird ein inkrementelles automatisches Speichermanagement angewendet, jedoch ohne Garbage Collector. Auf der ABI-Ebene wird TrapC mit C kompatibel sein, was die Kombination von TrapC- und reinem C-Code in einer Anwendung ermöglicht, jedoch wird für C-Code kein Schutz beim Umgang mit Speicher gewährleistet.
Das Projekt wird von Robin Rowe geleitet, einem ehemaligen Professor für Informatik, der an Komitees zur Entwicklung von C- und C++-Standards beteiligt war, und der zu seiner Zeit den Grafikeditor Cinepaint geschaffen hat, der bei der Produktion einiger Hollywood-Filme verwendet wurde, sowie der POSIX-Bibliothek libunistd für Windows. Mitbegründer von Trasec ist Gabrielle Pantera, die eine leitende Position bei Disney innehatte.
Details zum Projekt werden bislang nicht angegeben, es werden nur einige Beispiele mit Code gezeigt, in dem zum Beispiel erklärt wird, dass TrapC einen Pufferüberlauf von buff bei der Ausführung von „strcpy(buff,argv[1]);“ verhindern oder den Zeiger oder Index eines Arrays nicht um einen Wert erhöhen wird, der ihn über den zugewiesenen Puffer oder das Ende des Arrays hinausschiebt. Wie genau dieser Schutz erreicht wird, wird nicht erläutert. \/\/ darpa_tractor.c int main(int argc,char* argv[]) { char buff[8]; \/\/ TrapC initialisiert automatisch auf Null, kein schmutziger Speicher int success = 0;\/\/ In C, Bufferüberschreibung beschädigt success strcpy(buff,argv[1]); \/\/ TrapC kann nicht überlaufen, strcpy ist sicher if(!strcmp(buff,"s3cr8tpw")) { success = 1; } if(success) \/\/ TrapC blockierte strcpy-Überschreibung, success ist gut { printf("Willkommen!\n"); } return !success; } \/\/ trapc_ptr.c int main() { const char* ptr = "Hello World"; \/\/ 12 Zeichen breit while(ptr) \/\/ Kein Pufferüberlauf mit TrapC { printf("%c",*ptr); \/\/ ein Zeichen nach dem anderen drucken ptr++; \/\/ Geht über das Ende hinaus: TrapC setzt ptr auf Null! } \/\/ Dies in C nicht versuchen, wird segfault verursachen! assert(ptr == 0); return 0; } \/\/ trapc_array.c int score[10]; printf("%i",score[-1]); \/\/ TrapC erlaubt keinen Zugriff for(int i = 0;i
Quelle: opennet.ru
