Blog

MISRA C 2012 vs MISRA C2 - Comment effectuer un changement

August 17, 2021
Secure Code Warrior

Chez Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs intégrés et aux responsables de la sécurité de créer des systèmes embarqués sécurisés, nous exploitons le monde de la sécurité des systèmes embarqués. Dans cet article, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour créer des systèmes embarqués sécurisés.

Lorsque vous écrivez du code en C, il est très facile d'implémenter des choses qui semblent correctes, mais qui sont fondamentalement mauvaises. Votre code peut très bien se compiler et même fonctionner correctement pendant un certain temps. Mais le même code peut se bloquer ou présenter un comportement indéfini si la taille de votre saisie et/ou votre mémoire augmentent. Par exemple, un numéro d'entrée particulier provoquant le débordement d'un entier, ou une séquence particulière de caractères provoquant le dépassement des limites d'un tableau.

C'est là que la norme de codage MISRA C peut vous aider. Les règles, directives et bonnes pratiques définies par la norme permettent aux développeurs d'écrire du 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 toujours une ancienne version, c'est le moment idéal pour changer.

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

La norme MISRA C inclut des directives de sécurité, de portabilité et de fiabilité du code pour le langage de programmation C. Le premier ensemble de directives a été publié en 1998, qui était spécifique au langage C.

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

Le C et le 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 que l'écriture de code sécurisé, en particulier en C, est difficile et sujette à des erreurs. Par exemple, dans la plupart des langages de haut niveau tels que Java et C#, vous n'avez pas à vous soucier de choses triviales comme le ramasse-miettes ou la saisie 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 une partie de la mémoire à une structure de données, vous devez la libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le C, contrairement aux autres langages, ne libérera pas de mémoire pour vous, ce qui entraînera une fuite de mémoire.

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

MISRA C : 2012, également connu sous le nom de C3, est sorti 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 les règles de l'ancienne ISO C90. Le principal domaine d'intérêt 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 ce n'est pas déjà fait.

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

  • Corrigez les problèmes détectés dans la version 2004.
  • Augmenter de manière significative le nombre de règles déterminables. Une règle est décidable, si un outil d'analyse peut vous aider à déterminer la conformité à celui-ci.
  • Les règles sont classées comme « obligatoires », « 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 violées dans des scénarios particuliers, à condition que la violation soit justifiée.
  • Ajout de conseils concernant la façon d'appliquer des règles au code généré automatiquement. C'est très important car les mêmes règles que le code écrit par l'homme ne s'appliquent pas toujours à celui généré par un outil.
  • Supprimez les règles trop générales qui interdisaient un comportement raisonnable des utilisateurs. Par exemple, auparavant, il était recommandé de ne pas utiliser de macros du tout, car elles peuvent entraîner diverses difficultés et créer de la confusion (impossible de déboguer les macros, les macros n'ont pas d'espaces de noms, etc.). Cela a empêché l'utilisation de macros, même dans les situations où elles pouvaient constituer une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux utilisateurs de les utiliser avec prudence, le cas échéant. Consultez l'extrait suivant, tiré d'un document MISRA C, qui recommande d'utiliser une macro plutôt qu'une fonction.

Les règles MISRA C en action

Assez de discussion, il est maintenant temps de vous familiariser avec certaines règles de la MISRA C, avec des exemples illustrant leur application.

Utiliser des types compatibles comme arguments de pointeur vers memcpy, memmove et memcmp

Les fonctions standard de la bibliothèque memcpy, memmove, et memcmp effectuer un déplacement octet par octet ou une comparaison du nombre d'octets spécifié. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de fonction doivent être des pointeurs vers le 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 de conformité officiel de la MISRA. La règle est obligatoire, décidable, et s'applique à la fois au C90 et au C99.

Screenshot of MISRA C Rule 21.15

La description de la règle est suivie d'un exemple.

Screenshot of a non-compliant solution.

Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), il s'agit d'une solution non conforme.

Les fonctions de gestion des chaînes qui ne prennent pas de longueur en entrée ne doivent pas entraîner d'accès sortant

