Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

Selon rust-reference, l'existence d'UB est considéré comme une erreur.

Par exemple 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).

La liste actuelle des UB est donnée dans la référence Rust. On notera les garanties 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é quelque 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 nomicon pour des exemples): une référence mutable ne peux être partagée.
  • Pas d'accès concurrent (un accès en lecture et un autre en écriture ou en lecture) à la même adresse mémoire (voir aussi le nomicon pour des exemples)

Garantie de Rust

La volonté du langage est d'assurer l'absence d'UB dans un programme utilisant uniquement la partie non unsafe de Rust.

Cependant, le langage ne protège pas contre les erreurs suivantes :

  • fuites de resources (mémoire, IO, ...) (voir la section sur la gestion mémoire) ;
  • dépassements numériques (voir la section sur le traitement des entiers).

Références