Zyklon (Programmiersprache)

Die Zyklon-Programmiersprache ist beabsichtigt, um ein sicherer Dialekt der c Sprache zu sein. Zyklon wird entworfen, um Pufferüberschwemmungen und andere Verwundbarkeit zu vermeiden, die in C Programmen endemisch ist, ohne die Macht und Bequemlichkeit von C als ein Werkzeug für die Systemprogrammierung zu verlieren.

Zyklon-Entwicklung wurde als ein gemeinsames Projekt AT&T Laboratorium-Forschung und die Gruppe von Greg Morrisett an Cornell 2001 angefangen. Version 1.0 wurde am 8. Mai 2006 veröffentlicht.

Spracheigenschaften

Zyklon versucht, einige der allgemeinen Fallen von C zu vermeiden, während er noch seinen Blick und Leistung aufrechterhält. Zu diesem Zweck legt Zyklon die folgenden Grenzen auf Programmen:

  • Kontrollen werden eingefügt, um Segmentationsschulden zu verhindern
  • Zeigestock-Arithmetik wird beschränkt
  • Zeigestöcke müssen vor dem Gebrauch initialisiert werden (wird das durch die bestimmte Anweisungsanalyse beachtet)
  • Baumelnde Zeigestöcke werden durch die Gebiet-Analyse und Grenzen auf verhindert
  • Nur "sicheren" Würfen und Vereinigungen wird erlaubt
  • in Spielraume wird zurückgewiesen
  • Etiketten in verschiedenen Spielraumen werden zurückgewiesen
  • Zeigestock zurückgebende Funktionen müssen durchführen
  • und werden nicht unterstützt

Um den Werkzeugsatz aufrechtzuerhalten, an den C Programmierer gewöhnt sind, stellt Zyklon die folgenden Erweiterungen zur Verfügung:

  • Nie - verlangen Zeigestöcke Kontrollen nicht
  • "Fette" Zeigestöcke unterstützen Zeigestock-Arithmetik mit Laufzeitgrenzen, die überprüfen
  • Gebiete von Growable unterstützen eine Form des sicheren manuellen Speichermanagements
  • Müll-Sammlung für Haufen-zugeteilte Werte
  • Markierte Vereinigungen unterstützen Typ ändernde Argumente
  • Einspritzungen helfen, den Gebrauch von markierten Vereinigungen für Programmierer zu automatisieren
  • Polymorphism ersetzt etwas Gebrauch von
  • varargs werden als fette Zeigestöcke durchgeführt
  • Ausnahmen ersetzen etwas Gebrauch und

Für eine bessere Einführung auf höchster Ebene in den Zyklon, das Denken hinter dem Zyklon und der Quelle dieser Listen, sieh dieses Papier.

Zyklon-Blicke, im Allgemeinen, viel wie C, aber sollte es als ein einer c Sprache ähnlicher angesehen werden.

Typen des Zeigestocks/Verweisung

Zyklon führt drei Arten der Verweisung durch (im Anschluss an die C Fachsprache diese werden Zeigestöcke genannt):

  • (der normale Typ)
  • (nie - Zeigestock), und
  • (der einzige Typ mit der Zeigestock-Arithmetik erlaubt, "fette" Zeigestöcke).

Der Zweck, diese neuen Zeigestock-Typen einzuführen, soll häufige Probleme vermeiden, wenn er Zeigestöcke verwendet. Nehmen Sie zum Beispiel eine Funktion, genannt, der einen Zeigestock zu einer internen Nummer bringt:

interne Nummer foo (interne Nummer *);

</Quelle>

Obwohl die Person, die die Funktion geschrieben hat, Kontrollen eingefügt haben könnte, lassen Sie uns annehmen, dass für die Leistung schließt, dass sie nicht getan haben. Das Benennen wird auf unbestimmtes Verhalten (normalerweise, obwohl nicht notwendigerweise, ein SIGSEGV hinauslaufen, der an die Anwendung wird sendet). Um solche Probleme zu vermeiden, führt Zyklon den Zeigestock-Typ ein, der nie sein kann. So würde die "sichere" Version dessen sein:

interne Nummer foo (interne Nummer);

</Quelle>