Les fonctions de gestion des chaînes <string.h>qui ne prennent pas la longueur en entrée ne devraient pas entraîner d'accès sortant. Les fonctions pertinentes sont les suivantes : strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr et strtok. La règle est obligatoire, ce qui signifie qu'il ne pourra jamais être violé, quelles que soient les circonstances. Il s'applique à la fois au C90 et au C99 et est indécidable.

Screenshot of MISRA C rule 21.17.

L'exemple correspondant est le suivant :

Screenshot of a correct example of string handling functions

Comme vous pouvez le constater, 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 » convient.

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

Dir 4.14 recommande de vérifier la validité des données reçues de sources « externes ». L'entrée externe peut être :

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

Cette directive s'inscrit dans le requis catégorie, et s'applique à la fois au C90 et au C99. La raison en est 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 attend d'un utilisateur qu'il saisisse un nombre, mais que l'utilisateur saisisse 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.

Validity Of Values Received From External Sources Shall Be Checked

Comment passer à MISRA C 2012

Le passage à MISRA C 2012 nécessitera une mise à jour de votre document de directives de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (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é à la norme MISRA C 2012 :

  1. Contrôle de la conformité 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. En plus de vérifier la conformité à MISRA C, il peut également aider à identifier les bogues et vulnérabilités potentiels.
  3. Code Sonar est un autre outil qui vérifie la conformité à la fois à MISRA C et à C++.

Il existe également quelques compilateurs qui peuvent tester la conformité à la MISRA. En cas de détection d'une violation de règle, des avertissements ou des exceptions sont déclenchés en conséquence. Par ex. Logiciel Green Hills fournit des compilateurs compatibles avec 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 dans MISRA C

Le produit phare de Secure Code Warrior, la plateforme d'apprentissage, propose de nombreux défis, cours et évaluations interactifs qui peuvent aider à former les développeurs à écrire du code C/C++ sécurisé. Le contenu de la plateforme est spécifique au framework et très engageant. Nos défis de codage C/C++:Embed se sont inspirés de MISRA C, AUTOSAR C++ (MISRA C++) et IEC.

Les développeurs peuvent se lancer dans des parcours d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques au C/C++ et, surtout, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès pour identifier leurs faiblesses et même participer à des compétitions de codage amicales avec leurs pairs. En savoir plus sur comment nous aidons les industries de l'automobile et des transports grâce à nos solutions.

Vous voulez découvrir dans quelle mesure nos défis sont interactifs et intégrés ? Essayez quelques défis liés à C/C++:Embed sur la plateforme d'apprentissage dès aujourd'hui !

Slogan

Govern AI-driven development before it ships

Measure AI-assisted risk, enforce secure coding policy at commit, and accelerate secure delivery across your SDLC.

book a demo
Slogan

Explore more blogs

Lorem ipsum diam quis enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra orci sagittis eu volutpat odio facilisis.

browse all
Case Study
Filter Label
This is some text inside of a div block.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Learn More
Case Study
Filter Label
This is some text inside of a div block.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

Learn More
Case Study
Filter Label
This is some text inside of a div block.

One Culture of Security: How Sage built their security champions program with agile secure code learning

Discover how Sage enhanced security with a flexible, relationship-focused approach, creating 200+ security champions and achieving measurable risk reduction.

Learn More
Blog
Filter Label
This is some text inside of a div block.

Enabler 7: Developer Recognition

Recognition fuels participation. Enabler 7 celebrates developer achievement loudly, with rewards and exclusive swag that mark real, earned secure coding wins.

Learn More
Blog
Filter Label
This is some text inside of a div block.

Named in the Gartner® Hype Cycle™ for Application Security 2026

Secure Code Warrior is named in the Gartner® Hype Cycle™ for Application Security, 2026 for Agentic Coding Security and Secure Coding Training. Here's why.

Learn More
Blog
Filter Label
This is some text inside of a div block.

Are you a CISO or Engineering Leader worried about the Security and Cost of LLM code generation?

Review the SCW AI Trust Index, our proprietary LLM benchmarking data, before going all-in on an AI model.

Learn More

Secure AI-driven development before it ships

See developer risk, enforce policy, and prevent vulnerabilities across your software development lifecycle.

Réserver une démo
trust score
No items found.