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

MISRA C 2012 frente a MISRA C2: cómo hacer un cambio

Secure Code Warrior
Publié le 17 août 2021
Dernière mise à jour le 6 mars 2026

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, hablaremos sobre el estándar MISRA C 2012 y sobre por qué es necesario cumplirlo para construir sistemas integrados seguros.

Al escribir código en C, es muy fácil implementar cosas que parecen correctas, pero que son intrínsecamente incorrectas. Tu código puede compilarse bien e incluso funcionar bien durante un cierto período de tiempo. Sin embargo, el mismo código podría fallar o mostrar un comportamiento indefinido si el tamaño de entrada o la memoria aumentan. Por ejemplo, un número de entrada determinado hace que un entero se desborde, o una secuencia de caracteres concreta hace que una matriz se salga de los límites.

Aquí es donde el estándar de codificación MISRA C puede ayudar. Las reglas, directrices y mejores prácticas establecidas en el estándar permiten a los desarrolladores escribir código C seguro y confiable para el desarrollo integrado.

MISRA C 2012, la última versión de la norma, agrega nuevas reglas, mejora las existentes y aborda algunas discrepancias. Si todavía utilizas una versión anterior, ahora sería un buen momento para cambiarla.

¿Qué es el estándar de codificación MISRA C?

El estándar MISRA C incluye pautas de seguridad, portabilidad y confiabilidad del código para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998 y era específico para el lenguaje C.

Sin embargo, desde entonces, el Consorcio MISRA también desarrolla estándares de codificación para C++. Cada documento C de MISRA contiene un conjunto de reglas, ejemplos que no cumplen con las normas y secciones detalladas sobre la información básica que contribuyó al desarrollo de dichas reglas.

C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que solo tienen 1 o 2 niveles de abstracción en comparación con el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no tienes que preocuparte por cosas triviales como la recolección de basura o la escritura dinámica.

Sin embargo, en C, no hay una forma predefinida de recolectar basura, es decir, si asignas una parte de la memoria para una estructura de datos, tienes que liberarla manualmente, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no te liberará memoria, lo que provocará una pérdida de memoria.

MISRA C 2004 (C2) contra MISRA C 2012 (C3) — ¿Qué ha cambiado?

MISRA C: 2012, también conocido como C3, se lanzó por primera vez en abril de 2013. Basándose en el conocimiento de los trabajos de miles de personas y organizaciones, el C3 añade nuevas reglas, mejora la explicación y los antecedentes de algunas reglas existentes y cierra algunas lagunas.

El C3 es compatible con la versión C99 del lenguaje y, al mismo tiempo, mantiene las reglas de la antigua ISO C90. La principal área de enfoque del C3 era reducir los costos habituales de la aplicación de las reglas y, al mismo tiempo, hacer que el uso del lenguaje C fuera más seguro en los sistemas críticos. Todo esto hace que sea prudente cambiar al nuevo estándar, si aún no lo ha hecho.

En general, esta es una lista de los cambios más importantes:

  • Corrija los problemas encontrados en la versión de 2004.
  • Aumente significativamente el número de reglas decidibles. Una regla es decidible, si una herramienta de análisis puede ayudarle a determinar la conformidad con ella.
  • Las reglas se clasifican en «obligatorias», «consultivas» u «obligatorias». Las reglas obligatorias nunca deben infringirse, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden infringirse en situaciones especiales, siempre que la infracción esté justificada.
  • Se ha añadido una guía sobre cómo aplicar reglas al código generado automáticamente. Esto es muy importante porque las mismas directrices del código escrito por humanos no siempre se aplican al generado por una herramienta.
  • Elimine las reglas demasiado generalizadas que prohibían el comportamiento razonable de los usuarios. Por ejemplo, anteriormente se recomendaba no usar macros en absoluto, ya que pueden generar diversas dificultades y confusiones (no pueden depurar macros, las macros no tienen espacios de nombres, etc.). Esto impedía el uso de macros, incluso en situaciones en las que podían proporcionar una solución elegante, segura y cómoda. En MISRA C: 2012, se introdujeron nuevas reglas con respecto a las macros, que permitían a las personas usarlas con cuidado, siempre que fuera aplicable. Consulte el siguiente extracto, tomado de un documento de MISRA C, en el que se recomienda utilizar una macro en lugar de una función.

