Iconos SCW
héroe bg sin separador
Blog

MISRA C 2012 对比 MISRA C2-如何切换

Secure Code Warrior
Publicado el 17 de agosto de 2021
Última actualización el 9 de marzo de 2026

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.

Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.

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

MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar. 

¿Qué es la norma de codificación MISRA C?

El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad 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 normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.

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 sólo tienen uno o dos niveles de abstracción sobre 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 hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico. 

Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?

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

C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.

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

  • Corregir los problemas encontrados en la versión de 2004.
  • Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
  • Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
  • Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
  • Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.

Las normas MISRA C en acción

Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.

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

Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte 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 la función con tipos de punteros incompatibles podría indicar un error. 

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

Captura de pantalla de la regla 21.15 de MISRA C

Un ejemplo sigue a la descripción de la regla.

Captura de pantalla de una solución no conforme.

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

Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites

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.

Captura de pantalla de la regla 21.17 de MISRA C.

El ejemplo correspondiente es:

Captura de pantalla de un ejemplo correcto de funciones de manejo de cadenas

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

Validar los datos recibidos externamente

La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:

  • Leer de un archivo.
  • Leer de una variable de entorno.
  • Cualquier entrada del usuario.
  • Cualquier cosa recibida 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 entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo 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 maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.

Se comprobará la validez de los valores recibidos de fuentes externas

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 utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:

  1. Cppcheck 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 periodo 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. CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.

También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.

Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C

El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en 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 una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.

¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.

Ver recursos
Ver recursos

在这篇文章中,我们将比较MISRA C 2012标准与C2,并指导您完成切换到新标准的旅程。我们将解释为什么 MISRA 的合规性是构建安全的嵌入式系统所必需的。

¿Te interesa saber más?

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Más información

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Reservar una demostración
Compartir en:
marcas de LinkedInSocialx logotipo
Autor
Secure Code Warrior
Publicado el 17 de agosto de 2021

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Este artículo fue escrito por Secure Code Warrior El equipo de expertos de la industria de está comprometido a brindar a los desarrolladores los conocimientos y las habilidades para crear software seguro desde el principio. Aprovechamos nuestra profunda experiencia en prácticas de codificación segura, tendencias de la industria y conocimientos del mundo real.

Compartir en:
marcas de LinkedInSocialx logotipo

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.

Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.

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

MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar. 

¿Qué es la norma de codificación MISRA C?

El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad 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 normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.

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 sólo tienen uno o dos niveles de abstracción sobre 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 hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico. 

Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?

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

C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.

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

  • Corregir los problemas encontrados en la versión de 2004.
  • Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
  • Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
  • Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
  • Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.

Las normas MISRA C en acción

Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.

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

Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte 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 la función con tipos de punteros incompatibles podría indicar un error. 

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

Captura de pantalla de la regla 21.15 de MISRA C

Un ejemplo sigue a la descripción de la regla.

Captura de pantalla de una solución no conforme.

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

Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites

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.

Captura de pantalla de la regla 21.17 de MISRA C.

El ejemplo correspondiente es:

Captura de pantalla de un ejemplo correcto de funciones de manejo de cadenas

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

Validar los datos recibidos externamente

La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:

  • Leer de un archivo.
  • Leer de una variable de entorno.
  • Cualquier entrada del usuario.
  • Cualquier cosa recibida 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 entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo 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 maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.

Se comprobará la validez de los valores recibidos de fuentes externas

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 utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:

  1. Cppcheck 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 periodo 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. CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.

También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.

Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C

El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en 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 una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.

¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.

Ver recursos
Ver recursos

Rellene el siguiente formulario para descargar el informe.

Nos gustaría obtener su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación de seguridad. Trataremos su información personal con el máximo cuidado y nunca la venderemos a otras empresas con fines comerciales.

Enviar
Icono de éxito de SCW
Icono de error scw
Para enviar el formulario, habilite las cookies de análisis. Una vez completado, puede desactivarlas nuevamente si lo desea.

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.

Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.

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

MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar. 

¿Qué es la norma de codificación MISRA C?

El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad 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 normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.

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 sólo tienen uno o dos niveles de abstracción sobre 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 hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico. 

Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?

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

C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.

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

  • Corregir los problemas encontrados en la versión de 2004.
  • Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
  • Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
  • Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
  • Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.

Las normas MISRA C en acción

Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.

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

Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte 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 la función con tipos de punteros incompatibles podría indicar un error. 

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

Captura de pantalla de la regla 21.15 de MISRA C

Un ejemplo sigue a la descripción de la regla.

Captura de pantalla de una solución no conforme.

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

Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites

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.

Captura de pantalla de la regla 21.17 de MISRA C.

El ejemplo correspondiente es:

Captura de pantalla de un ejemplo correcto de funciones de manejo de cadenas

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

Validar los datos recibidos externamente

La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:

  • Leer de un archivo.
  • Leer de una variable de entorno.
  • Cualquier entrada del usuario.
  • Cualquier cosa recibida 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 entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo 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 maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.

Se comprobará la validez de los valores recibidos de fuentes externas

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 utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:

  1. Cppcheck 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 periodo 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. CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.

También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.

Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C

El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en 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 una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.

¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.

Ver el seminario web
Empecemos.
Más información

Haga clic en el siguiente enlace y descargue el PDF de este recurso.

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Ver informeReservar una demostración
Ver recursos
Compartir en:
marcas de LinkedInSocialx logotipo
¿Te interesa saber más?

Compartir en:
marcas de LinkedInSocialx logotipo
Autor
Secure Code Warrior
Publicado el 17 de agosto de 2021

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Este artículo fue escrito por Secure Code Warrior El equipo de expertos de la industria de está comprometido a brindar a los desarrolladores los conocimientos y las habilidades para crear software seguro desde el principio. Aprovechamos nuestra profunda experiencia en prácticas de codificación segura, tendencias de la industria y conocimientos del mundo real.

Compartir en:
marcas de LinkedInSocialx logotipo

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.

Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.

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

MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar. 

¿Qué es la norma de codificación MISRA C?

El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad 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 normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.

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 sólo tienen uno o dos niveles de abstracción sobre 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 hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico. 

Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?

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

C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.

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

  • Corregir los problemas encontrados en la versión de 2004.
  • Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
  • Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
  • Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
  • Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.

Las normas MISRA C en acción

Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.

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

Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte 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 la función con tipos de punteros incompatibles podría indicar un error. 

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

Captura de pantalla de la regla 21.15 de MISRA C

Un ejemplo sigue a la descripción de la regla.

Captura de pantalla de una solución no conforme.

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

Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites

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.

Captura de pantalla de la regla 21.17 de MISRA C.

El ejemplo correspondiente es:

Captura de pantalla de un ejemplo correcto de funciones de manejo de cadenas

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

Validar los datos recibidos externamente

La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:

  • Leer de un archivo.
  • Leer de una variable de entorno.
  • Cualquier entrada del usuario.
  • Cualquier cosa recibida 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 entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo 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 maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.

Se comprobará la validez de los valores recibidos de fuentes externas

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 utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:

  1. Cppcheck 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 periodo 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. CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.

También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.

Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C

El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en 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 una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.

¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.

Índice

Descargar PDF
Ver recursos
¿Te interesa saber más?

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Más información

Secure Code Warrior puede ayudar a su organización a proteger el código a lo largo de todo el ciclo de vida del desarrollo de software y a crear una cultura que dé prioridad a la ciberseguridad. Tanto si es usted responsable de seguridad de aplicaciones, desarrollador, director de seguridad de la información o cualquier otra persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados al código inseguro.

Reservar una demostraciónDescargar
Compartir en:
marcas de LinkedInSocialx logotipo
Centro de recursos

Recursos para ayudarle a empezar

Más publicaciones
Centro de recursos

Recursos para ayudarle a empezar

Más publicaciones