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
Avertissement : Ce prompt est proposé pour vous permettre d'appliquer cet article à votre code. Surtout, ne faites pas confiance aveuglément à votre Agent favori. Et surtout, comprenez ce que vous faites.
// 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é -> NettoyageExplication 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 :
- Recherche globale :
grep -r "nom_de_la_fonction" src/ - Vérification des appels dynamiques :
- PHP :
$this->$methodName() - JavaScript :
window["someFunction"]()
- PHP :
- Consultation des logs :
- Vérifier si la fonction apparaît dans les logs d'erreur ou d'accès.
- 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.
- Supprimer les références dans les
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/sqlavait é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 :
-
Audit des routes avec :
# Symfony php bin/console debug:router # Laravel php artisan route:list - Suppression physique de la route et des contrôleurs associés.
- Vérification des logs pour détecter d'éventuelles exploitations passées.
2. Bibliothèque Inutilisée (Performance)
Contexte :
- Un projet Node.js incluait
lodashetmomentalors qu'ils n'étaient plus utilisés. - Impact : augmentation inutile de la taille du bundle.
Actions :
- Détection avec
depcheck:npx depcheck - Suppression des dépendances :
npm uninstall lodash moment - 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 :
- Suppression de la fonction.
- 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 |