Webinaire en vedette : Dévoilement de Parasoft C/C++test CT pour l'excellence en matière de tests continus et de conformité | Voir le séminaire

Guide MISRA C++ 2023 : tout ce que vous devez savoir

Portrait de Michal Rozenau, membre actif du groupe de travail MISRA C et MISRA C++ et ingénieur chef de projet chez Parasoft
4 janvier 2024
5 min lire

Plongez dans MISRA C++ 2023 ! Découvrez son histoire, pourquoi c'est si important, les directives et comment Parasoft fournit une prise en charge complète de MISRA pour le développement de logiciels critiques en matière de sûreté et de sécurité.

MISRA C++ 2023 aide les organisations utilisant le langage C++ moderne à développer des logiciels critiques pour la sécurité. Grâce à la nouvelle norme MISRA, les développeurs peuvent répondre aux exigences d'analyse statique imposées par les normes de sécurité fonctionnelle telles que CEI 6108 ou ISO 26262 en garantissant et en documentant Conformité MISRA pour leurs applications logicielles.

Qu’est-ce que MISRA C++ 2023 ?

En travaillant ensemble, AUTOSAR et MISRA ont préparé un ensemble de directives de codage pour permettre une programmation sûre et sécurisée à l'aide de C++17. Ce document publié est MISRA C++ 2023.

MISRA C++ est un ensemble de directives de codage qui définissent un sous-ensemble du langage C++ à utiliser dans les systèmes critiques afin de réduire le risque de commettre des erreurs et de minimiser le danger d'avoir un programme non conforme.

Le standard C++ ne définit pas complètement le langage. Il existe des situations où le comportement est indéfini, non spécifié ou défini par l'implémentation. Si un programme C++ s’appuie sur ces éléments, rien ne garantit qu’il se comportera de manière prévisible ou qu’il sera portable.

Les directives MISRA visent à détecter de telles situations afin de garantir la sécurité et la fiabilité du logiciel. De plus, les programmes conformes peuvent être écrits d'une manière qui suggère clairement une erreur dans le code ou peuvent très probablement être mal interprétés par les développeurs. Les directives MISRA ciblent de telles situations.

L'évolution de MISRA C++

La première version de MISRA C++ en 2008 s'est concentrée sur C++03. Il a gagné en popularité, mais avec les progrès du C++ et les nouvelles fonctionnalités ajoutées en C++11, il est devenu obsolète. Pour combler cette lacune, en mars 2017, le consortium AUTOSAR a publié les directives AUTOSAR C++ dans le cadre de sa plateforme adaptative.

Adaptive AUTOSAR utilise C++14 comme langage de choix, et la plate-forme nécessitait une norme de codage axée sur la sûreté et la sécurité pour prendre en charge les développeurs. Environ 70 % des directives MISRA C++2008 non modifiées ont été incluses dans AUTOSAR C++.

Mais avec l'évolution continue du langage, de nouvelles fonctionnalités de langage ont été ajoutées dans C++ 17, générant le besoin de nouvelles directives de codage. MISRA et AUTOSAR ont décidé de fusionner les normes en une seule publication, et MISRA a repris le travail sur la nouvelle édition de la norme avec toutes les mises à jour requises pour C++17. Le résultat de ces travaux est MISRA C++ 2023, publié en octobre 2023.

Directives et règles MISRA C++ 2023

Les directives MISRA C++ 2023 sont classées comme règles ou directives. Les règles sont des lignes directrices qui contiennent une définition complète de la conformité et de la non-conformité. Pour les directives, il n'est pas possible de fournir la description complète nécessaire pour effectuer un contrôle de conformité, car cela dépend, par exemple, des décisions de conception prises dans le contexte d'un projet spécifique.

Chaque ligne directrice est classée dans l’une des catégories suivantes :

  • Obligatoire
  • Requis
  • Consultatif

Les règles sont en outre classées pour l'analyse de la décidabilité et de la portée.

Les directives obligatoires doivent être suivies sans possibilité de déviation. Les lignes directrices requises peuvent être dérogées, à condition que la procédure formelle de déviation soit suivie et que tous les problèmes potentiels aient été par ailleurs atténués. Les lignes directrices consultatives sont une sorte de recommandation qui doit être suivie dans la mesure du possible.

L'attribut Décidabilité définit si la règle est généralement analysable par l'outil automatisé ou non. L'attribut Scope définit si une ligne directrice doit être vérifiée en analysant une seule unité de traduction ou l'ensemble du système.

Il existe 179 lignes directrices MISRA C++ 2023, quatre directives et 175 règles regroupées en sections correspondant aux sections de la norme C++, dont les suivantes :

  • Concepts de base
  • Conversions standards
  • Expressions
  • Déclarations
  • Fonctions spéciales des membres
  • Gestion des exceptions

Certaines de ces règles sont dérivées des directives de codage AUTOSAR ou de l'ancien MISRA C++ 2008. Cependant, les directives MISRA se concentraient uniquement sur la mise en œuvre, alors qu'AUTOSAR fournissait également des recommandations liées à la conception, à l'infrastructure de la chaîne d'outils ou à la documentation. Généralement, MISRA C++ 2023 est orienté sur la sémantique du code et sur l'évitement des erreurs sans trop donner de conseils stylistiques.

Comment atteindre la conformité MISRA C++ 2023

MISRA C++ 2023 impose des exigences pour suivre les processus de conformité définis dans le document de conformité MISRA. Il s'agit d'un document distinct partagé entre les normes MISRA C et MISRA C++. La version la plus récente a été publiée en 2020 et remplace la version précédente de 2016.