Reglas de MISRA C en acción

Basta de hablar, ahora es el momento de ponerse manos a la obra con algunas reglas de MISRA C, con ejemplos de cómo se aplican.

Utilice tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp

Las funciones estándar de la biblioteca memcpy, memmove, y memcmp realizar un movimiento byte por byte o una comparación del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a una función con tipos de punteros incompatibles podría indicar un error.

Considera la siguiente imagen, tomada del documento oficial de cumplimiento de MISRA. La regla es requerida, decidible, y se aplica tanto a C90 como a C99.

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

A continuación de la descripción de la regla se muestra un ejemplo.

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

Como puede ver, dado que los objetos son de diferentes tipos (uint8_t y uint16_t), esta es una solución que no cumple con los requisitos.

Las funciones de manejo de cadenas que no toman longitud como entrada no darán como resultado un acceso fuera de los límites

Las funciones de manejo de cadenas <string.h>que no toman la longitud como entrada no deberían resultar en un acceso fuera de los límites. Las funciones relevantes son: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr y strtok. La regla es obligatorio, lo que significa que nunca se puede infringir, bajo ninguna circunstancia. Se aplica tanto al C90 como al C99, y es indecidible.

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

El ejemplo correspondiente es:

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

Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que solo puede contener 5 caracteres. También tenemos un uso seguro y compatible de strcpy, según el cual la cadena solo se copiará si cabe el contenido de «str».

Validar los datos recibidos externamente

Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes «externas». La entrada externa puede ser:

  • Lee desde un archivo.
  • Lee desde una variable de entorno.
  • Cualquier entrada del usuario.
  • Todo lo que se reciba a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.

Esta directiva se inscribe en el requerido categoría, y es aplicable tanto a la C90 como a la C99. La razón de esto es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o malintencionados. Por ejemplo, un programa espera que un usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que realmente se trata de un número.

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

Cómo cambiar a MISRA C 2012

El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no usas una y, en cambio, confías en una herramienta de análisis estático (que es la opción recomendada), es posible que tengas que comprar una versión más reciente de la herramienta. Estas son tres herramientas que comprueban el cumplimiento de la MISRA C 2012:

  1. Control de CPU es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
  2. PC-Lint Plus es una herramienta de pago que viene con un período de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
  3. Código SONAR es otra herramienta que comprueba el cumplimiento de MISRA en C y C++.

También hay algunos compiladores que pueden probar el cumplimiento de MISRA. En caso de que se detecte una infracción de la regla, se generarán las correspondientes advertencias o excepciones. Por ejemplo. Programas de Green Hills proporciona compiladores compatibles con todos los estándares MISRA, para arquitecturas de 32 y 64 bits.

Uso de Secure Code Warrior para mejorar las habilidades de los desarrolladores en MISRA C

El producto estrella de Secure Code Warrior, la plataforma de aprendizaje, incluye numerosos desafíos, cursos y evaluaciones interactivos que pueden ayudar a capacitar a los desarrolladores para escribir código C/C++ seguro. El contenido de la plataforma es específico para cada marco y es muy atractivo. Nuestros desafíos de codificación C/C++:Embed se inspiraron en MISRA C, AUTOSAR C++ (MISRA C++) e IEC.

Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles e incluso disfrutar de un concurso de programación amistoso con sus compañeros. Obtenga más información sobre cómo ayudamos a las industrias automotriz y de transporte con nuestras soluciones.

¿Quiere saber qué tan interactivos y centrados son nuestros desafíos? ¡Prueba algunos desafíos de C/C++:Embed ¡en la plataforma de aprendizaje hoy!

Veuillez consulter la ressource
Veuillez consulter la ressource

En esta publicación, compararemos el estándar MISRA C 2012 con el C2 y lo guiaremos en el proceso de cambio al nuevo estándar. Explicaremos por qué el cumplimiento de MISRA es necesario para crear sistemas integrados seguros.

Souhaitez-vous en savoir davantage ?

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é.

En savoir plus

Secure Code Warrior là pour aider votre organisation à protéger le code tout au long du cycle de vie du développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez administrateur 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é.

