Wie garantiert Rust Speichersicherheit und verhindert Segmentierungen?

8

Ich habe nach einer Sprache gesucht, die ich lernen kann, und ich habe gesehen, dass Rust ziemlich populär wird.

Zwei Dinge haben mich an Rust beeindruckt, Speichersicherheit und Vermeidung von Segfaults.

Wie erreicht Rust das? Welche Unterschiede zwischen Rust und Java ermöglichen zum Beispiel die Sicherheitsmerkmale von Rust?

    
Myra 21.03.2016, 16:11
quelle

1 Antwort

16

Wie Rust Speichersicherheit erreicht, ist in seinem Kern eigentlich ziemlich einfach. Es hängt hauptsächlich von zwei Prinzipien ab: Eigentum und Kreditaufnahme.

Eigentümer

Der Compiler verwendet ein affines System, um die Eigentumsrechte an jedem Wert zu verfolgen: Ein Wert kann höchstens einmal verwendet werden, danach verweigert der Compiler die erneute Verwendung.

%Vor%

ergibt einen Fehler:

%Vor%

Dies verhindert insbesondere das gefürchtete doppelt-freie , das in C oder C ++ (vor Smartpointern) regelmäßig vorkommt.

Ausleihe

Die Beleuchtung, die von Rust kommt, ist, dass Speicherprobleme auftreten, wenn man Aliasing und Veränderlichkeit mischt: wenn ein einzelnes Stück Speicher über mehrere Pfade zugänglich ist und mutiert (oder wegbewegt) wird, bleibt baumeln Zeiger .

Der Kern der Borrow-Prüfung lautet daher: Mutability XOR Aliasing . Es ist im Prinzip einem Read-Write-Lock ähnlich.

Dies bedeutet, dass der Rust-Compiler Aliasing Informationen verfolgt, für die er die Lebenszeitanmerkungen ( 'a in &'a var ) verwendet, um die Lebensdauer von Referenzen zu verbinden und der Wert, auf den sie sich beziehen.

Ein Wert wird ausgeliehen, wenn jemand einen Verweis darauf oder INTO hat (z. B. ein Verweis auf ein Feld eines struct oder auf ein Element einer Sammlung). Ein geliehener Wert kann nicht verschoben werden.

Mutabilität (ohne Aliasing)

Sie können zu jedem Zeitpunkt nur eine einzige veränderbare Referenz ( &mut T ) in einen gegebenen Wert aufnehmen, und in diesen Wert darf keine unveränderliche Referenz vorhanden sein Zeit; Es garantiert Ihnen, dass Sie exklusiven Zugang zu diesem Leckerbissen des Gedächtnisses haben und Sie können es so sicher mutieren.

Aliasing (ohne Änderbarkeit)

Sie können jederzeit mehrere unveränderliche Referenzen ( &T ) in einen gegebenen Wert aufnehmen. Sie können jedoch nichts durch diese Referenzen (*) mutieren.

(*) Ich lüge; Es gibt Strukturen wie RefCell , die "innere Veränderlichkeit" implementieren; Sie berücksichtigen zwar das Mutability-XOR-Aliasing-Prinzip, verschieben die Prüfung jedoch stattdessen auf die Laufzeit.

Das ist es?

Fast so;)

Es ist bereits ziemlich kompliziert, für die Compiler-Writer zu implementieren, und kann die Benutzer übermäßig beschränken (einige Programme, die sicher sein würden, können nicht sicher mit diesem System getestet werden, müssen durch die Ringe springen), aber die Kernprinzipien sind wirklich so einfach.

Was bleibt übrig?

Grenzen prüfen. Es ist keine Raketenwissenschaft, kann aber eine Leistungseinbuße verursachen. Die meisten Sprachen haben einen gewissen Grad an Unterstützung dafür, C ist die große Ausnahme und C ++ hat einige Unterstützung dafür, obwohl es optional ist.

    
Matthieu M. 21.03.2016, 17:04
quelle