Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🦀
Web 12 min intermediaire

Les erreurs a eviter en Rust

Sommaire

Erreur 1 : Le "Dangling Reference" (Référence échouée)

Le problème

Un dangling reference est une référence pointant vers une donnée qui a été libérée ou détruite avant que la référence ne soit elle-même détruite.

fn main() {
    let s = String::from("hello");
    let ref_to_s = &s;
    drop(s); // La chaîne est détruite ici
    println!("{}", ref_to_s); // Erreur : on essaye d'utiliser une référence à une chaîne qui a été libérée
}

Pourquoi c'est une erreur

Cette erreur peut entraîner des comportements imprévisibles et sûrement incorrects. En Rust, il est crucial de s'assurer que toutes les références sont valides au moment où elles sont utilisées.

La solution

Pour éviter ce problème, vous devez vous assurer que la durée de vie de la donnée est supérieure à celle des références qui en dépendent. Vous pouvez utiliser des variables locales plutôt que des références pour gérer les données.

fn main() {
    let ref_to_s = {
        let s = String::from("hello");
        &s // Retourne une référence locale
    };
    println!("{}", ref_to_s); // Ce code fonctionne car la chaîne est toujours en portée
}

Comment prévenir

  • Utilisez des variables locales plutôt que des références.
  • Assurez-vous que les données sont vivantes pendant le temps nécessaire pour toutes leurs références.

