rust-compiler-diagnostics

Par mkurman · zorai

À utiliser lorsque le code Rust ne compile pas, que Clippy signale des lints, que des erreurs du borrow checker apparaissent, que les lifetimes sont obscures, ou que les diagnostics cargo nécessitent un triage systématique.

npx skills add https://github.com/mkurman/zorai --skill rust-compiler-diagnostics

Diagnostics du compilateur Rust

Utilise cette skill pour résoudre les diagnostics du compilateur Rust et Clippy sans deviner.

Workflow

  1. Exécute la commande la plus ciblée qui reproduit le diagnostic, généralement cargo check -p <crate> ou un test focalisé.
  2. Lis la première vraie erreur du compilateur avant les erreurs secondaires ; les diagnostics ultérieurs sont souvent des conséquences.
  3. Identifie la catégorie impliquée : ownership, lifetime, type, trait, macro, feature ou lint.
  4. Inspecte le site de définition et l'appelant le plus proche avant d'éditer.
  5. Préfère modifier la forme de l'API seulement quand le contrat actuel est la vraie cause.
  6. Réexécute la même commande après chaque correction, puis élargis la vérification quand la commande ciblée est clean.

Triage du Borrow Checker

  • Trouve qui possède la valeur, qui l'emprunte, et combien de temps chaque emprunt doit réellement vivre.
  • Réduis la portée d'emprunt avec des blocs, des variables locales, ou une extraction plus tôt avant d'ajouter des clones.
  • Sépare les données immutables de l'état mutable quand un grand struct emprunté bloque l'accès indépendant.
  • Déplace le travail coûteux ou faillible en dehors des lock guards et des emprunts mutables.
  • Utilise des valeurs possédées pour les tâches spawned et le travail cross-thread ; les références s'adaptent rarement à ces lifetimes.

Exemples de réparation de diagnostic

Terminer un emprunt avant une mutation

// Évite : `self.items` est emprunté immutablement pendant la mutation de `self`.
if let Some(item) = self.items.get(id) {
    self.record_access(item.name());
}

// Préfère : extrais la valeur possédée nécessaire, en terminant l'emprunt.
let name = self.items.get(id).map(|item| item.name().to_owned());
if let Some(name) = name {
    self.record_access(&name);
}

Extraire un champ en toute sécurité

if let Some(task) = self.pending_task.take() {
    task.cancel().await;
}

Utilise Option::take quand un champ doit être extrait tout en laissant la struct dans un état valide.

Corriger un emprunt qui s'échappe dans les tâches spawned

// Évite : `&self` ne peut pas être déplacé dans une tâche 'static.
tokio::spawn(async move {
    self.refresh().await;
});

// Préfère : clone le handle possédé nécessaire pour la tâche.
let client = self.client.clone();
tokio::spawn(async move {
    client.refresh().await;
});

Triage Clippy

  • Traite Clippy comme du feedback de conception, pas seulement du feedback de style.
  • Accepte les suggestions de Clippy quand elles préservent la lisibilité et le comportement.
  • Ajoute #[allow(...)] seulement près de la plus petite portée et inclus une courte raison quand le lint est intentionnellement violé.
  • Ne silence pas unwrap_used, expect_used, panic, ou les lints de conversion avec perte dans les chemins de production sans confirmer la politique du projet.

Préfère les allows ciblés

#[allow(clippy::too_many_arguments, reason = "constructor mirrors the wire protocol fields")]
pub fn from_wire(/* fields */) -> Self {
    // ...
}

Références

Lis references/error-triage.md pour les familles de diagnostics communes et les patterns de réparation.

Skills similaires