Maîtriser le code embarqué : habitudes éprouvées pour réduire les erreurs et renforcer la sûreté
Au cours de la dernière décennie, le logiciel embarqué est passé de quelques centaines de milliers de lignes à plus de 100 millions dans un véhicule typique. Le passage aux processeurs 32 bits et à la mémoire abondante a débloqué des fonctionnalités sans précédent, mais a aussi amplifié le risque de bogues subtils qui menacent la sûreté et la sécurité.
Pour garder une longueur d'avance, les développeurs doivent adopter une approche systématique qui empêche les erreurs avant qu'elles n'entrent dans la base de code. Deux catégories principales d'erreurs méritent une attention particulière :
- Erreurs de codage – par exemple, accès hors limites d'un tableau. Elles sont détectables par l'analyse statique.
- Erreurs d'application – ne sont découvertes que lorsque le comportement du logiciel est validé par rapport à ses exigences.
La mise en œuvre d'une norme de codage rigoureuse, telle que MISRA C/C++, couplée à des tests pilotés par les exigences, offre une puissante « once de prévention ». Cette stratégie réduit le temps de débogage, resserre les délais et protège finalement votre retour sur investissement.
Pourquoi la prévention est importante
Les erreurs humaines sont inévitables – les ingénieurs se précipitent, négligent des détails ou interprètent mal des flux de données complexes. Mais lorsque le logiciel grandit en taille et en interconnectivité, ces simples dérapages peuvent se transformer en défaillances critiques. Une norme de codage disciplinée aide à détecter et éliminer nombre de ces pièges avant qu'ils n'apparaissent.
Dans l'écosystème C/C++, environ 80 % des défauts proviennent de l'utilisation incorrecte de seulement 20 % du langage. En interdisant ou en limitant les constructions problématiques, une norme améliore considérablement la qualité du code.
Considérez le comportement indéfini qui survient lorsqu'un entier signé est décalé vers la droite. Selon le compilateur, le résultat peut différer, entraînant un comportement incohérent du programme. De même, une fonction qui lit un tampon circulaire peut retourner des valeurs dans un ordre inattendu sur certains compilateurs. Ces nuances sont illustrées dans les figures ci-dessous.

Figure 1. Comportement dépendant du compilateur dans les constructions C/C++. Source : LDRA

Figure 2. Comportement non spécifié dans un exemple de tampon circulaire. Source : LDRA
Tirer parti de MISRA C/C++
MISRA, publié pour la première fois en 1998 pour l'industrie automobile, reste la référence pour le codage C/C++ embarqué. Il spécifie :
- La raison d'être de chaque règle, avec des exceptions détaillées.
- Des exemples clairs de comportement indéfini, non spécifié et défini par l'implémentation.
- Des indications sur les règles « décidables » (vérifiables par outil) et « indécidables ».
En 2016, MISRA s'est étendu pour adresser le code critique pour la sécurité, ajoutant 14 nouvelles directives. Par exemple, la directive 4.14 interdit explicitement les constructions pouvant mener à un comportement indéfini, renforçant ainsi la posture de sécurité.

Figure 3. Directives MISRA sur le comportement indéfini et non spécifié. Source : LDRA

Figure 4. Rôle de la directive 4.14 dans la prévention du comportement indéfini. Source : LDRA
Du code à l'application : le rôle des exigences et des tests
Même un code parfait peut échouer s'il ne remplit pas son objectif. La traçabilité des exigences et les tests unitaires sont essentiels pour vérifier que le logiciel se comporte comme conçu.
La traçabilité bidirectionnelle relie chaque fonction à son exigence de bas niveau et remonte aux objectifs au niveau système. Cette correspondance révèle tôt les fonctionnalités manquantes ou superflues.

Figure 5. Traçabilité bidirectionnelle de la fonction à l'exigence système. Source : LDRA
Une fois les exigences de bas niveau définies, les cas de test émergent naturellement. L'exécution de ces tests – idéalement avec des outils de test unitaire automatisés – confirme que le code remplit son contrat.

Figure 9. Résultats de tests unitaires automatisés. Source : LDRA
Adopter de nouvelles habitudes de codage
Le développement embarqué moderne exige une approche holistique :
- Implémenter une norme de codage éprouvée (MISRA, CERT, etc.).
- Suivre des métriques – densité de défauts, couverture de code, taux de conformité.
- Imposer la traçabilité des exigences et les tests de régression automatisés.
Ces pratiques livrent un code plus propre, plus maintenable, simplifient l'ajout de fonctionnalités et réduisent les coûts de maintenance à long terme – des avantages qui résonnent dans les domaines critiques pour la sûreté comme dans les autres.
Adopter ces habitudes n'est pas optionnel si vous visez un avantage concurrentiel. La différence entre une base de code qui nécessite une lutte constante contre les incendies et une qui évolue en douceur tient souvent à un processus discipliné.
Article original provenant de EDN.
Embarqué
- Chaînes de caractères : une vulnérabilité cachée dans les logiciels embarqués
- SOAFEE : une architecture cloud-native pour plateformes automobiles logicielles
- Pixus lance des faceplates 6U OpenVPX robustes avec intégrité structurelle renforcée
- GE Digital dévoile un logiciel de gestion prédictive d'actifs, faisant passer la maintenance du réactif au proactif
- Maîtriser la formation GMAO : Engager les équipes et booster la rétention
- Sécuriser l'open source dans l'IoT : atténuer les risques logiciels
- Trois étapes éprouvées pour sécuriser votre chaîne d'approvisionnement logicielle
- Saelig dévoile l'Impact-D 100AL : PC embarqué puissant, compact, durée de vie 15 ans et E/S riches
- Exploiter le DevOps pour surmonter les défis du logiciel embarqué