MISRA Compliance introduit un ensemble d’exigences concernant le processus de conformité et les rapports. Il définit les rapports spéciaux attendus comme artefacts de conformité.

  • Le plan d'application des lignes directrices est un document qui précise tous les moyens techniques qui seront utilisés pour faire appliquer les lignes directrices.
  • Le plan de recatégorisation des lignes directrices est un document qui décrit tous les changements dans les catégories de lignes directrices introduites pour le projet spécifique.
  • Le résumé de conformité aux directives est un rapport documentant le niveau de conformité de chaque directive.

En outre, le document de conformité recommande un processus complet de traitement des écarts qui comprend des exigences en matière d'enregistrement des écarts, d'utilisation des autorisations d'écart et une liste des raisons pour lesquelles les écarts sont acceptables.

Disposer d'un ensemble standardisé d'exigences pour déclarer que les projets sont conformes à MISRA aide les organisations à garantir un niveau de confiance approprié et à avoir la possibilité de combiner les rapports de conformité lors de l'intégration de plusieurs modules fournis par des sous-traitants, en supposant que Vérification du code MISRA C/C++ a été réalisé pour chacun d’eux.

Certaines lignes directrices pourraient être vérifiées à l’aide du processus de révision du code, même si cela serait fastidieux. D'autres, en particulier ceux qui nécessitent une analyse complète du système, y compris les directives qui exigent que l'analyse des données et du flux de contrôle soit effectuée sur l'ensemble complet du code source de l'application, sont pratiquement impossibles à vérifier manuellement. Par conséquent, il est important d’utiliser des outils automatisés d’analyse de code statique, comme Parasoft. Test C / C ++, qui fournissent une prise en charge complète de MISRA C++ 2023 pour analyser le code par rapport aux directives MISRA et générer l'ensemble approprié de documents de conformité.

Pourquoi MISRA C++ 2023 est-il essentiel pour des logiciels sûrs et sécurisés ?

MISRA C++ vise à fournir un sous-ensemble sûr du langage C++. Ceci est réalisé par plusieurs exigences et limitations sur le code source C++ pour améliorer la sûreté et la sécurité des applications.

Prévention des erreurs

La norme C++ spécifie certaines situations comme comportement non défini, principalement pour permettre aux compilateurs de générer du code plus efficace. Les compilateurs sont autorisés à supposer que la situation de comportement indéfini ne se produira jamais et à effectuer des optimisations supplémentaires basées sur cette hypothèse. Cela comporte le risque que, si la situation se produit, le comportement du programme soit imprévisible. Et dans certains cas, cela signifie que le programme se comporte parfaitement lors de l’exécution des tests et échoue en production, ce qui peut rendre inutile l’ensemble du processus de vérification. MISRA C++ fournit des directives qui protègent directement ou indirectement contre un comportement non défini. Un exemple de cas serait l'évaluation de la valeur indéterminée d'un objet, contre laquelle il est protégé par Règle 11.6.2 La valeur d'un objet ne doit pas être lue avant d'avoir été fixée.

Maintenabilité du code

Certains aspects de la machine abstraite sont décrits dans la norme C++ comme définis par l'implémentation. Cela signifie que le comportement du code est bien défini et doit être documenté, mais il peut différer selon les implémentations.

Un programme qui dépend du comportement défini par l'implémentation peut être difficile à porter vers une autre cible. Un exemple d'un tel comportement serait le sizeof(int), ce qui affecte le comportement des opérations arithmétiques, par exemple tous les opérandes de types plus étroits étant promus avant que l'opération réelle ne se produise. En fin de compte, cela peut entraîner des résultats différents de l'opération arithmétique en fonction de la cible de la compilation. Les directives MISRA C++ protègent contre de tels problèmes avec leurs règles de conversion standard, comme les suivantes :

  • Règle 7.0.5 La promotion intégrale et les conversions arithmétiques habituelles ne doivent pas changer la signature ou la catégorie de type d'un opérande.
  • Règle 7.0.6 L'attribution entre les types numériques doit être appropriée.

Gestion des risques

Les directives MISRA abordent également une classe de risques potentiels causés par la confusion du développeur ou une compréhension incorrecte du code source C++ valide. Par exemple, le code if (x = y) est parfaitement valide en C++ mais est très probablement le résultat d'une erreur de frappe où l'opérateur d'affectation a été accidentellement utilisé à la place de l'opérateur d'égalité. Règle 8.18.2 Le résultat d'un opérateur d'affectation ne doit pas être utilisé garantit que ce code sera signalé et examiné pour en vérifier l'exactitude.

Conclusion

L’utilisation d’un ensemble raisonnable de directives de codage et d’un sous-ensemble de langage sûr est requise par les normes de sécurité fonctionnelle pour une raison. Les organisations qui peuvent revendiquer la conformité MISRA C++ 2023 améliorent la sûreté et la sécurité de leurs applications C++ modernes.

Consultez les Webinaire MISRA C++ 2023 pour plus de détails sur le contenu du document MISRA C++ 2023 et les différences entre les directives AUTOSAR et MISRA C++.

Découvrez comment votre équipe de développement peut obtenir la couverture MISRA la plus étendue.

« MISRA », « MISRA C » et le logo triangulaire sont des marques déposées de The MISRA Consortium Limited. ©The MISRA Consortium Limited, 2021. Tous droits réservés.

Article connexe + ressources