Veuillez réserver une démonstration.
Partager sur :
marques LinkedInSocialLogo x
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é.

Cet article a été écrit par Secure Code Warrior L'équipe d'experts du secteur de s'engage à fournir aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie des pratiques de codage sécurisé, des tendances du secteur et des connaissances du monde réel.

Partager sur :
marques LinkedInSocialLogo x

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, hablaremos sobre el estándar MISRA C 2012 y sobre por qué es necesario cumplirlo para construir sistemas integrados seguros.

Al escribir código en C, es muy fácil implementar cosas que parecen correctas, pero que son intrínsecamente incorrectas. Tu código puede compilarse bien e incluso funcionar bien durante un cierto período de tiempo. Sin embargo, el mismo código podría fallar o mostrar un comportamiento indefinido si el tamaño de entrada o la memoria aumentan. Por ejemplo, un número de entrada determinado hace que un entero se desborde, o una secuencia de caracteres concreta hace que una matriz se salga de los límites.

Aquí es donde el estándar de codificación MISRA C puede ayudar. Las reglas, directrices y mejores prácticas establecidas en el estándar permiten a los desarrolladores escribir código C seguro y confiable para el desarrollo integrado.

MISRA C 2012, la última versión de la norma, agrega nuevas reglas, mejora las existentes y aborda algunas discrepancias. Si todavía utilizas una versión anterior, ahora sería un buen momento para cambiarla.

¿Qué es el estándar de codificación MISRA C?

El estándar MISRA C incluye pautas de seguridad, portabilidad y confiabilidad del código para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998 y era específico para el lenguaje C.

Sin embargo, desde entonces, el Consorcio MISRA también desarrolla estándares de codificación para C++. Cada documento C de MISRA contiene un conjunto de reglas, ejemplos que no cumplen con las normas y secciones detalladas sobre la información básica que contribuyó al desarrollo de dichas reglas.

C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que solo tienen 1 o 2 niveles de abstracción en comparación con el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no tienes que preocuparte por cosas triviales como la recolección de basura o la escritura dinámica.

Sin embargo, en C, no hay una forma predefinida de recolectar basura, es decir, si asignas una parte de la memoria para una estructura de datos, tienes que liberarla manualmente, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no te liberará memoria, lo que provocará una pérdida de memoria.

MISRA C 2004 (C2) contra MISRA C 2012 (C3) — ¿Qué ha cambiado?

MISRA C: 2012, también conocido como C3, se lanzó por primera vez en abril de 2013. Basándose en el conocimiento de los trabajos de miles de personas y organizaciones, el C3 añade nuevas reglas, mejora la explicación y los antecedentes de algunas reglas existentes y cierra algunas lagunas.

El C3 es compatible con la versión C99 del lenguaje y, al mismo tiempo, mantiene las reglas de la antigua ISO C90. La principal área de enfoque del C3 era reducir los costos habituales de la aplicación de las reglas y, al mismo tiempo, hacer que el uso del lenguaje C fuera más seguro en los sistemas críticos. Todo esto hace que sea prudente cambiar al nuevo estándar, si aún no lo ha hecho.

En general, esta es una lista de los cambios más importantes:

  • Corrija los problemas encontrados en la versión de 2004.
  • Aumente significativamente el número de reglas decidibles. Una regla es decidible, si una herramienta de análisis puede ayudarle a determinar la conformidad con ella.
  • Las reglas se clasifican en «obligatorias», «consultivas» u «obligatorias». Las reglas obligatorias nunca deben infringirse, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden infringirse en situaciones especiales, siempre que la infracción esté justificada.
  • Se ha añadido una guía sobre cómo aplicar reglas al código generado automáticamente. Esto es muy importante porque las mismas directrices del código escrito por humanos no siempre se aplican al generado por una herramienta.
  • Elimine las reglas demasiado generalizadas que prohibían el comportamiento razonable de los usuarios. Por ejemplo, anteriormente se recomendaba no usar macros en absoluto, ya que pueden generar diversas dificultades y confusiones (no pueden depurar macros, las macros no tienen espacios de nombres, etc.). Esto impedía el uso de macros, incluso en situaciones en las que podían proporcionar una solución elegante, segura y cómoda. En MISRA C: 2012, se introdujeron nuevas reglas con respecto a las macros, que permitían a las personas usarlas con cuidado, siempre que fuera aplicable. Consulte el siguiente extracto, tomado de un documento de MISRA C, en el que se recomienda utilizar una macro en lugar de una función.

