Blog

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

August 17, 2021
Secure Code Warrior

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.

Screenshot of MISRA C Rule 21.15

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

Screenshot of a non-compliant solution.

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.

Screenshot of MISRA C rule 21.17.

El ejemplo correspondiente es:

Screenshot of a correct example of string handling functions

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.

Validity Of Values Received From External Sources Shall Be Checked

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!

Share on social
Lema

Govern AI-driven development before it ships

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

book a demo
book a demo
Lema

Explore more blogs

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

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

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

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

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

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

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

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

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

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

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

Post-Quantum Cryptography: Quantum Computers Will Break Today’s Encryption – Are You Ready?

Post-quantum cryptography (PQC) is critical for protecting data from quantum computing threats. Learn how “harvest now, decrypt later” exposes risk and how developers can prepare for quantum-safe security.

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

Enabler 2: Senior Leadership Sponsorship

Explore Enabler 2: Senior Leadership Sponsorship. Learn why active buy-in from the CIO, CTO, and CISO is vital to drive developer adoption and program credibility.

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

Observe and Secure the ADLC: A Four-Point Framework for CISOs and Development Teams Using AI

While development teams look to make the most of GenAI’s undeniable benefits, we’d like to propose a four-point foundational framework that will allow security leaders to deploy AI coding tools and agents with a higher, more relevant standard of security best practices. It details exactly what enterprises can do to ensure safe, secure code development right now, and as agentic AI becomes an even bigger factor in the future.

Learn More

Secure AI-driven development before it ships

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

Book a demo