Icônes SCW
héros bg sans séparateur
Blog

MISRA C 2012 gegen MISRA C2 - So wechseln Sie

Guerrier du code sécurisé
Publié le 17 août 2021
Dernière mise à jour le 9 mars 2026

Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.

Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.

C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué. 

MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre. 

Qu'est-ce que la norme de codage MISRA C ?

La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998. 

Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.

C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique. 

Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?

MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.

C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.

Dans l'ensemble, voici une liste des changements les plus significatifs :

  • Corriger les problèmes rencontrés dans la version 2004.
  • Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
  • Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
  • Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
  • Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.

Les règles de MISRA C en action

Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.

Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp

Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur. 

Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.

Capture d'écran de la règle 21.15 de la MISRA C

Un exemple suit la description de la règle.

Capture d'écran d'une solution non conforme.

Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.

Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites

String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.

Capture d'écran de la règle 21.17 de la MISRA C.

L'exemple correspondant est le suivant :

Capture d'écran d'un exemple correct de fonctions de manipulation de chaînes de caractères

Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.

Valider les données reçues de l'extérieur

La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être

  • Lecture d'un fichier.
  • Lecture d'une variable d'environnement.
  • Toute entrée de l'utilisateur.
  • Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.

Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.

La validité des valeurs reçues de sources externes doit être vérifiée

Comment passer à MISRA C 2012

Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :

  1. Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
  2. PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
  3. CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.

Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.

Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C

Secure Code WarriorLe produit phare de la société - Plateforme D'apprentissage - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.

Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.

Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site Plateforme D'apprentissage dès aujourd'hui !

Consulter la ressource
Consulter la ressource

In diesem Beitrag werden wir den MISRA C 2012-Standard mit C2 vergleichen und Sie durch den Umstieg auf den neuen Standard führen. Wir werden erklären, warum die Einhaltung von MISRA für den Aufbau sicherer eingebetteter Systeme erforderlich ist.

Souhaitez-vous en savoir davantage ?

Secure Code Warrior macht sicheres Programmieren zu einer positiven und ansprechenden Erfahrung für Entwickler, die ihre Fähigkeiten erweitern. Wir begleiten jeden Programmierer auf seinem eigenen bevorzugten Lernweg, sodass sicherheitserfahrene Entwickler zu den alltäglichen Superhelden unserer vernetzten Welt werden.

En savoir plus

Secure Code Warrior là pour aider votre entreprise à sécuriser le code tout au long du cycle de développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre entreprise à réduire les risques liés à un code non sécurisé.

Réserver une démonstration
Partager sur :
marques LinkedInSocialLogo x
Auteur
Guerrier du code sécurisé
Publié le 17 août 2021

Secure Code Warrior macht sicheres Programmieren zu einer positiven und ansprechenden Erfahrung für Entwickler, die ihre Fähigkeiten erweitern. Wir begleiten jeden Programmierer auf seinem eigenen bevorzugten Lernweg, sodass sicherheitserfahrene Entwickler zu den alltäglichen Superhelden unserer vernetzten Welt werden.

Dieser Artikel wurde vom Branchenexpertenteam von Secure Code Warrior verfasst, das sich zum Ziel gesetzt hat, Entwicklern von Anfang an das Wissen und die Fähigkeiten zu vermitteln, um sichere Software zu entwickeln. Wir stützen uns auf fundiertes Fachwissen in Bezug auf sichere Codierungspraktiken, Branchentrends und Erkenntnisse aus der Praxis.

Partager sur :
marques LinkedInSocialLogo x

Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.

Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.

C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué. 

MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre. 

Qu'est-ce que la norme de codage MISRA C ?

La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998. 

Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.

C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique. 

Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?

MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.

C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.

Dans l'ensemble, voici une liste des changements les plus significatifs :

  • Corriger les problèmes rencontrés dans la version 2004.
  • Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
  • Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
  • Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
  • Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.

Les règles de MISRA C en action

Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.

Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp

Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur. 

Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.

Capture d'écran de la règle 21.15 de la MISRA C

Un exemple suit la description de la règle.

Capture d'écran d'une solution non conforme.

Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.

Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites

String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.

Capture d'écran de la règle 21.17 de la MISRA C.

L'exemple correspondant est le suivant :

Capture d'écran d'un exemple correct de fonctions de manipulation de chaînes de caractères

Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.

Valider les données reçues de l'extérieur

La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être

  • Lecture d'un fichier.
  • Lecture d'une variable d'environnement.
  • Toute entrée de l'utilisateur.
  • Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.

Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.

La validité des valeurs reçues de sources externes doit être vérifiée

Comment passer à MISRA C 2012

Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :

  1. Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
  2. PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
  3. CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.

Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.

Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C

Secure Code WarriorLe produit phare de la société - Plateforme D'apprentissage - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.

Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.

Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site Plateforme D'apprentissage dès aujourd'hui !

Consulter la ressource
Consulter la ressource

Veuillez remplir le formulaire ci-dessous pour télécharger le rapport.

Nous sollicitons votre autorisation pour vous envoyer des informations sur nos produits et/ou des sujets connexes liés au codage sécurisé. Nous traitons toujours vos données personnelles avec le plus grand soin et ne les vendons jamais à d'autres entreprises à des fins de marketing.

