Eine Stapelinspektion ist erforderlich, da Programme auf der JVM und der CLR standardmäßig Zugriff auf gefährliche Vorgänge haben. Daher muss etwas unternommen werden, um Katastrophen zu verhindern. Beispielsweise kann ein nicht vertrauenswürdiges Programm auf eine E / A-Bibliothek verweisen und diese aufrufen:
using IO;
...
IO.DeleteFile("/home/foo/bla");
Daher müssen wir bei jeder gefährlichen Operation prüfen, ob sie zulässig ist. Bei der Stapelinspektion ist es im Allgemeinen schwierig zu verstehen, wer Zugriff auf was erhält. Dies erschwert auch Optimierungen wie Inlining und Tail Calls.
Ein überlegener Mechanismus besteht darin, nicht jedem Programm überhaupt automatischen Zugriff auf gefährliche Vorgänge zu gewähren. In diesem Modell gibt es keine Möglichkeit, eine E / A-Bibliothek zu importieren. Der einzige Weg, um auf eine E / A-Bibliothek zuzugreifen, besteht darin, sie Ihnen von jemand anderem zu geben. Dies wird als Fähigkeitssicherheit bezeichnet. Eine Einführung finden Sie hier .
Stattdessen würden wir das vorherige Programm folgendermaßen schreiben:
Main(IOLibrary IO){
IO.DeleteFile("/home/foo/bla");
}
Die E / A-Bibliothek ist ein Parameter für den Einstiegspunkt des Programms, und dies wird als Funktion bezeichnet (da sie eine gewisse Funktion zum Ausführen von E / A bietet). Um dieses Programm ausführen zu können, müssen wir selbst Zugriff auf eine E / A-Funktion haben und das Programm durch Aufrufen ausführen Main(ourIOlibrary)
. Wenn wir ein nicht vertrauenswürdiges Programm ausführen, übergeben wir unsere E / A-Bibliothek einfach nicht daran, da diese Bibliothek möglicherweise zum Löschen unserer Dateien verwendet wird. In einigen Fällen möchten wir einem nicht vertrauenswürdigen Programm eingeschränkten Zugriff auf das Dateisystem gewähren. In diesem Fall erstellen wir einen Wrapper um unsere eigene E / A-Bibliothek, der nur den Zugriff auf ein bestimmtes Verzeichnis ermöglicht, und übergeben diesen an das nicht vertrauenswürdige Programm anstelle der vollständigen E / A-Bibliothek
Wenn wir also eine E / A-Funktion benötigen, um ein Programm aufzurufen, das eine E / A-Funktion benötigt, bedeutet dies auch, dass alles, was unser Programm aufgerufen hat, Zugriff auf eine E / A-Funktion benötigt, um es uns geben zu können. Woher kam also die E / A-Fähigkeit? Nun, irgendwann gibt es einen Punkt, an dem der Mensch, der den Computer bedient, ein Programm aufruft. Dieser Mensch hat Zugriff auf alle Systemfunktionen, sodass er die E / A-Funktion weitergeben konnte. Wenn dieser Mensch dem von ihm ausgeführten Programm nicht vertraut, gibt er seine E / A-Fähigkeit einfach nicht an ihn weiter.
Sie können sich wahrscheinlich leicht andere Arten von Funktionen vorstellen: Internetzugang, Zugriff auf Zeichenbilder auf Ihrem Bildschirm usw. Beispielsweise kann ein sicheres Browser-Plugin-System einem nicht vertrauenswürdigen Plugin eine Grafikfunktion verleihen, mit der nur Grafiken in einem vordefinierten Rechteck gezeichnet werden können auf der Seite.