MISRA C 2012 vs MISRA C2 - Cómo hacer el cambio

Publicado el 17 de agosto de 2021
por Secure Code Warrior
ESTUDIO DE CASO

MISRA C 2012 vs MISRA C2 - Cómo hacer el cambio

Publicado el 17 de agosto de 2021
por Secure Code Warrior
Ver recurso
Ver recurso

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 recurso
Ver recurso

Autor

Secure Code Warrior

Secure Code Warrior crea una cultura de desarrolladores orientados a la seguridad, dotándoles de las habilidades necesarias para codificar de forma segura. Nuestro buque insignia es Agile Learning Platform , que ofrece itinerarios basados en habilidades relevantes, prácticas en missions y herramientas contextuales para que los desarrolladores aprendan, desarrollen y apliquen rápidamente sus habilidades para escribir código seguro a gran velocidad.

¿Quieres más?

Sumérjase en nuestras últimas ideas sobre codificación segura en el blog.

Nuestra amplia biblioteca de recursos tiene como objetivo potenciar el enfoque humano de la mejora de la codificación segura.

Ver blog
¿Quieres más?

Obtenga las últimas investigaciones sobre la seguridad impulsada por los desarrolladores

Nuestra amplia biblioteca de recursos está repleta de recursos útiles, desde libros blancos hasta seminarios web, que le ayudarán a iniciarse en la codificación segura orientada a los desarrolladores. Explórela ahora.

Centro de recursos

MISRA C 2012 vs MISRA C2 - Cómo hacer el cambio

Publicado el 17 de agosto de 2021
Por Secure Code Warrior

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.

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.