Le langage C est devenu incontournable pour la programmation de systèmes embarqués. Mais il ne peut répondre à de fortes contraintes en terme de sécurité. Sauf à utiliser un compilateur du commerce qui suit les directives édictées par l'association Misra.
Le langage C est devenu le standard de fait en matière de programmation de systèmes enfouis en langage évolué. Malheureusement, ce langage souffre d'un certain nombre de défauts de cohérence et ses qualités intrinsèques le rendent quelque peu inadapté à la programmation d'applications robustes.
Il existe cependant des outils de compilation du C standard destinés à aider les programmeurs à produire un code plus sécurisé, conforme aux directives définies par la Misra (Motor industry software reliability association). Celles-ci explicitent des mises en œuvre très strictes de règles de programmation. Elles sont notamment très utiles à tous les programmeurs de systèmes embarqués dans les domaines où la sécurité joue un rôle majeur : l'industrie automobile, le contrôle industriel, les communications, le médical et l'aéronautique.
Ceci étant, les directives de la Misra sont également une aide précieuse pour tout autre programmeur d'applications enfouies, désireux de fournir un travail présentant une certaine qualité et/ou une certaine solidité. Si toutes les applications commerciales ne sont pas tenues de se conformer au C de la Misra, les sociétés qui développent des systèmes sensibles à la sécurité intégrant un processus structuré de développement logiciel, une revue de code, l'utilisation cohérente de types et méthodes, un contrôle des limites, un comportement reproductible du code… ont tout à gagner à l'emploi d'une programmation conforme aux pratiques recommandées.
Dans l'automobile, le problème est particulièrement sensible, puisque l'on constate que les codes sources des systèmes à base de microcontrôleurs embarqués dans les véhicules décuplent en taille et en niveau de complexité chaque année. Si l'on tient compte du fait que tout programme informatique comporte un taux moyen d'erreurs de 0,25 %, on peut comprendre que cette industrie tente de faire son possible pour minimiser les taux d'erreurs de ses logiciels enfouis.
Un compilateur C respectueux des directives de la Misra, comme celui qui est intégré dans les outils de développement logiciel de Tasking, permet aux programmeurs de rédiger du code contenant peu de constructions C sujettes à erreur et, ainsi, de développer des systèmes enfouis robustes pour les applications sensibles à la sécurité. Le produit de Tasking se caractérise par les points suivants.
Intégration des programmes de contrôle de code dans des outils de compilation C standard, basés sur les directives de la Misra en matière de programmation.
Outre les applications sensibles à la sécurité, adaptation à celles pour lesquelles la qualité et la robustesse du code sont des éléments essentiels.
Possibilité de sélectionner des restrictions de programmation conformes à la norme Iso/IEC 9899 :1990.
Prise en charge par des outils de compilation Tasking, dont ceux dédiés aux C166, ST10, TriCore, M16C, XA et 8051.
Au-delà du formalisme du langage lui-même, les besoins des industriels portent sur la mise à disposition d'un compilateur C contenant des fonctionnalités évoluées de contrôle de code conformes aux directives Misra C. Ce compilateur idéal doit faire partie d'une suite d'outils de développement de logiciels enfouis, comportant des fonctionnalités intégrées destinées à assurer une programmation conforme aux pratiques recommandées. En règle générale, cette suite d'outils de développement comprend un compilateur C/C++, un macro-assembleur, un éditeur de liens, un éditeur professionnel et un débogueur. Un environnement de développement intégré (IDE) doit en outre offrir une interface simple et facile d'emploi permettant le paramétrage des différents outils et la configuration de la cible.
Pour le développement d'applications sensibles à la sécurité, le compilateur C, intégré dans un IDE, doit comporter une technologie spécifique de vérifications de code, conformes aux règles du Misra C. Ainsi, au cours de la compilation du code, les violations des règles Misra seront susceptibles d'être signalées par des messages d'erreur (voir figures 1, 2 et 3), et le processus de construction pourra être interrompu. Les messages de ce type identifient sans ambiguïté l'emplacement et la nature de l'erreur. En outre, ils aident l'utilisateur à mieux respecter les standards et les pratiques recommandées en matière de programmation.
Etant donné que les utilisateurs ne sont pas tous prêts à effectuer une vérification complète de conformité Misra C dans leurs applications, la technologie de compilation devra pouvoir activer les règles qui s'appliquent au projet considéré et permettre au développeur une mise en évidence claire de ses erreurs de code. Bien sûr, pour les applications devant être compatibles avec les directives Misra C, le compilateur disposera d'une configuration prédéfinie pour assurer la conformité avec les règles « obligatoires » exigées par le document (il faut savoir que les directives de la Misra répertorient des règles « obligatoires » et des règles « conseillées » ; pour être conformes stricto sensu avec les directives de la Misra, l'application des 93 règles « obligatoires » est incontournable).
On peut aussi lire les paramètres du C à partir d'un fichier de configuration externe. Ce mode de travail est notamment pertinent dans certaines situations où l'équipe de développement doit adhérer à un ensemble particulier de règles énoncées par la Misra. Cette approche permet à la direction d'une société de définir des modèles spécifiques en conformité avec leur programme d'assurance qualité, et par conséquent de réduire le volume de documentation et le temps de test requis pour chaque application.
Enfin, en adoptant un environnement intégré de développement Misra C, les développeurs garantissent le respect des règles de programmation de cette association dans la totalité de leur projet, puisque les technologies idéales d'édition de liens généreront des comptes-rendus qui documentent les différents modules avec les paramètres Misra C en œuvre lors de la compilation. Ce rapport sera conservé dans le système d'assurance qualité, afin de servir de preuve de l'application des règles de programmation conformes aux pratiques recommandées dans le cadre du projet considéré.
* (Tsasking/Altium)
Les exemples de code ci-dessous montrent une affectation intentionnelle dans une expression booléenne. A moins qu'il ne s'agisse d'une faute de frappe ! La règle 35 de la Misra interdit l'utilisation d'opérateurs d'affectation dans les expressions booléennes et insiste sur le fait qu'il est déconseillé de combiner inutilement plusieurs actions dans une seule et même ligne de code.
La règle 43 de la Misra proscrit l'emploi de conversions implicites (par exemple, dans le cadre de la multiplication d'un char par un int ). De ce fait, le compilateur peut alerter le programmeur du risque qu'il court de mélanger des types de données incompatibles. Le compilateur force le programmeur à construire des fonctions explicites, en lui indiquant quel type de donnée il doit s'attendre à produire dans le cas, par exemple, de la multiplication d'un char par un int.
Etant donné que les variables à virgule flottante sont toujours supérieures ou inférieures à la valeur à laquelle elles sont comparées, le fait de tester leur égalité ou inégalité, comme dans le code ci-dessous, renverra systématiquement un résultat faux. Cependant, la règle 50 de la Misra décrète que les variables à virgule flottante ne doivent pas être testées pour l'égalité ou l'inégalité. Par conséquent, le compilateur a détecté l'erreur et interrompu la compilation jusqu'à ce que le programmeur remédie au problème.
Forum de développeurs
www.yahoogroups.com/gro up/TASKINGforum
Directives Misra
Sites Web se rapportant à des systèmes sensibles à la sécurité :
(The world wide web virtual library: safety-critical systems, SCCS index)
(CASS, Conformity assessment of safety (related) systems)
(Advances in safety critical systems)
(International organization for standardization (Iso), voir Iso/TR 15497)