Blog

MISRA C 2012 vs MISRA C2 - Comment passer d'une version à l'autre ?

Secure Code Warrior
Publié le 17 août 2021

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 !

Voir la ressource
Voir la ressource

Dans cet article, nous allons comparer la norme MISRA C 2012 avec la norme C2, et vous guider dans le passage à la nouvelle norme. Nous expliquerons pourquoi la conformité à la norme MISRA est nécessaire pour construire des systèmes embarqués sécurisés.

Vous souhaitez en savoir plus ?

Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.

Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.

Réservez une démonstration
Partager sur :
Auteur
Secure Code Warrior
Publié le 17 août 2021

Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.

Secure Code Warrior crée une culture de développeurs axés sur la sécurité en leur donnant les compétences nécessaires pour coder de manière sécurisée. Notre programme phare Agile Plateforme D'apprentissage propose des parcours pertinents basés sur les compétences, des exercices pratiques missions et des outils contextuels permettant aux développeurs d'apprendre, de développer et d'appliquer rapidement leurs compétences pour écrire du code sécurisé.

Partager sur :

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 !

Voir la ressource
Voir la ressource

Remplissez le formulaire ci-dessous pour télécharger le rapport

Nous aimerions que vous nous autorisiez à vous envoyer des informations sur nos produits et/ou sur des sujets liés au codage sécurisé. Nous traiterons toujours vos données personnelles avec le plus grand soin et ne les vendrons jamais à d'autres entreprises à des fins de marketing.

Soumettre
Pour soumettre le formulaire, veuillez activer les cookies "Analytics". N'hésitez pas à les désactiver à nouveau une fois que vous aurez terminé.

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 !

Accès aux ressources

Cliquez sur le lien ci-dessous et téléchargez le PDF de cette ressource.

Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.

Voir le rapportRéservez une démonstration
Télécharger le PDF
Voir la ressource
Partager sur :
Vous souhaitez en savoir plus ?

Partager sur :
Auteur
Secure Code Warrior
Publié le 17 août 2021

Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.

Secure Code Warrior crée une culture de développeurs axés sur la sécurité en leur donnant les compétences nécessaires pour coder de manière sécurisée. Notre programme phare Agile Plateforme D'apprentissage propose des parcours pertinents basés sur les compétences, des exercices pratiques missions et des outils contextuels permettant aux développeurs d'apprendre, de développer et d'appliquer rapidement leurs compétences pour écrire du code sécurisé.

Partager sur :

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
Voir la ressource
Vous souhaitez en savoir plus ?

Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.

Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.

Réservez une démonstrationTélécharger
Partager sur :
Centre de ressources

Ressources pour vous aider à démarrer

Plus d'articles
Centre de ressources

Ressources pour vous aider à démarrer

Plus d'articles