Suppression du Code Mort - Guide technique pour développeurs – Tous langages

Publié le 13/01/2026 par Frédéric dans la catégorie "Bonnes Pratiques"

Le code mort désigne tout élément du code source qui n'est ni exécuté, ni appelé, mais reste présent dans la base. Cela inclut :

  • Fonctions/méthodes non utilisées
  • Variables déclarées mais jamais lues
  • Imports/modules inutilisés
  • Fichiers orphelins (non référencés)
  • Branches de code inatteignables (ex : if (false))
  • Commentaires ou annotations obsolètes

Problèmes concrets :

  • Sécurité : Code vulnérable oublié (ex : fonctions de debug exposées).
  • Maintenance : Temps perdu à analyser des portions inutiles.
  • Fiabilité : Risque de régression si un développeur réutilise du code obsolète par erreur.
Prompt pour l'IA
// Rôle : Audit technique du code mort
// Contraintes :
// - Ignorer les tests unitaires et les fichiers de configuration.
// - Distinguer le code mort interne des exports publics (API/librairies).

1. **Fonctions/Classes inutilisées** :
   - Liste les fonctions/méthodes définies mais jamais appelées.
   - Exclure les points d'entrée publics (ex : contrôleurs API, classes marquées `@api`).
   - Vérifier les héritages et interfaces pour éviter les faux positifs.

2. **Variables et imports inutilisés** :
   - Identifier les variables déclarées mais jamais lues.
   - Lister les imports/modules non utilisés (ex : `use` en PHP, `import` en JS/TS).
   - Inclure les dépendances non référencées (ex : `package.json`, `composer.json`).

3. **Branches inatteignables** :
   - Détecter les blocs de code après un `return`, `throw`, ou `exit`.
   - Signaler les conditions toujours `true`/`false` (ex : `if (DEBUG && false)`).

4. **Fichiers orphelins** :
   - Lister les fichiers non référencés dans le projet (hors assets statiques).
   - Exclure les fichiers de configuration et les tests.

5. **Commentaires obsolètes** :
   - Repérer les commentaires `TODO`/`FIXME` datant de plus de 6 mois.
   - Identifier les annotations `@deprecated` sans alternative documentée.

// Format de sortie attendu :
// [Type] : [Localisation] -> [Preuve] -> [Recommandation]
// Exemple :
// Fonction : src/utils/legacy-auth.php:42 -> 0 appel dans 1247 fichiers -> Suppression
// Import   : src/index.js:5 -> 'lodash' non utilisé -> Nettoyage

Explication détaillée

📚 Méthodologie de Nettoyage


1. Détection

Outils par langage

Langage Outil Statique Outil Dynamique Commande Exemple
JavaScript/TS ESLint, depcheck Istanbul (coverage) npx depcheck
PHP PHPStan, Psalm XDebug + PHPUnit phpstan analyse --level 5
Python Vulture, Pylint coverage.py vulture my_project/ --min-confidence 80
Java SonarQube, SpotBugs JaCoCo mvn sonar:sonar
Go staticcheck Go Cover go test -coverprofile=coverage.out

Recherche manuelle

# Fichiers non modifiés depuis >1 an (hors tests/config)
git log --since="1 year ago" --pretty=format: --name-only | \
  grep -vE '(\.test\.|__tests__|config|vendor|node_modules)' | \
  sort | uniq -u

# Recherche de fonctions suspectes (exemple PHP)
grep -r "function " src/ | grep -v "test" | sort

2. Validation

Avant toute suppression :

  1. Recherche globale :
    grep -r "nom_de_la_fonction" src/
  2. Vérification des appels dynamiques :
    • PHP : $this->$methodName()
    • JavaScript : window["someFunction"]()
  3. Consultation des logs :
    • Vérifier si la fonction apparaît dans les logs d'erreur ou d'accès.
  4. Test de suppression :
    • Supprimez le code localement et exécutez la suite de tests.
    • Vérifiez les fonctionnalités critiques manuellement.

3. Suppression

Bonnes pratiques

  • Ne pas commenter le code : Supprimez-le. L'historique Git permet de le retrouver si nécessaire.
  • Commits clairs :
    git rm fichier_inutile.php
    git commit -m "Suppression de old_auth_system.php (code mort, non utilisé depuis #123)"
  • Mise à jour de la documentation :
    • Supprimer les références dans les README, CHANGELOG, ou la documentation API.
    • Mettre à jour les schémas de base de données si des tables associées sont supprimées.

Cas particuliers

Scénario Action Recommandée
Fonction utilisée par un cron Vérifier les tâches planifiées (crontab -l).
Endpoint API non documenté Vérifier avec curl ou Postman avant suppression.
Code lié à une feature flag Confirmer que le flag est désactivé depuis >6 mois.

