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
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 |