Reglas de MISRA C en acción

Basta de hablar, ahora es el momento de ponerse manos a la obra con algunas reglas de MISRA C, con ejemplos de cómo se aplican.

Utilice tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp

Las funciones estándar de la biblioteca memcpy, memmove, y memcmp realizar un movimiento byte por byte o una comparación del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a una función con tipos de punteros incompatibles podría indicar un error.

Considera la siguiente imagen, tomada del documento oficial de cumplimiento de MISRA. La regla es requerida, decidible, y se aplica tanto a C90 como a C99.

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

A continuación de la descripción de la regla se muestra un ejemplo.

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

Como puede ver, dado que los objetos son de diferentes tipos (uint8_t y uint16_t), esta es una solución que no cumple con los requisitos.

Las funciones de manejo de cadenas que no toman longitud como entrada no darán como resultado un acceso fuera de los límites

Las funciones de manejo de cadenas <string.h>que no toman la longitud como entrada no deberían resultar en un acceso fuera de los límites. Las funciones relevantes son: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr y strtok. La regla es obligatorio, lo que significa que nunca se puede infringir, bajo ninguna circunstancia. Se aplica tanto al C90 como al C99, y es indecidible.

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

El ejemplo correspondiente es:

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

Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que solo puede contener 5 caracteres. También tenemos un uso seguro y compatible de strcpy, según el cual la cadena solo se copiará si cabe el contenido de «str».

Validar los datos recibidos externamente

Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes «externas». La entrada externa puede ser:

  • Lee desde un archivo.
  • Lee desde una variable de entorno.
  • Cualquier entrada del usuario.
  • Todo lo que se reciba a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.

Esta directiva se inscribe en el requerido categoría, y es aplicable tanto a la C90 como a la C99. La razón de esto es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o malintencionados. Por ejemplo, un programa espera que un usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que realmente se trata de un número.

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

Cómo cambiar a MISRA C 2012

El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no usas una y, en cambio, confías en una herramienta de análisis estático (que es la opción recomendada), es posible que tengas que comprar una versión más reciente de la herramienta. Estas son tres herramientas que comprueban el cumplimiento de la MISRA C 2012:

  1. Control de CPU es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
  2. PC-Lint Plus es una herramienta de pago que viene con un período de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
  3. Código SONAR es otra herramienta que comprueba el cumplimiento de MISRA en C y C++.

También hay algunos compiladores que pueden probar el cumplimiento de MISRA. En caso de que se detecte una infracción de la regla, se generarán las correspondientes advertencias o excepciones. Por ejemplo. Programas de Green Hills proporciona compiladores compatibles con todos los estándares MISRA, para arquitecturas de 32 y 64 bits.

Uso de Secure Code Warrior para mejorar las habilidades de los desarrolladores en MISRA C

El producto estrella de Secure Code Warrior, la plataforma de aprendizaje, incluye numerosos desafíos, cursos y evaluaciones interactivos que pueden ayudar a capacitar a los desarrolladores para escribir código C/C++ seguro. El contenido de la plataforma es específico para cada marco y es muy atractivo. Nuestros desafíos de codificación C/C++:Embed se inspiraron en MISRA C, AUTOSAR C++ (MISRA C++) e IEC.

Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles e incluso disfrutar de un concurso de programación amistoso con sus compañeros. Obtenga más información sobre cómo ayudamos a las industrias automotriz y de transporte con nuestras soluciones.

¿Quiere saber qué tan interactivos y centrados son nuestros desafíos? ¡Prueba algunos desafíos de C/C++:Embed ¡en la plataforma de aprendizaje hoy!

Veuillez consulter la ressource
Veuillez consulter la ressource

Veuillez remplir le formulaire suivant pour télécharger le rapport.

Nous souhaiterions obtenir votre autorisation pour vous envoyer des informations sur nos produits 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.

