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

Publié le 13/01/2026 par l’équipe GeoCodeTout 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