Garanties du langage
Comportements indéfinis
Le comportement d'un programme est indéfini (UB pour Undefined Behavior) lorsque sa sémantique n'est pas décrite dans le langage Rust.
L'existence d'UB est considéré comme une erreur de programmation et doit être évitée.
Le déréférencement d'un pointeur null est un UB.
A contrario, un unwrap sur l'objet None est bien défini, car c'est le langage qui traite cette erreur
(en lançant un panic).
Une liste d'erreurs de programmation conduisant à un UB est donnée dans la référence Rust. Parmi elles, on notera les erreurs suivantes :
- Pas de déréférencement de pointeur vers une adresse mémoire non allouée (dangling pointer) ou non alignée, ce qui implique
- Pas de dépassement de tableau ;
- Pas d'accès à de la mémoire libérée ;
- Accès toujours aligné quelle que soit la plateforme.
- Les valeurs pointées sont cohérentes avec le type du pointeur. Par exemple, une valeur pointée par un pointeur booléen sera l'octet 1 ou 0.
- Respect des règles d'aliasing (voir aussi le Rustonomicon pour des exemples): une référence mutable ne peut être partagée.
- Pas d'accès concurrent (deux accès simultanés non atomiques, l'un en écriture et l'autre en écriture ou en lecture) à la même adresse mémoire (voir aussi le Rustonomicon pour des exemples).
Garantie de Rust
Le langage Rust est conçu dans le but de garantir l'absence d'UB dans un programme n'utilisant pas de fonctionnalités unsafe.
On notera que cette garantie qu'offre le langage Rust ne protège pas contre les erreurs suivantes :
- fuites de resources (mémoire, I/O, etc.) (voir la section sur la gestion mémoire) ;
- dépassements numériques (voir la section sur le traitement des entiers).
Références
- The Rust Reference (rust-reference)
- The Rustonomicon (nomicon)