Aller au contenu

Écosystème et outils Rust

L'écosystème outillage de Rust est l'un des plus complets de l'industrie pour un langage système. Le gestionnaire de toolchains rustup, le linter Clippy, le formateur rustfmt et l'analyseur statique cargo-audit sont installes avec la toolchain standard et couvrent la majorité des besoins d'un projet en production.


Gestion des toolchains avec rustup

rustup est le gestionnaire de versions de Rust. Il permet d'installer et de basculer entre différentes toolchains (stable, beta, nightly) et de gérer les cibles de compilation.

# Installation de rustup (Linux / macOS)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Composants installes par defaut
# rustc     — le compilateur
# cargo     — le gestionnaire de paquets et de build
# rustup    — le gestionnaire de toolchains
# rustfmt   — le formateur
# clippy    — le linter

# Gestion des toolchains
rustup show                        # Toolchain active et installee
rustup update                      # Mettre a jour toutes les toolchains
rustup toolchain install nightly   # Installer nightly
rustup default stable              # Definir la toolchain par defaut

# Surcharge par projet — fichier rust-toolchain.toml
# Rustup lira ce fichier et utilisera la version specifiee
# rust-toolchain.toml — fixe la toolchain pour le projet
[toolchain]
channel    = "stable"
date       = "2025-01-01"   # Optionnel : fixe la date exacte
components = ["rustfmt", "clippy", "rust-analyzer"]
targets    = [
    "x86_64-unknown-linux-musl",
    "aarch64-unknown-linux-gnu",
    "wasm32-unknown-unknown",
]
# Gestion des cibles
rustup target add wasm32-unknown-unknown
rustup target add aarch64-unknown-linux-gnu
rustup target list --installed

# Composants optionnels
rustup component add rust-src          # Sources de la stdlib (pour rust-analyzer)
rustup component add rust-docs         # Documentation locale
rustup component add llvm-tools        # Pour cargo-llvm-cov

IDEs et éditeurs

VS Code + rust-analyzer

rust-analyzer est le serveur LSP officiel de Rust. Il fournit la completion, les diagnostics en temps réel, le refactoring et l'inlay hints.

// .vscode/settings.json — configuration recommandee pour un projet Rust
{
    "rust-analyzer.cargo.features": "all",
    "rust-analyzer.checkOnSave": true,
    "rust-analyzer.checkOnSave.command": "clippy",  // Clippy au lieu de check
    "rust-analyzer.inlayHints.typeHints.enable": true,
    "rust-analyzer.inlayHints.parameterHints.enable": true,
    "rust-analyzer.lens.enable": true,  // Boutons Run/Debug au-dessus des tests
    "editor.formatOnSave": true,
    "[rust]": {
        "editor.defaultFormatter": "rust-lang.rust-analyzer"
    }
}

Extensions VS Code recommandees :

Extension Rôle
rust-lang.rust-analyzer LSP officiel — completion, diagnostics, refactoring
vadimcn.vscode-lldb Debugger LLDB (CodeLLDB) — breakpoints, step
tamasfe.even-better-toml Syntax highlighting et validation de Cargo.toml
serayuzgur.crates Versions des dépendances dans Cargo.toml

RustRover

RustRover est l'IDE JetBrains dédié a Rust. Il intégré nativement rust-analyzer, un debugger LLDB et des outils de profiling.

# Installation via JetBrains Toolbox (recommande)
# https://www.jetbrains.com/toolbox-app/

# Fonctionnalites notables :
# - Debug visuel avec breakpoints et inspection de l'ownership
# - Profiling integre (flamegraph, allocation sampling)
# - Support cargo workspace natif
# - Refactoring avance (rename, extract function, inline)

Formatage et linting

rustfmt

# Formater tout le projet
cargo fmt

# Verifier sans modifier (CI)
cargo fmt -- --check

# Formater un fichier specifique
rustfmt src/main.rs
# rustfmt.toml — configuration avancee
edition                  = "2024"
max_width                = 100
tab_spaces               = 4
newline_style            = "Unix"
imports_granularity      = "Crate"
group_imports            = "StdExternalCrate"
use_field_init_shorthand = true
use_try_shorthand        = true   # foo? plutot que try!(foo)

Clippy — lint groups

// src/lib.rs ou src/main.rs — activation des groupes de lints

// Niveau minimal recommande pour tout projet
#![warn(clippy::all)]

// Niveau pedantique — idiomes avances
#![warn(clippy::pedantic)]

// Lints de performance — allocations evitables
#![warn(clippy::perf)]

// Desactiver un lint specifique quand c'est justifie
#[allow(clippy::too_many_arguments)]  // Justification requise en commentaire
pub fn fonction_avec_beaucoup_de_params(/* ... */) {}
# Lancer Clippy sur tout le workspace
cargo clippy --workspace --all-targets --all-features

# Clippy avec tous les lints pedantiques
cargo clippy -- -W clippy::pedantic

# Afficher les lints disponibles
cargo clippy -- -W clippy::all -W clippy::pedantic 2>&1 | grep "warning\["

Groupes de lints Clippy :

Groupe Description Recommandation
correctness Bugs probables — active par défaut, erreurs compilation Toujours actif
style Style et lisibilite Toujours actif
perf Optimisations d'allocation et de performance Recommande
pedantic Idiomes avances, parfois strict Projets serieux
nursery Lints experimentaux, peuvent changer Optionnel
restriction Lints opiniones (p.ex. interdire unwrap) Sur besoin

