Sto scrivendo del codice Rust che manipola i puntatori grezzi. Questi puntatori grezzi vengono quindi esposti agli utenti attraverso strutture che utilizzano ContravariantLifetime per legare la durata della struttura al mio oggetto.Posso scrivere test per vite non valide?
Mi piacerebbe essere in grado di scrivere test che convalidino che le strutture rivolte all'utente non possono vivere più a lungo del mio oggetto. Ho codice come il seguente:
fn element_cannot_outlive_parts() {
let mut z = {
let p = Package::new();
p.create() // returns an object that cannot live longer than p
};
}
Questo non riesce a compilare, che è esattamente quello che voglio. Tuttavia, mi piacerebbe avere qualche controllo automatico che questo comportamento sia vero anche dopo qualsiasi refactoring che faccio al codice.
Al momento, la mia migliore idea è quella di scrivere file Rust unici con questo codice e di configurare gli script di bash per tentare di compilarli e cercare specifici messaggi di errore, il che sembra abbastanza pericoloso.
Purtroppo, non è disponibile il supporto nativo per i test per la compilazione non riuscita. rugc stesso ha un'infrastruttura per raggiungere questo ('src/test/compile-fail' et al.), ma è personalizzato e non è generalmente disponibile. –
@ChrisMorgan: Credi che ci sarebbe interesse per la comunità per supportare questo tipo di test? Rust ha un sistema di tipi molto evoluto che consente di imporre molti controlli e sembra opportuno verificare che i controlli siano effettivamente applicati. In passato, con C++, ho usato i test specifici di Clang (flag '-verify' + commenti specifici di Clang) per questo genere di cose; è abbastanza avanzato. –
@MatthieuM .: So che mi piacerebbe che, durante la progettazione di una libreria, fossero eseguiti test per verificare che un determinato codice non venisse compilato. –