4. Prévention

Intégration dans le workflow

Étape Action
Développement Utiliser un linter en temps réel (VSCode/PhpStorm avec ESLint/PHPStan).
Pre-commit Bloquer les imports/variables inutilisés via un hook Git.
CI/CD Ajouter une étape d'audit automatique (ex : SonarQube).
Revue de code Inclure une checklist "code mort" dans le template de PR.

Exemple de Git Hook (Husky)

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged --concurrent false",
      "pre-push": "npm run audit:deadcode"
    }
  },
  "lint-staged": {
    "*.{js,ts}": [
      "eslint --rule 'no-unused-vars: error'",
      "git add"
    ]
  }
}

Template de Pull Request

## Description
[Description des changements]

## Checklist Code Mort
- [ ] Aucune fonction/variable inutilisée ajoutée.
- [ ] Les imports dépendances sont tous nécessaires.
- [ ] Les fichiers modifiés/supprimés sont référencés dans le projet.

🔍 Études de Cas Concrets


1. Endpoint API Oublié (Sécurité)

Contexte :

  • Une route /debug/sql avait été ajoutée pour le développement.
  • Oubliée en production pendant plusieurs années.

Risque :

  • Exposition des requêtes SQL en clair (injection SQL possible).
  • Découverte via un scan de routine par un attaquant.

Solution :

  1. Audit des routes avec :

    # Symfony
    php bin/console debug:router
    
    # Laravel
    php artisan route:list
  2. Suppression physique de la route et des contrôleurs associés.
  3. Vérification des logs pour détecter d'éventuelles exploitations passées.

2. Bibliothèque Inutilisée (Performance)

Contexte :

  • Un projet Node.js incluait lodash et moment alors qu'ils n'étaient plus utilisés.
  • Impact : augmentation inutile de la taille du bundle.

Actions :

  1. Détection avec depcheck :
    npx depcheck
  2. Suppression des dépendances :
    npm uninstall lodash moment
  3. Vérification du bundle avec webpack-bundle-analyzer.

3. Fonction de Hachage Obsolète (Bug)

Contexte :

  • Une fonction oldHashPassword() utilisant MD5 était toujours présente.
  • Un développeur l'a réutilisée par erreur, introduisant une faille de sécurité.

Solution :

  1. Suppression de la fonction.
  2. Ajout d'un test de régression pour vérifier que seul le nouveau système de hachage (bcrypt) est utilisé :
    public function testPasswordHashingUsesBcrypt()
    {
       $hashed = hash_password('test123');
       $this->assertTrue(password_verify('test123', $hashed));
       $this->assertStringStartsWith('$2y$', $hashed); // Préfixe bcrypt
    }

⚠️ Pièges Courants

Piège Solution
Faux positifs (ex : code utilisé par reflection) Vérifier manuellement les appels dynamiques.
Code "mort" mais testé Ne pas supprimer sans comprendre pourquoi il est testé.
Dépendances transverses Vérifier les appels entre micro-services.
Fichiers de configuration Ne pas supprimer les fichiers .env, config/*.yml.

📋 Checklist de Nettoyage

Détection

  • [ ] Exécuter un audit statique (ESLint/PHPStan).
  • [ ] Vérifier la couverture de test pour identifier les branches non exécutées.
  • [ ] Lister les fichiers non modifiés depuis >1 an.
  • [ ] Scanner les dépendances inutilisées (depcheck, composer unused).

Validation

  • [ ] Rechercher globalement les noms de fonctions/variables (grep -r).
  • [ ] Vérifier les appels dynamiques (ex : $this->$method()).
  • [ ] Confirmer avec l'équipe pour les cas ambigus.

Suppression

  • [ ] Supprimer physiquement le code (pas de commentaires).
  • [ ] Mettre à jour la documentation et les schémas.
  • [ ] Ajouter un test de non-régression si nécessaire.

Prévention

  • [ ] Configurer des hooks Git (Husky, pre-commit).
  • [ ] Intégrer l'audit dans la CI/CD (SonarQube, GitHub Actions).
  • [ ] Organiser un audit trimestriel du code mort.

🔧 Outils Recommandés

Besoin Outil Lien
Analyse statique JS/TS ESLint eslint.org
Analyse statique PHP PHPStan phpstan.org
Détection de dépendances depcheck (Node.js) github.com/depcheck/depcheck
Couverture de code Istanbul (JS), PHPUnit (PHP) istanbul.js
Audit complet SonarQube sonarsource.com
Analyse Git git-extras github.com/tj/git-extras

📌 Ressources Complémentaires