Fondamentaux de l'analyse de qualité¶
L'analyse de qualité du code recouvre un ensemble de techniques automatisees qui evaluent le code source selon plusieurs axes : fiabilité, sécurité, maintenabilité, couverture de tests et conformite aux standards.
Types d'analyse¶
SAST (Static Application Security Testing)¶
L'analyse statique de sécurité examine le code source sans l'exécuter pour détecter les vulnerabilites connues.
| Aspect | Detail |
|---|---|
| Méthode | Pattern matching, analyse de flux de données, taint analysis |
| Cibles | Injections SQL, XSS, path traversal, deserialization, SSRF |
| Standards | OWASP Top 10, CWE Top 25, SANS Top 25 |
| Moment | À chaque commit, dans le pipeline CI |
| Outils | Semgrep, SonarQube (rules Security), CodeQL |
SAST vs DAST
Le SAST analyse le code source (white-box). Le DAST (Dynamic Application Security Testing) teste l'application en cours d'execution (black-box). Les deux sont complementaires mais cette rubrique couvre uniquement le SAST, qui s'integre dans la chaîne logicielle.
Analyse de complexité¶
La complexité cyclomatique mesure le nombre de chemins d'execution dans une fonction. Une complexité elevee indique un code difficile a tester et a maintenir.
| Complexité cyclomatique | Interpretation | Action recommandee |
|---|---|---|
| 1 - 10 | Simple, facile a tester | Aucune |
| 11 - 20 | Moderement complexe | Refactoring souhaitable |
| 21 - 50 | Complexe | Refactoring nécessaire |
| > 50 | Tres complexe, non testable | Refactoring obligatoire |
Detection de duplication¶
Le code duplique augmente la dette technique : une correction doit etre appliquee a N endroits au lieu d'un seul.
- Duplication exacte : blocs de code identiques (copy-paste)
- Duplication structurelle : blocs de code avec la même structure mais des noms différents
- Seuil recommande : moins de 3% de duplication globale
Couverture de code (coverage)¶
La couverture mesure le pourcentage de lignes exécutées par les tests automatises.
| Metrique | Description | Seuil recommande |
|---|---|---|
| Line coverage | Lignes exécutées / lignes totales | >= 80% |
| Branch coverage | Branches exécutées / branches totales | >= 70% |
| Condition coverage | Conditions evaluees / conditions totales | >= 70% |
La couverture ne garantit pas la qualité des tests
Un code couvert a 100% avec des tests sans assertions n'a aucune valeur. La couverture est un indicateur nécessaire mais pas suffisant. Elle doit etre combinée avec des tests significatifs (mutation testing pour aller plus loin).
Analyse des dependances¶
L'analyse des dependances verifie les bibliotheques tierces utilisees par le projet.
| Axe | Vérification |
|---|---|
| Vulnerabilites connues | CVE dans les dependances (National Vulnerability Database) |
| Licences | Compatibilité avec la politique de licences de l'organisation |
| Obsolescence | Dependances en fin de vie ou non maintenues |
| Versions | Ecart entre la version utilisee et la dernière version stable |
Linting et conformite de style¶
Les linters verifient le respect des conventions de codage (indentation, nommage, imports, etc.). Ce type d'analyse est généralement gère côté développeur (pre-commit hooks, IDE), mais SonarQube peut aussi le centraliser.
Quality gate¶
Un quality gate est un ensemble de conditions que le code doit respecter pour etre considere comme acceptable. C'est le mécanisme central de contrôle qualité dans le pipeline CI/CD.
Fonctionnement¶
graph LR
Dev["Developpeur"] --> Push --> CI["CI Pipeline"] --> Scan["Scan SonarQube"] --> Gate{"Evaluation<br/>Quality Gate"}
Gate -->|PASSED| Merge["PR mergeable<br/>Merge autorise"]
Gate -->|FAILED| Block["PR bloquee<br/>Correction requise"] Conditions recommandees¶
| Condition | Seuil | Justification |
|---|---|---|
| Couverture sur nouveau code | >= 80% | Pas de régression de couverture |
| Duplication sur nouveau code | < 3% | Eviter l'accumulation de dette |
| Bugs critiques/bloquants | 0 | Pas de nouveau bug critique |
| Vulnerabilites critiques/bloquantes | 0 | Pas de nouvelle faille de sécurité |
| Security hotspots revus | 100% | Tous les points d'attention examines |
| Ratio de dette technique | < 5% | Maintenabilité du nouveau code |
Quality gate sur le nouveau code
La stratégie recommandee est le Clean as You Code : appliquer le quality gate uniquement sur le nouveau code (depuis la dernière version ou la branche cible). Cela evite de bloquer les équipes sur du code legacy tout en garantissant que chaque ajout respecte les standards.
Quality profiles¶
Un quality profile est un ensemble de regles d'analyse activees pour un langage donne. Chaque projet est associe a un quality profile par langage.
Organisation des profils¶
| Profil | Usage | Regles |
|---|---|---|
| Sonar way | Profil par defaut (built-in) | Ensemble équilibre de regles |
| Organisation | Profil standard de l'organisation | Sonar way + regles custom |
| Strict | Projets critiques (sécurité, infra) | Organisation + regles OWASP |
| Legacy | Projets legacy en cours de migration | Sous-ensemble de regles |
Heritage de profils¶
graph TD
Sonar["Sonar way (built-in)"]
Sonar --> Org["Organisation<br/>(extends Sonar way)"]
Org --> Strict["Strict<br/>(extends Organisation)"]
Org --> Legacy["Legacy<br/>(subset de Organisation)"] Ne jamais modifier Sonar way
Le profil built-in est mis a jour à chaque version de SonarQube. Créer un profil enfant qui herite de Sonar way et y ajouter les regles spécifiques a l'organisation.
Dette technique¶
La dette technique représente le coût de remédiation de tous les problèmes détectés dans le code. SonarQube la mesure en temps (jours, heures) nécessaire pour corriger l'ensemble des issues.
Types de dette¶
| Type | Exemples | Impact |
|---|---|---|
| Fiabilité | Null pointer dereference, resource leak | Bugs en production |
| Sécurité | SQL injection, hardcoded credentials | Failles exploitables |
| Maintenabilité | Complexité, duplication, code mort | Coût de maintenance eleve |
Mesure de la dette¶
Dette technique = Somme(temps_remediation_par_issue)
Ratio de dette = dette_technique / temps_developpement_estime
Rating A : ratio < 5%
Rating B : ratio 6-10%
Rating C : ratio 11-20%
Rating D : ratio 21-50%
Rating E : ratio > 50%
Standards de sécurité¶
OWASP Top 10¶
SonarQube mappe ses regles de sécurité sur le OWASP Top 10, le classement de référence des risques de sécurité applicative.
| OWASP | Catégorie | Regles SonarQube associees |
|---|---|---|
| A01:2021 | Broken Access Control | S5131, S5144, S5146 |
| A02:2021 | Cryptographic Failures | S2068, S2245, S4426 |
| A03:2021 | Injection | S2077, S2078, S2631 |
| A07:2021 | Identification & Authentication | S2068, S2647, S5344 |
| A09:2021 | Security Logging & Monitoring | S4507, S4792, S5145 |
CWE (Common Weakness Énumération)¶
Chaque regle de sécurité SonarQube est associee a un ou plusieurs identifiants CWE, permettant un mapping précis avec les bases de vulnerabilites nationales.
Regle SonarQube S2077 (SQL Injection)
→ CWE-89: Improper Neutralization of Special Elements in SQL Command
→ OWASP A03:2021: Injection
→ SANS Top 25: CWE-89
Système de notation¶
SonarQube utilise un système de notation de A (meilleur) a E (pire) sur trois axes :
| Axe | Rating A | Rating B | Rating C | Rating D | Rating E |
|---|---|---|---|---|---|
| Fiabilité | 0 bug | >= 1 mineur | >= 1 majeur | >= 1 critique | >= 1 bloquant |
| Sécurité | 0 vulnérabilité | >= 1 mineure | >= 1 majeure | >= 1 critique | >= 1 bloquante |
| Maintenabilité | Ratio dette < 5% | 6-10% | 11-20% | 21-50% | > 50% |
Metriques complementaires¶
| Metrique | Description |
|---|---|
| Lines of Code | Lignes de code (hors commentaires et lignes vides) |
| Cognitive Complexity | Difficulte de comprehension du code (plus fin que cyclomatique) |
| Security Hotspots | Points d'attention sécurité a revoir manuellement |
| Code Smells | Problèmes de maintenabilité (nommage, structure, design) |
Suivre les tendances, pas les valeurs absolues
Sur un projet legacy, le rating global peut etre mediocre. L'important est la tendance : le nouveau code doit etre en rating A sur les trois axes, et la dette globale doit diminuer dans le temps.