Envoyer
icône de réussite scw
icône d'erreur scw
Pour envoyer le formulaire, veuillez activer les cookies « d'analyse ». N'hésitez pas à les désactiver à nouveau une fois que vous avez terminé.

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, hablaremos sobre el estándar MISRA C 2012 y sobre por qué es necesario cumplirlo para construir sistemas integrados seguros.

Al escribir código en C, es muy fácil implementar cosas que parecen correctas, pero que son intrínsecamente incorrectas. Tu código puede compilarse bien e incluso funcionar bien durante un cierto período de tiempo. Sin embargo, el mismo código podría fallar o mostrar un comportamiento indefinido si el tamaño de entrada o la memoria aumentan. Por ejemplo, un número de entrada determinado hace que un entero se desborde, o una secuencia de caracteres concreta hace que una matriz se salga de los límites.

Aquí es donde el estándar de codificación MISRA C puede ayudar. Las reglas, directrices y mejores prácticas establecidas en el estándar permiten a los desarrolladores escribir código C seguro y confiable para el desarrollo integrado.

MISRA C 2012, la última versión de la norma, agrega nuevas reglas, mejora las existentes y aborda algunas discrepancias. Si todavía utilizas una versión anterior, ahora sería un buen momento para cambiarla.

¿Qué es el estándar de codificación MISRA C?

El estándar MISRA C incluye pautas de seguridad, portabilidad y confiabilidad del código para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998 y era específico para el lenguaje C.

Sin embargo, desde entonces, el Consorcio MISRA también desarrolla estándares de codificación para C++. Cada documento C de MISRA contiene un conjunto de reglas, ejemplos que no cumplen con las normas y secciones detalladas sobre la información básica que contribuyó al desarrollo de dichas reglas.

C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que solo tienen 1 o 2 niveles de abstracción en comparación con el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no tienes que preocuparte por cosas triviales como la recolección de basura o la escritura dinámica.

Sin embargo, en C, no hay una forma predefinida de recolectar basura, es decir, si asignas una parte de la memoria para una estructura de datos, tienes que liberarla manualmente, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no te liberará memoria, lo que provocará una pérdida de memoria.

MISRA C 2004 (C2) contra MISRA C 2012 (C3) — ¿Qué ha cambiado?

MISRA C: 2012, también conocido como C3, se lanzó por primera vez en abril de 2013. Basándose en el conocimiento de los trabajos de miles de personas y organizaciones, el C3 añade nuevas reglas, mejora la explicación y los antecedentes de algunas reglas existentes y cierra algunas lagunas.

El C3 es compatible con la versión C99 del lenguaje y, al mismo tiempo, mantiene las reglas de la antigua ISO C90. La principal área de enfoque del C3 era reducir los costos habituales de la aplicación de las reglas y, al mismo tiempo, hacer que el uso del lenguaje C fuera más seguro en los sistemas críticos. Todo esto hace que sea prudente cambiar al nuevo estándar, si aún no lo ha hecho.

En general, esta es una lista de los cambios más importantes:

  • Corrija los problemas encontrados en la versión de 2004.
  • Aumente significativamente el número de reglas decidibles. Una regla es decidible, si una herramienta de análisis puede ayudarle a determinar la conformidad con ella.
  • Las reglas se clasifican en «obligatorias», «consultivas» u «obligatorias». Las reglas obligatorias nunca deben infringirse, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden infringirse en situaciones especiales, siempre que la infracción esté justificada.
  • Se ha añadido una guía sobre cómo aplicar reglas al código generado automáticamente. Esto es muy importante porque las mismas directrices del código escrito por humanos no siempre se aplican al generado por una herramienta.
  • Elimine las reglas demasiado generalizadas que prohibían el comportamiento razonable de los usuarios. Por ejemplo, anteriormente se recomendaba no usar macros en absoluto, ya que pueden generar diversas dificultades y confusiones (no pueden depurar macros, las macros no tienen espacios de nombres, etc.). Esto impedía el uso de macros, incluso en situaciones en las que podían proporcionar una solución elegante, segura y cómoda. En MISRA C: 2012, se introdujeron nuevas reglas con respecto a las macros, que permitían a las personas usarlas con cuidado, siempre que fuera aplicable. Consulte el siguiente extracto, tomado de un documento de MISRA C, en el que se recomienda utilizar una macro en lugar de una función.

