Rust Panikbehandlung und Arbeitsspeichersicherheit

RustRustBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen wir über die panic!-Makro in Rust, das verwendet werden kann, um einen Fehler zu erzeugen und den Stapel zu entspannen, was dazu führt, dass das Programm die Fehlermeldung ausgibt und beendet wird. Die Laufzeit kümmert sich darum, alle von einem Thread besitzten Ressourcen freizugeben, indem sie den Destruktor seiner Objekte aufruft. Wir betrachten auch ein Beispiel für die Verwendung des panic!-Makros, um Division durch Null zu behandeln, und überprüfen, dass dies keine Speicherlecks verursacht, indem wir Valgrind verwenden.

Hinweis: Wenn im Lab kein Dateiname angegeben ist, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.

panic!

Das panic!-Makro kann verwendet werden, um einen Fehler zu erzeugen und den Stapel zu entspannen. Während des Entspannens kümmert sich die Laufzeit darum, alle von einem Thread besitzten Ressourcen freizugeben, indem sie den Destruktor aller seiner Objekte aufruft.

Da wir mit Programmen arbeiten, die nur einen Thread haben, wird panic! dazu führen, dass das Programm die Fehlermeldung ausgibt und beendet wird.

// Re-Implementierung der ganzzahligen Division (/)
fn division(dividend: i32, divisor: i32) -> i32 {
    if divisor == 0 {
        // Division durch Null löst einen Fehler aus
        panic!("division by zero");
    } else {
        dividend / divisor
    }
}

// Die `main`-Aufgabe
fn main() {
    // Heap-zugewiesene Ganzzahl
    let _x = Box::new(0i32);

    // Diese Operation wird einen Fehler im Task auslösen
    division(3, 0);

    println!("Dieser Punkt wird nicht erreicht!");

    // `_x` sollte zu diesem Zeitpunkt zerstört werden
}

Lassen Sie uns überprüfen, dass panic! keinen Speicher verliert.

<!-- REUSE-IgnoreStart -->
<!-- Verhindert, dass REUSE die Copyright-Zeile im Beispielcode auswertet -->
$ rustc panic.rs && valgrind./panic
==4401== Memcheck, a memory error detector
==4401== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==4401== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==4401== Command:./panic
==4401==
thread '<main>' panicked at 'division by zero', panic.rs:5
==4401==
==4401== HEAP SUMMARY:
==4401==     in use at exit: 0 bytes in 0 blocks
==4401==   total heap usage: 18 allocs, 18 frees, 1,648 bytes allocated
==4401==
==4401== All heap blocks were freed -- no leaks are possible
==4401==
==4401== For counts of detected and suppressed errors, rerun with: -v
==4401== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
<!-- REUSE-IgnoreEnd -->

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab Panic! abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.