Keine Datenlecks mehr: TrapC soll die Speicherprobleme von C und C++ beheben

Mit einer automatischen Speicherverwaltung und speichersicheren Zeigern soll der Open-Source-Compiler TrapC in C und C++ geschriebenen Code sicherer machen.

In Pocket speichern vorlesen Druckansicht 120 Kommentare lesen
C++ Code

(Bild: mki / heise online)

Update
Lesezeit: 2 Min.
Von
  • Manuel Masiero

TrapC ist eine neue, auf Cybersicherheit spezialisierte Variante der Programmiersprache C. Sie zielt darauf ab, die in C und C++ gängigen Speicherprobleme und Pufferüberläufe zu verhindern.

Der von Robin Rowe entwickelte TrapC-Compiler soll Ende des Jahres 2025 als Open-Source-Software verfügbar sein und ermöglicht es, C und TrapC-Code parallel zu verwenden. Zudem soll TrapC auch zu einfachem C++-Code kompatibel sein, zum Beispiel:

// hello.cpp
#include <iostream>
int main()
{   std::cout << "hello world" << std::endl;
    return 0;
}

Rowe hat sein Projekt auf dem letzten ISO-C-Meeting Ende Februar in Graz vorgestellt. Der TrapC-Compiler setzt auf speichersichere Zeiger, was Speicherlecks und Speicherüberläufe verhindern soll. Parallel dazu greifen Sicherheitsfunktionen, die in C fehlen, wie Konstruktoren und Destruktoren aus C++. TrapC entfernt zudem unsichere Schlüsselwörter wie goto und union und fügt neue Schlüsselwörter wie trap und alias hinzu. In einem Whitepaper nennt Robin Rowe ein Beispiel dafür, wie TrapC einem Pufferüberlauf entgegenwirkt: ein User-Dialog, in dem Anwender ihre Namen eingeben. In C geschrieben, sieht die entsprechende Code-Passage so aus:

// gets_input.h (CWE–242, CWE–120, CWE-77)
#include <stdio.h>
inline
void gets_input()
{    char buffer[24];
     printf("Please enter your name and press <Enter>\n");
     gets(buffer);// TrapC will terminate on overrun!
     printf("%s",buffer);
}

Geben Anwenderinnen und Anwender mehr als 24 Zeichen ein, provoziert das einen Pufferüberlauf und öffnet einen Exploit für Angreifende. In C oder C++ wird dieser Fehler nicht unbedingt registriert, was zu einem Crash führt.

Dagegen kommt es mit TrapC nicht zu einem Absturz. Im Fall eines SpeicherĂĽberlaufs oder anderen Fehlern wie etwa einer Teilung durch Null beendet der TrapC-Compiler das Programm und wirft eine entsprechende Fehlermeldung aus, es sei denn, es existiert eine passende Fehlerroutine.

So ĂĽberschneidet sich TrapC mit C und C++

(Bild: Robin Rowe)

Mit dem Stichwort trap fĂĽhrt TrapC ein eigenes Error-Handling ein. Ein Beispiel:

// trap_test.tc
#include "gets_input.h"
int main()
{    gets_input();
     trap
     {     puts("ERROR: invalid input");
           return 1;
     }
     return 0;
}

Dabei muss die aufrufende Funktion die Fehler behandeln, denn sie lassen sich nicht wie bei C++-Exceptions weiterreichen. trap.return bietet jedoch eine ähnliche Funktion wie throw. Weitere Details der Sprache finden sich im Whitepaper.

Update

TrapC-Entwickler Robin Rowe hat auf Reddit noch einmal die Unterschiede zwischen trap und try/catch ausführlicher erklärt.

(who)