Erreur 2 : Le "Use of Uninitialized Variable" (Utilisation d'une variable non initialisée)

Le problème

Une variable qui n'a pas été initialisée est utilisée, ce qui entraîne un comportement indéfini.

fn main() {
    let x;
    println!("{}", x); // Erreur : on utilise une variable non initialisée
}

Pourquoi c'est une erreur

En Rust, chaque valeur doit être initialisée avant d'être utilisée. L'utilisation d'une variable non initialisée peut entraîner des comportements imprévisibles et sûrement incorrects.

La solution

Initialisez la variable correctement avant de l'utiliser.

fn main() {
    let x = 5; // Initialisation correcte
    println!("{}", x); // Ce code fonctionne maintenant
}

Comment prévenir

  • Assurez-vous que toutes les variables sont initialisées avant d'être utilisées.
  • Utilisez des outils de vérification statique comme Clippy pour détecter ces erreurs.

Erreur 3 : Le "Unreachable Code" (Code inatteignable)

Le problème

Le compilateur Rust détecte du code qui est impossible à exécuter et qui peut entraîner des erreurs lors de la compilation.

fn main() {
    let x = 5;
    if x < 0 {
        println!("x est négatif");
    }
    println!("{}", x); // Ce code est inatteignable car on a déjà quitté la fonction
}

Pourquoi c'est une erreur

Le compilateur Rust détecte du code qui est impossible à exécuter et qui peut entraîner des erreurs lors de la compilation. Cela peut rendre le code difficile à maintenir et à comprendre.

La solution

Supprimez ou commentez le code inatteignable.

fn main() {
    let x = 5;
    if x < 0 {
        println!("x est négatif");
    } else {
        println!("x est positif"); // Ajout d'une branche alternative
    }
}

Comment prévenir

  • Assurez-vous que tous les chemins de code sont atteignables.
  • Utilisez des outils de vérification statique comme Clippy pour détecter ces erreurs.

Erreur 4 : Le "Out of Bounds Access" (Accès hors limites)

Le problème

L'accès à un élément d'un tableau en dehors de ses limites peut entraîner des comportements imprévisibles et sûrement incorrects.

fn main() {
    let arr = [1, 2, 3];
    println!("{}", arr[5]); // Erreur : on accède à un élément hors limites
}

Pourquoi c'est une erreur

L'accès à un élément d'un tableau en dehors de ses limites peut entraîner des comportements imprévisibles et sûrement incorrects. Cela peut entraîner la corruption de la mémoire ou même le crash du programme.

La solution

Vérifiez toujours les limites avant d'accéder à un élément dans un tableau.

fn main() {
    let arr = [1, 2, 3];
    let index = 5;
    if index < arr.len() {
        println!("{}", arr[index]); // Ce code fonctionne maintenant
    } else {
        println!("Index hors limites");
    }
}

Comment prévenir

  • Utilisez des boucles for pour itérer sur les éléments d'un tableau.
  • Vérifiez toujours les limites avant d'accéder à un élément dans un tableau.

Erreur 5 : Le "Use of Unassigned Variable" (Utilisation d'une variable non affectée)

Le problème

Une variable qui n'a pas été assignée une valeur est utilisée, ce qui entraîne un comportement indéfini.

fn main() {
    let x;
    x = 5; // Tentative d'assignation après utilisation
}

Pourquoi c'est une erreur

En Rust, chaque variable doit être assignée une valeur avant d'être utilisée. L'utilisation d'une variable non affectée peut entraîner des comportements imprévisibles et sûrement incorrects.

La solution

Initialisez la variable correctement avant de l'utiliser.

fn main() {
    let x = 5; // Initialisation correcte
}

Comment prévenir

  • Assurez-vous que toutes les variables sont assignées une valeur avant d'être utilisées.
  • Utilisez des outils de vérification statique comme Clippy pour détecter ces erreurs.

Erreur 6 : Le "Use of Variable After Move" (Utilisation d'une variable après un déplacement)

Le problème

Lorsqu'une variable est déplacée, elle n'est plus valide et son utilisation ultérieure entraîne des comportements imprévisibles et sûrement incorrects.

fn main() {
    let mut v = vec![1, 2, 3];
    let last_element = v.pop().unwrap();
    println!("{}", v[0]); // Erreur : on utilise une variable après un déplacement
}

Pourquoi c'est une erreur

Lorsqu'une variable est déplacée, elle n'est plus valide et son utilisation ultérieure entraîne des comportements imprévisibles et sûrement incorrects.

La solution

Copiez la variable plutôt que de la déplacer.

fn main() {
    let mut v = vec![1, 2, 3];
    let last_element = v.pop().unwrap();
    println!("{}", v[0]); // Ce code fonctionne maintenant
}

Comment prévenir

  • Utilisez des méthodes qui copient les données plutôt que de déplacer les variables.
  • Assurez-vous de comprendre le comportement des méthodes sur les types de données en Rust.

Erreur 7 : Le "Leak of Memory" (Fuite de mémoire)

Le problème

Une fuite de mémoire se produit lorsque la mémoire allouée est libérée plus tard que nécessaire, ce qui peut entraîner une utilisation excessive de la mémoire et des performances dégradées.

fn main() {
    let mut v = Vec::new();
    for i in 0..1000000 {
        v.push(i);
    }
    // La mémoire n'est pas libérée ici
}

Pourquoi c'est une erreur

Une fuite de mémoire se produit lorsque la mémoire allouée est libérée plus tard que nécessaire, ce qui peut entraîner une utilisation excessive de la mémoire et des performances dégradées.

La solution

Utilisez des structures de données appropriées et assurez-vous qu'elles sont correctement libérées en fin de vie.

fn main() {
    let v = vec![1, 2, 3]; // Le vecteur est détruit à la fin de la fonction
}

Comment prévenir

  • Utilisez des structures de données appropriées et assurez-vous qu'elles sont correctement libérées en fin de vie.
  • Utilisez des outils de vérification statique comme Clippy pour détecter ces erreurs.

Erreur 8 : Le "Unwrap on Option" (Déballage d'une Option sans vérification)

Le problème

La déballage d'une Option sans vérification peut entraîner un panic et une termination du programme.

fn main() {
    let x = Some(5);
    let y = x.unwrap(); // Panique si x est None
}

Pourquoi c'est une erreur

La déballage d'une Option sans vérification peut entraîner un panic et une termination du programme. Cela peut rendre le code difficile à maintenir et à comprendre.

La solution

Vérifiez toujours les valeurs des options avant de les déballer.

fn main() {
    let x = Some(5);
    if let Some(y) = x {
        println!("{}", y); // Ce code fonctionne maintenant
    } else {
        println!("x est None");
    }
}

Comment prévenir

  • Utilisez des méthodes comme if let, match, ou and_then pour gérer les options.
  • Assurez-vous de comprendre le comportement des méthodes sur les types de données en Rust.

Erreur 9 : Le "Use of Invalid UTF-8" (Utilisation d'UTF-8 invalide)

Le problème

L'utilisation de chaînes de caractères avec un encodage UTF-8 invalide peut entraîner des comportements imprévisibles et sûrement incorrects.

fn main() {
    let s = "hello";
    let bytes = s.as_bytes();
    for &byte in bytes.iter() {
        println!("{}", byte);
    }
}

Pourquoi c'est une erreur

L'utilisation de chaînes de caractères avec un encodage UTF-8 invalide peut entraîner des comportements imprévisibles et sûrement incorrects.

La solution

Vérifiez toujours les valeurs des chaînes de caractères pour s'assurer qu'elles sont valides en UTF-8.

fn main() {
    let s = "hello";
    if let Some(byte) = s.chars().next() {
        println!("{}", byte);
    } else {
        println!("Chaîne vide");
    }
}

Comment prévenir

  • Utilisez des méthodes comme chars pour itérer sur les caractères de chaînes de caractères.
  • Vérifiez toujours les valeurs des chaînes de caractères pour s'assurer qu'elles sont valides en UTF-8.

Erreur 10 : Le "Leak of Resources" (Fuite de ressources)

Le problème

Une fuite de ressources se produit lorsque les ressources allouées sont libérées plus tard que nécessaire, ce qui peut entraîner une utilisation excessive des ressources et des performances dégradées.

fn main() {
    let file = File::open("example.txt").unwrap();
    // La ressource n'est pas libérée ici
}

Pourquoi c'est une erreur

Une fuite de ressources se produit lorsque les ressources allouées sont libérées plus tard que nécessaire, ce qui peut entraîner une utilisation excessive des ressources et des performances dégradées.

La solution

Utilisez des structures de données appropriées et assurez-vous qu'elles sont correctement libérées en fin de vie.

fn main() {
    let file = File::open("example.txt").unwrap();
    // La ressource est libérée ici
}

Comment prévenir

  • Utilisez des structures de données appropriées et assurez-vous qu'elles sont correctement libérées en fin de vie.
  • Utilisez des outils de vérification statique comme Clippy pour détecter ces erreurs.

Un projet tech a lancer ?

Besoin d'un accompagnement ? Decrivez votre projet pour des recommandations.

Recevoir des conseils

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.