Reglas de MISRA C en acción

Basta de hablar, ahora es el momento de ponerse manos a la obra con algunas reglas de MISRA C, con ejemplos de cómo se aplican.

Utilice tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp

Las funciones estándar de la biblioteca memcpy, memmove, y memcmp realizar un movimiento byte por byte o una comparación del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a una función con tipos de punteros incompatibles podría indicar un error.

Considera la siguiente imagen, tomada del documento oficial de cumplimiento de MISRA. La regla es requerida, decidible, y se aplica tanto a C90 como a C99.

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

A continuación de la descripción de la regla se muestra un ejemplo.

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

Como puede ver, dado que los objetos son de diferentes tipos (uint8_t y uint16_t), esta es una solución que no cumple con los requisitos.

Las funciones de manejo de cadenas que no toman longitud como entrada no darán como resultado un acceso fuera de los límites

Las funciones de manejo de cadenas <string.h>que no toman la longitud como entrada no deberían resultar en un acceso fuera de los límites. Las funciones relevantes son: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr y strtok. La regla es obligatorio, lo que significa que nunca se puede infringir, bajo ninguna circunstancia. Se aplica tanto al C90 como al C99, y es indecidible.

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

El ejemplo correspondiente es:

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

Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que solo puede contener 5 caracteres. También tenemos un uso seguro y compatible de strcpy, según el cual la cadena solo se copiará si cabe el contenido de «str».

Validar los datos recibidos externamente

Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes «externas». La entrada externa puede ser:

  • Lee desde un archivo.
  • Lee desde una variable de entorno.
  • Cualquier entrada del usuario.
  • Todo lo que se reciba a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.

Esta directiva se inscribe en el requerido categoría, y es aplicable tanto a la C90 como a la C99. La razón de esto es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o malintencionados. Por ejemplo, un programa espera que un usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que realmente se trata de un número.

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

Cómo cambiar a MISRA C 2012

El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no usas una y, en cambio, confías en una herramienta de análisis estático (que es la opción recomendada), es posible que tengas que comprar una versión más reciente de la herramienta. Estas son tres herramientas que comprueban el cumplimiento de la MISRA C 2012:

  1. Control de CPU es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
  2. PC-Lint Plus es una herramienta de pago que viene con un período de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
  3. Código SONAR es otra herramienta que comprueba el cumplimiento de MISRA en C y C++.

También hay algunos compiladores que pueden probar el cumplimiento de MISRA. En caso de que se detecte una infracción de la regla, se generarán las correspondientes advertencias o excepciones. Por ejemplo. Programas de Green Hills proporciona compiladores compatibles con todos los estándares MISRA, para arquitecturas de 32 y 64 bits.

Uso de Secure Code Warrior para mejorar las habilidades de los desarrolladores en MISRA C

El producto estrella de Secure Code Warrior, la plataforma de aprendizaje, incluye numerosos desafíos, cursos y evaluaciones interactivos que pueden ayudar a capacitar a los desarrolladores para escribir código C/C++ seguro. El contenido de la plataforma es específico para cada marco y es muy atractivo. Nuestros desafíos de codificación C/C++:Embed se inspiraron en MISRA C, AUTOSAR C++ (MISRA C++) e IEC.

Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles e incluso disfrutar de un concurso de programación amistoso con sus compañeros. Obtenga más información sobre cómo ayudamos a las industrias automotriz y de transporte con nuestras soluciones.

¿Quiere saber qué tan interactivos y centrados son nuestros desafíos? ¡Prueba algunos desafíos de C/C++:Embed ¡en la plataforma de aprendizaje hoy!

Veuillez consulter le webinaire
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 organisation à protéger le code tout au long du cycle de vie du développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez administrateur 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é.

Veuillez consulter le rapportVeuillez réserver une démonstration.
Télécharger le PDF
Veuillez consulter la ressource
Partager sur :
marques LinkedInSocialLogo x
Souhaitez-vous en savoir davantage ?

Partager sur :
marques LinkedInSocialLogo x
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é.