Das sagt dem Zyklon-Bearbeiter, dass das Argument dafür nie sein sollte, das oben erwähnte unbestimmte Verhalten vermeidend. Die einfache Änderung dazu rettet den Programmierer davon, Schecks und das Betriebssystem davon ausstellen zu müssen, Zeigestock dereferences fangen zu müssen. Diese Extragrenze kann jedoch ein ziemlich großer Stolperstein für die meisten C Programmierer sein, die gewohnt sind im Stande zu sein, ihre Zeigestöcke direkt mit der Arithmetik zu manipulieren. Obwohl das wünschenswert ist, kann es zu Pufferüberschwemmungen und anderen "off-one" artigen Fehlern führen. Um das zu vermeiden, wird der Zeigestock-Typ durch einen bekannten gebunden, die Größe der Reihe abgegrenzt. Obwohl das oben wegen der über den Zeigestock versorgten Extrainformation beiträgt, verbessert sie Sicherheit und Sicherheit. Nehmen Sie zum Beispiel einen einfachen (und naiv) Funktion, die in C geschrieben ist:

interne Nummer strlen (const Rotforelle *s)

{\

interne Nummer iter = 0;

wenn (s == UNGÜLTIG)

kehren Sie 0 zurück;

während (s [iter]! = '\0') {\

iter ++;

}\

geben Sie iter zurück;

}\

</Quelle>

Diese Funktion nimmt an, dass die Schnur, die darin wird passiert, durch NUL begrenzt wird. Jedoch was würde geschehen, wenn zu dieser Schnur passiert würden? Das ist in C vollkommen gesetzlich, noch würde verursachen, um durch das Gedächtnis zu wiederholen, das nicht notwendigerweise mit der Schnur vereinigt ist. Es gibt Funktionen, solcher als, der verwendet werden kann, um solche Probleme zu vermeiden, aber diese Funktionen sind mit jeder Durchführung von ANSI C nicht normal. Die Zyklon-Version dessen ist von der C Version nicht so verschieden:

interne Nummer strlen (const Rotforelle? s)

{\

interne Nummer iter, n = s.size;

wenn (s == UNGÜLTIG)

kehren Sie 0 zurück;

für (iter = 0; iter

Hier, Grenzen sich durch die Länge der Reihe, die dazu passiert ist, so die wirkliche Länge nicht durchsehend. Jede der Arten des Zeigestock-Typs kann zu jedem von anderen sicher geworfen werden, und Reihe und Schnuren werden zu durch den Bearbeiter automatisch geworfen. (Sich von dazu werfend, ruft eine Grenze-Kontrolle an, und sich von dazu werfend, ruft sowohl eine Kontrolle als auch eine Grenze-Kontrolle an. Gussteil davon oder läuft auf keine Kontrollen überhaupt hinaus; der resultierende Zeigestock hat eine Größe 1.)

Baumelnde Zeigestöcke und Gebiet-Analyse

Denken Sie den folgenden Code in C:

Rotforelle *itoa (interne Nummer i)

{\

Rotforelle buf [20];

sprintf (buf," %d", i);

geben Sie buf zurück;

}\</Quelle>

Das gibt einen Gegenstand zurück, der auf dem Stapel der Funktion zugeteilt wird, die nach dem Funktionsumsatz nicht verfügbar ist. Während gcc und andere Bearbeiter über solchen Code warnen werden, wird der folgende normalerweise ohne Warnungen kompilieren:

Rotforelle *itoa (interne Nummer i) {\

Rotforelle buf [20], *z;

sprintf (buf," %d", i);

z = buf;

geben Sie z zurück;

}\</Quelle>

Zyklon tut Regionalanalyse jedes Segmentes des Codes, baumelnde Zeigestöcke wie derjenige verhindernd, der von dieser Version dessen zurückgegeben ist. Wie man betrachtet, sind alle lokalen Variablen in einem gegebenen Spielraum ein Teil desselben Gebiets, das vom Haufen oder jedem anderen lokalen Gebiet getrennt ist. So, wenn er analysiert, würde der Bearbeiter sehen, dass das ein Zeigestock in den lokalen Stapel ist, und einen Fehler ausgeben würde.

Manuelles Speichermanagement

Beispiele

Das beste Beispiel, um damit anzufangen, ist der Klassiker Hallo Weltprogramm:

#include

#include

das Verwenden des Kerns;

int Hauptsache (interne Nummer argc, string_t? args)

{\

wenn (argc

kehren Sie 1 zurück;

}\

printf ("Hallo vom Zyklon, %s\n", args [1]);

kehren Sie 0 zurück;

}\</Quelle>

Siehe auch

Links

Präsentationen:


Versöhnung / Cognitivism
Impressum & Datenschutz