Analyse statique et sécurité

cargo-audit

# Installer cargo-audit
cargo install cargo-audit

# Verifier les vulnerabilites connues dans les dependances
cargo audit

# Rapport au format JSON
cargo audit --json

# Integrer dans CI — echoue si CVE detectee
cargo audit --deny warnings

cargo-deny

cargo install cargo-deny
cargo deny init     # Cree deny.toml
cargo deny check    # Verifie licences, CVE, doublons de dependances
# deny.toml — configuration
[licenses]
allow = ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "Unicode-DFS-2016"]
deny  = ["GPL-3.0"]  # Rejeter les licences copyleft

[advisories]
db-path    = "~/.cargo/advisory-db"
db-urls    = ["https://github.com/rustsec/advisory-db"]
vulnerability = "deny"
unmaintained  = "warn"

[bans]
multiple-versions = "warn"   # Avertir si une dependance est presente en plusieurs versions

Miri — détection de comportement indefini

Miri est un interpréteur pour le MIR (Mid-level Intermediate Représentation) de Rust. Il détecté les comportements indefinis dans le code unsafe.

# Installation via rustup (necessite nightly)
rustup +nightly component add miri

# Lancer les tests sous Miri
cargo +nightly miri test

# Verifier un binaire
cargo +nightly miri run

Miri et le code unsafe

Miri détecté les use-after-free, les alignements incorrects, les lectures de mémoire non initialisee et les violations de l'aliasing model de Rust (Stacked Borrows). Il est indispensable pour tout crate qui expose du code unsafe. La couverture n'est pas totale : Miri ne peut pas simuler les syscalls système ni les interactions avec des bibliotheques C natives.


Debuggers

VS Code + CodeLLDB

// .vscode/launch.json — configuration de debug
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug mon-service",
            "cargo": {
                "args": ["build", "--bin=mon-service"],
                "filter": { "name": "mon-service", "kind": "bin" }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "env": {
                "RUST_LOG": "debug",
                "DATABASE_URL": "sqlite::memory:"
            }
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug tests",
            "cargo": {
                "args": ["test", "--no-run", "--lib"],
                "filter": { "name": "mon-service-lib", "kind": "lib" }
            },
            "args": []
        }
    ]
}

rust-gdb et rust-lldb

# rust-gdb — GDB avec pretty-printers pour les types Rust
rust-gdb target/debug/mon-service

# Commandes GDB utiles dans le contexte Rust
# b src/main.rs:42     — breakpoint sur la ligne 42
# p variable           — afficher une variable (avec pretty-print Rust)
# bt                   — backtrace
# n                    — next (pas a pas)
# c                    — continue

# rust-lldb — LLDB avec pretty-printers
rust-lldb target/debug/mon-service

Profilers

perf + flamegraph

# Installation flamegraph
cargo install flamegraph

# Generer un flamegraph (necessite perf sur Linux)
cargo flamegraph --bin mon-service

# Ouvrir flamegraph.svg dans le navigateur
# Les frames les plus larges = fonctions les plus couteuses en CPU

cargo-instruments (macOS uniquement)

# Installation
cargo install cargo-instruments

# Profiling CPU (Time Profiler)
cargo instruments --template "Time Profiler" --bin mon-service

# Profiling allocations
cargo instruments --template Allocations --bin mon-service

# Ouvre automatiquement Instruments.app

Dhat — profiling des allocations heap

# Cargo.toml — [dev-dependencies]
# dhat = "0.3"

# src/main.rs (uniquement en mode profiling)
#[cfg(feature = "profiling")]
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;

fn main() {
    #[cfg(feature = "profiling")]
    let _profiler = dhat::Profiler::new_heap();

    // ... code de l'application ...
}
# Lancer avec profiling heap
cargo run --features profiling

# Generer le rapport
# dhat-heap.json est genere a la sortie du programme
# Visualiser avec https://nnethercote.github.io/dh_view/dh_view.html

Outils cargo essentiels

Outil Installation Usage
cargo-watch cargo install cargo-watch Relance cargo à chaque modification de fichier
cargo-expand cargo install cargo-expand Développé les macros pour inspection
cargo-tree Intégré dans cargo Affiche le graphe de dépendances
cargo-outdated cargo install cargo-outdated Dépendances avec mises à jour disponibles
cargo-machete cargo install cargo-machete Détecté les dépendances inutilisees
cargo-bloat cargo install cargo-bloat Identifie les fonctions qui gonflent le binaire
cargo-udeps cargo install cargo-udeps Dépendances non utilisées (nightly requis)
# cargo-watch — developpement avec rechargement automatique
cargo watch -x "test -- --nocapture"
cargo watch -x "run"
cargo watch -x "clippy"

# cargo-expand — inspecter ce que les macros generate
cargo expand item  # Developpe le module item
cargo expand       # Developpe tout le crate

# cargo-bloat — identifier les gros contributeurs a la taille du binaire
cargo bloat --release --crates   # Par crate
cargo bloat --release -n 20      # Top 20 fonctions les plus lourdes

cargo-watch en développement

La combinaison cargo watch -x "clippy --all-targets" donne un feedback immédiat à chaque sauvegarde. Clippy intégré les diagnostics de cargo check — il n'est donc pas nécessaire de lancer les deux séparément. Sur un SSD moderne, le cycle edit-clippy prend moins d'une seconde pour les modifications locales grâce à la compilation incrementale.