DedSec Project

E0597 — DedSec Project

Rust E0597 — δανεισμένη τιμή που δεν ζει αρκετά Μη έγκυρη διάρκεια ζωής Ένα reference δεν μπορεί να ζει περισσότερο από τον owner. Αν μια συνάρτηση επιστρέψει pointer προς δικό της…

Rust E0597 — δανεισμένη τιμή που δεν ζει αρκετά

Μη έγκυρη διάρκεια ζωής

Ένα reference δεν μπορεί να ζει περισσότερο από τον owner. Αν μια συνάρτηση επιστρέψει pointer προς δικό της προσωρινό String, η μνήμη δεν παραμένει έγκυρη μετά την επιστροφή. Τα lifetime annotations δεν παρατείνουν τη ζωή των δεδομένων.

// fn broken<'a>() -> &'a str {
//     let local = String::from("temporary");
//     &local // αναφορά προς κατεστραμμένη τιμή
// }

fn owned() -> String {
    String::from("persistent")
}
fn main() {
    let text = owned();
    let view: &str = &text;
    assert_eq!(view, "persistent");
}

Δανείσου από τον caller

Αν η έξοδος πρέπει να παραπέμπει σε υπάρχον argument, δήλωσε αυτή τη σχέση:

fn first_word(input: &str) -> &str {
    input.split_whitespace().next().unwrap_or("")
}

Το &str ισχύει μόνο όσο υπάρχει το αρχικό input. Αν ο caller χρειάζεται την τιμή μετά το τέλος του input, πρέπει να πάρει owned String.

Πείραμα

Κάλεσε first_word από long-lived String και προσπάθησε να κρατήσεις borrow έξω από το scope. Δες diagnostic και άλλαξε API, όχι την παράμετρο σε πλαστό static lifetime. Δοκίμασε και struct που αποθηκεύει borrowed view ή owned String.

Πηγή: https://doc.rust-lang.org/error_codes/E0597.html

Lifetime ως σχέση ανάμεσα στα δεδομένα

Δοκίμασε με τη συνάρτηση first_word τα "", "Ada Lovelace" και " Alan"· οι αναμενόμενες τιμές είναι "", "Ada" και "Alan". Ο επιστρεφόμενος &str δεν αποθηκεύει νέο κείμενο: δείχνει σε κομμάτι της εισόδου. Αν θες να βάλεις την πρώτη λέξη σε cache η οποία ζει μετά τη διαγραφή του input, μετέτρεψε το αποτέλεσμα σε String μέσω .to_owned(). Ένα string literal μπορεί να έχει 'static lifetime, αλλά η αναφορά σε δυναμικό String όχι. Μη χρησιμοποιείς πλασματικό 'static annotation για να σβήσεις το diagnostic: δεν δεσμεύει νέα μνήμη και δεν μεταβάλλει τον πραγματικό owner.