Soumettre
icône de réussite scw
icône d'erreur scw
Pour envoyer le formulaire, veuillez activer les cookies « Analytics ». Une fois que vous avez terminé, vous pouvez les désactiver à tout moment.

Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.

Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.

C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué. 

MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre. 

Qu'est-ce que la norme de codage MISRA C ?

La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998. 

Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.

C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique. 

Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?

MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.

C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.

Dans l'ensemble, voici une liste des changements les plus significatifs :

  • Corriger les problèmes rencontrés dans la version 2004.
  • Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
  • Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
  • Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
  • Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.

Les règles de MISRA C en action

Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.

Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp

Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur. 

Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.

Capture d'écran de la règle 21.15 de la MISRA C

Un exemple suit la description de la règle.

Capture d'écran d'une solution non conforme.

Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.

Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites

String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.

Capture d'écran de la règle 21.17 de la MISRA C.

L'exemple correspondant est le suivant :

Capture d'écran d'un exemple correct de fonctions de manipulation de chaînes de caractères

Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.

Valider les données reçues de l'extérieur

La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être

  • Lecture d'un fichier.
  • Lecture d'une variable d'environnement.
  • Toute entrée de l'utilisateur.
  • Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.

Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.

La validité des valeurs reçues de sources externes doit être vérifiée

Comment passer à MISRA C 2012

Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :

  1. Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
  2. PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
  3. CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.

Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.

Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C

Secure Code WarriorLe produit phare de la société - Plateforme D'apprentissage - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.

Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.

Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site Plateforme D'apprentissage dès aujourd'hui !

Veuillez consulter le webinaire.
Veuillez commencer
En savoir plus

Veuillez cliquer sur le lien ci-dessous et télécharger le PDF de cette ressource.

Secure Code Warrior là pour aider votre entreprise à sécuriser le code tout au long du cycle de développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre entreprise à réduire les risques liés à un code non sécurisé.

Consulter le rapportRéserver une démonstration
Télécharger le PDF
Consulter la ressource
Partager sur :
marques LinkedInSocialLogo x
Souhaitez-vous en savoir davantage ?

Partager sur :
marques LinkedInSocialLogo x
Auteur
Guerrier du code sécurisé
Publié le 17 août 2021

Secure Code Warrior macht sicheres Programmieren zu einer positiven und ansprechenden Erfahrung für Entwickler, die ihre Fähigkeiten erweitern. Wir begleiten jeden Programmierer auf seinem eigenen bevorzugten Lernweg, sodass sicherheitserfahrene Entwickler zu den alltäglichen Superhelden unserer vernetzten Welt werden.

Dieser Artikel wurde vom Branchenexpertenteam von Secure Code Warrior verfasst, das sich zum Ziel gesetzt hat, Entwicklern von Anfang an das Wissen und die Fähigkeiten zu vermitteln, um sichere Software zu entwickeln. Wir stützen uns auf fundiertes Fachwissen in Bezug auf sichere Codierungspraktiken, Branchentrends und Erkenntnisse aus der Praxis.

Partager sur :
marques LinkedInSocialLogo x

Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.

Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.

C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué. 

MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre. 

Qu'est-ce que la norme de codage MISRA C ?

La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998. 

Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.

C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique. 

Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?

MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.

C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.

Dans l'ensemble, voici une liste des changements les plus significatifs :

  • Corriger les problèmes rencontrés dans la version 2004.
  • Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
  • Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
  • Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
  • Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.

Les règles de MISRA C en action

Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.

Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp

Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur. 

Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.

Capture d'écran de la règle 21.15 de la MISRA C

Un exemple suit la description de la règle.

Capture d'écran d'une solution non conforme.

Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.

Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites

String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.

Capture d'écran de la règle 21.17 de la MISRA C.

L'exemple correspondant est le suivant :

Capture d'écran d'un exemple correct de fonctions de manipulation de chaînes de caractères

Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.

Valider les données reçues de l'extérieur

La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être

  • Lecture d'un fichier.
  • Lecture d'une variable d'environnement.
  • Toute entrée de l'utilisateur.
  • Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.

Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.

La validité des valeurs reçues de sources externes doit être vérifiée

Comment passer à MISRA C 2012

Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :

  1. Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
  2. PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
  3. CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.

Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.

Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C

Secure Code WarriorLe produit phare de la société - Plateforme D'apprentissage - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.

Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.

Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site Plateforme D'apprentissage dès aujourd'hui !

Table des matières

Télécharger le PDF
Consulter la ressource
Souhaitez-vous en savoir davantage ?

Secure Code Warrior macht sicheres Programmieren zu einer positiven und ansprechenden Erfahrung für Entwickler, die ihre Fähigkeiten erweitern. Wir begleiten jeden Programmierer auf seinem eigenen bevorzugten Lernweg, sodass sicherheitserfahrene Entwickler zu den alltäglichen Superhelden unserer vernetzten Welt werden.

En savoir plus

Secure Code Warrior là pour aider votre entreprise à sécuriser le code tout au long du cycle de développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre entreprise à réduire les risques liés à un code non sécurisé.

Réserver une démonstrationTélécharger
Partager sur :
marques LinkedInSocialLogo x
Centre de ressources

Ressources pour débuter

Plus d'articles
Centre de ressources

Ressources pour débuter

Plus d'articles