Cet article a été écrit par Secure Code Warrior L'équipe d'experts du secteur de s'engage à fournir aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie des pratiques de codage sécurisé, des tendances du secteur et des connaissances du monde réel.

Partager sur :
marques LinkedInSocialLogo x

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, hablaremos sobre el estándar MISRA C 2012 y sobre por qué es necesario cumplirlo para construir sistemas integrados seguros.

Al escribir código en C, es muy fácil implementar cosas que parecen correctas, pero que son intrínsecamente incorrectas. Tu código puede compilarse bien e incluso funcionar bien durante un cierto período de tiempo. Sin embargo, el mismo código podría fallar o mostrar un comportamiento indefinido si el tamaño de entrada o la memoria aumentan. Por ejemplo, un número de entrada determinado hace que un entero se desborde, o una secuencia de caracteres concreta hace que una matriz se salga de los límites.

Aquí es donde el estándar de codificación MISRA C puede ayudar. Las reglas, directrices y mejores prácticas establecidas en el estándar permiten a los desarrolladores escribir código C seguro y confiable para el desarrollo integrado.

MISRA C 2012, la última versión de la norma, agrega nuevas reglas, mejora las existentes y aborda algunas discrepancias. Si todavía utilizas una versión anterior, ahora sería un buen momento para cambiarla.

¿Qué es el estándar de codificación MISRA C?

El estándar MISRA C incluye pautas de seguridad, portabilidad y confiabilidad del código para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998 y era específico para el lenguaje C.

Sin embargo, desde entonces, el Consorcio MISRA también desarrolla estándares de codificación para C++. Cada documento C de MISRA contiene un conjunto de reglas, ejemplos que no cumplen con las normas y secciones detalladas sobre la información básica que contribuyó al desarrollo de dichas reglas.

C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que solo tienen 1 o 2 niveles de abstracción en comparación con el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no tienes que preocuparte por cosas triviales como la recolección de basura o la escritura dinámica.

Sin embargo, en C, no hay una forma predefinida de recolectar basura, es decir, si asignas una parte de la memoria para una estructura de datos, tienes que liberarla manualmente, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no te liberará memoria, lo que provocará una pérdida de memoria.

MISRA C 2004 (C2) contra MISRA C 2012 (C3) — ¿Qué ha cambiado?

MISRA C: 2012, también conocido como C3, se lanzó por primera vez en abril de 2013. Basándose en el conocimiento de los trabajos de miles de personas y organizaciones, el C3 añade nuevas reglas, mejora la explicación y los antecedentes de algunas reglas existentes y cierra algunas lagunas.

El C3 es compatible con la versión C99 del lenguaje y, al mismo tiempo, mantiene las reglas de la antigua ISO C90. La principal área de enfoque del C3 era reducir los costos habituales de la aplicación de las reglas y, al mismo tiempo, hacer que el uso del lenguaje C fuera más seguro en los sistemas críticos. Todo esto hace que sea prudente cambiar al nuevo estándar, si aún no lo ha hecho.

En general, esta es una lista de los cambios más importantes:

  • Corrija los problemas encontrados en la versión de 2004.
  • Aumente significativamente el número de reglas decidibles. Una regla es decidible, si una herramienta de análisis puede ayudarle a determinar la conformidad con ella.
  • Las reglas se clasifican en «obligatorias», «consultivas» u «obligatorias». Las reglas obligatorias nunca deben infringirse, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden infringirse en situaciones especiales, siempre que la infracción esté justificada.
  • Se ha añadido una guía sobre cómo aplicar reglas al código generado automáticamente. Esto es muy importante porque las mismas directrices del código escrito por humanos no siempre se aplican al generado por una herramienta.
  • Elimine las reglas demasiado generalizadas que prohibían el comportamiento razonable de los usuarios. Por ejemplo, anteriormente se recomendaba no usar macros en absoluto, ya que pueden generar diversas dificultades y confusiones (no pueden depurar macros, las macros no tienen espacios de nombres, etc.). Esto impedía el uso de macros, incluso en situaciones en las que podían proporcionar una solución elegante, segura y cómoda. En MISRA C: 2012, se introdujeron nuevas reglas con respecto a las macros, que permitían a las personas usarlas con cuidado, siempre que fuera aplicable. Consulte el siguiente extracto, tomado de un documento de MISRA C, en el que se recomienda utilizar una macro en lugar de una función.

