Langages de programmation dans les applications critiques

adesso Blog

Les systèmes embarqués sont souvent utilisés dans des domaines critiques tels que l’aviation, la médecine et l’automobile. La norme IEC 61508-7 fournit des recommandations sur les langages de programmation qui, lorsqu’un sous-ensemble défini, des directives de codage et des outils d’analyse statique sont appliqués, sont considérés comme « particulièrement recommandés » jusqu’au niveau SIL4. Cela inclut les langages C et C++. Cependant, le choix du langage de programmation n’est pas toujours évident. Quels facteurs peuvent influencer ce processus de décision ?

C ou C++ ?

Le langage C, bien connu des développeurs, est utilisé depuis des décennies dans les systèmes embarqués. Il permet un contrôle direct du matériel et une gestion efficace des ressources. Il est un choix pertinent pour les systèmes aux ressources limitées, car sa structure claire favorise des réactions déterministes et un contrôle précis. En revanche, son faible niveau d’abstraction favorise l’apparition de potentielles erreurs dans le code. De plus, les conversions implicites et les définitions floues peuvent entraîner des comportements inattendus. Utiliser C demande donc rigueur et vigilance.

C++ enrichit son collègue C avec la programmation orientée objet, les templates et les bibliothèques standardisées. Il améliore la structuration et la maintenabilité du code. Mais cette richesse augmente également le niveau de complexité. Des pertes de performance peuvent survenir à cause d’une gestion dynamique de la mémoire ou du traitement des exceptions. De plus, l’usage de bibliothèques non sécurisées ou non standardisées peut laisser place à des failles.

Normes et restrictions sur les langages, outils et bibliothèques

Il existe de nombreux outils et bonnes pratiques pour améliorer la qualité et la maintenabilité du code C/C++ dans des systèmes critiques. Les analyses statiques, les tests unitaires et les revues de code permettent de détecter les erreurs, failles et violations des standards. Des normes comme IEC 61508 ou MISRA influencent fortement le choix des langages, outils et bibliothèques, en imposant des exigences strictes sur les méthodes de développement, de vérification et de validation.

  • Normes IEC 61508 et MISRA : ces normes recommandent l’usage de directives comme MISRA C ou MISRA C++, qui limitent certains aspects du langage. Elles restreignent par exemple l’usage des templates, de la mémoire dynamique ou des syntaxes ambiguës, car ces éléments sont difficiles à vérifier et représentent de potentielles sources d’erreurs. On privilégie donc des constructions simples et déterministes.
  • Qualification des outils : selon l’IEC 61508, les outils utilisés dans les systèmes critiques doivent être qualifiés. Cela signifie qu’ils ne doivent pas introduire de risques supplémentaires. Les compilateurs certifiés et les outils d’analyse statique sont particulièrement utiles dans ce cas.
  • Développement basé sur des modèles : pour les systèmes utilisant la modélisation, des exigences supplémentaires s’appliquent, comme celles de MISRA AC ou de génération automatique de code. Ces règles s’appliquent autant au modèle qu’au code généré.

Impact sur le choix des outils et des bibliothèques

  • Outils de programmation : le choix de l’IDE et du compilateur est crucial. Les compilateurs certifiés avec des vérifications de sécurité intégrées ou compatibles MISRA réduisent les risques.
  • Bibliothèques : les bibliothèques standard (notamment en C++) sont souvent limitées, car elles utilisent des mécanismes comme l’allocation dynamique de mémoire, difficiles à maîtriser. Il est préférable d’utiliser des bibliothèques conçues pour les applications critiques.
  • Génération de code : les outils de génération automatique doivent répondre à des exigences strictes et produire un code traçable et conforme.

Restrictions spécifiques aux fonctionnalités C++

  • Templates : puissants mais complexes à analyser et à tester, ils sont souvent déconseillés dans les systèmes critiques.
  • Mémoire dynamique : les fonctions comme new, delete ou les smart pointers peuvent causer des fuites ou de la fragmentation. Les normes comme ISO 26262 recommandent l’usage de mémoire statique.
  • Héritage multiple : bien que supporté par C++, il est rarement utilisé dans les projets critiques à cause de la complexité et du risque d’erreurs.

Interopérabilité et sécurité à l’exécution

C et C++ sont proches, ce qui facilite leur interopérabilité. On peut intégrer du code C dans un projet C++ via des blocs externes "C", et inversement, tant que les fonctionnalités spécifiques à C++ (comme les templates ou le polymorphisme) ne sont pas utilisées. Il faut toutefois faire attention aux différences de mise en mémoire et aux implémentations des compilateurs.

C ne propose pas de mécanisme intégré pour éviter les erreurs lors de l’exécution (comme les accès à des pointeurs nuls ou les débordements de mémoire). Les développeurs doivent donc s’appuyer sur leur propre rigueur et sur des outils externes. C++ offre plus de protections grâce à des fonctionnalités comme les exceptions ou les bibliothèques (std::vector ou std::unique_ptr). Ces outils réduisent les risques de perte de mémoire ou de comportements indéfinis, Mais ils introduisent parallélement de la complexité, à gérer avec soin dans les systèmes critiques.

Le choix du langage dépend des exigences du projet et des compétences de l’équipe. Une approche hybride est souvent efficace : utiliser C pour les fonctions proches du matériel, et C++ pour les modules plus complexes et structurés. Cela nécessite des interfaces bien définies et des règles de codage claires pour assurer une intégration fluide.

Les normes influencent fortement le choix des langages, outils et bibliothèques, en imposant des restrictions sur certaines fonctionnalités, surtout en C++.

Et vous, quels sont vos critères lors du choix d’un langage dans vos applications ?

  • IoT & Embedded Systems : innovation pour un monde connecté

    Découvrez comment adesso conçoit des solutions IoT et embarquées innovantes, aidant les entreprises à numériser et à pérenniser leurs produits. De la conception à la mise en œuvre, nous vous accompagnons sur le chemin de la connectivité intelligente. En savoir plus

  • Embedded C – efficacité et précision dans le développement logiciel

    Avec Embedded C, adesso propose des solutions logicielles sur mesure pour les systèmes embarqués, répondant aux plus hautes exigences en matière d'efficacité et de fiabilité. Découvrez comment nous faisons progresser vos projets grâce à des technologies de pointe et des méthodologies éprouvées. En savoir plus

  • Sécurité fonctionnelle : fiabilité pour les systèmes critiques

    adesso accompagne les entreprises dans la mise en œuvre de la sécurité fonctionnelle pour les systèmes embarqués et IoT. Grâce à une expertise approfondie, nous veillons à ce que vos produits respectent les normes de sécurité les plus strictes et les exigences réglementaires. En savoir plus

  • Success Story Bühler : transformation numérique dans l'industrie alimentaire

    Découvrez comment adesso a collaboré avec le groupe Bühler pour développer des solutions numériques innovantes. Ensemble, nous avons optimisé les processus et établi de nouvelles références dans l'industrie alimentaire. En savoir plus

Photo Benno Barten

Auteur Benno Barten

Benno Barten est ingénieur logiciel chez adesso Suisse. Il possède une solide expérience en sécurité fonctionnelle et en développement de logiciels embarqués, de la conception au produit final.

Catégorie:

Industries

Mots-clés:

IoT