Reglas de MISRA C en acción

Basta de hablar, ahora es el momento de ponerse manos a la obra con algunas reglas de MISRA C, con ejemplos de cómo se aplican.

Utilice tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp

Las funciones estándar de la biblioteca memcpy, memmove, y memcmp realizar un movimiento byte por byte o una comparación del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a una función con tipos de punteros incompatibles podría indicar un error.

Considera la siguiente imagen, tomada del documento oficial de cumplimiento de MISRA. La regla es requerida, decidible, y se aplica tanto a C90 como a C99.

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

A continuación de la descripción de la regla se muestra un ejemplo.

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

Como puede ver, dado que los objetos son de diferentes tipos (uint8_t y uint16_t), esta es una solución que no cumple con los requisitos.

Las funciones de manejo de cadenas que no toman longitud como entrada no darán como resultado un acceso fuera de los límites

Las funciones de manejo de cadenas <string.h>que no toman la longitud como entrada no deberían resultar en un acceso fuera de los límites. Las funciones relevantes son: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr y strtok. La regla es obligatorio, lo que significa que nunca se puede infringir, bajo ninguna circunstancia. Se aplica tanto al C90 como al C99, y es indecidible.

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

El ejemplo correspondiente es:

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

Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que solo puede contener 5 caracteres. También tenemos un uso seguro y compatible de strcpy, según el cual la cadena solo se copiará si cabe el contenido de «str».

Validar los datos recibidos externamente

Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes «externas». La entrada externa puede ser:

  • Lee desde un archivo.
  • Lee desde una variable de entorno.
  • Cualquier entrada del usuario.
  • Todo lo que se reciba a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.

Esta directiva se inscribe en el requerido categoría, y es aplicable tanto a la C90 como a la C99. La razón de esto es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o malintencionados. Por ejemplo, un programa espera que un usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que realmente se trata de un número.

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

Cómo cambiar a MISRA C 2012

El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no usas una y, en cambio, confías en una herramienta de análisis estático (que es la opción recomendada), es posible que tengas que comprar una versión más reciente de la herramienta. Estas son tres herramientas que comprueban el cumplimiento de la MISRA C 2012:

  1. Control de CPU es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
  2. PC-Lint Plus es una herramienta de pago que viene con un período de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
  3. Código SONAR es otra herramienta que comprueba el cumplimiento de MISRA en C y C++.

También hay algunos compiladores que pueden probar el cumplimiento de MISRA. En caso de que se detecte una infracción de la regla, se generarán las correspondientes advertencias o excepciones. Por ejemplo. Programas de Green Hills proporciona compiladores compatibles con todos los estándares MISRA, para arquitecturas de 32 y 64 bits.

Uso de Secure Code Warrior para mejorar las habilidades de los desarrolladores en MISRA C

El producto estrella de Secure Code Warrior, la plataforma de aprendizaje, incluye numerosos desafíos, cursos y evaluaciones interactivos que pueden ayudar a capacitar a los desarrolladores para escribir código C/C++ seguro. El contenido de la plataforma es específico para cada marco y es muy atractivo. Nuestros desafíos de codificación C/C++:Embed se inspiraron en MISRA C, AUTOSAR C++ (MISRA C++) e IEC.

Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles e incluso disfrutar de un concurso de programación amistoso con sus compañeros. Obtenga más información sobre cómo ayudamos a las industrias automotriz y de transporte con nuestras soluciones.

¿Quiere saber qué tan interactivos y centrados son nuestros desafíos? ¡Prueba algunos desafíos de C/C++:Embed ¡en la plataforma de aprendizaje hoy!

Table des matières

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

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é.

En savoir plus

Secure Code Warrior là pour aider votre organisation à protéger le code tout au long du cycle de vie du développement logiciel et à créer une culture où la cybersécurité est une priorité. Que vous soyez administrateur 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é.

Veuillez réserver une démonstration.Télécharger
Partager sur :
marques LinkedInSocialLogo x
Centre de ressources

Ressources pour débuter

Plus de publications
Centre de ressources

Ressources pour débuter

Plus de publications