Blog

MISRA C 2012 frente a MISRA C2: cómo realizar el cambio

August 17, 2021
Secure Code Warrior
Fragmento de código que muestra comandos de OpenGL para crear un sombreador, definir el color y dibujar triángulos.

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los responsables de seguridad en la creación de sistemas embebidos seguros, nos estamos adentrando en el mundo de la seguridad de sistemas embebidos. En este artículo, hablaremos sobre el estándar MISRA C 2012 y por qué su cumplimiento es necesario para construir sistemas embebidos seguros.

Al escribir código en C, es muy fácil implementar cosas que parecen correctas, pero que son intrínsecamente erróneas. Su código puede compilar perfectamente e incluso funcionar bien durante un tiempo. Sin embargo, ese mismo código podría bloquearse o mostrar un comportamiento indefinido si el tamaño de la entrada o la memoria aumentan. Por ejemplo, un número de entrada específico que provoque un desbordamiento de entero, o una secuencia de caracteres concreta que haga que una matriz se salga de sus límites.

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

MISRA C 2012, la versión más reciente del estándar, añade nuevas reglas, mejora las existentes y soluciona algunas discrepancias. Si todavía utiliza una versión anterior, ahora es un buen momento para cambiar.

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

El estándar MISRA C incluye directrices de seguridad, portabilidad y fiabilidad 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 de MISRA C contiene un conjunto de reglas, ejemplos de incumplimiento y secciones detalladas sobre la información de fondo que contribuyó al desarrollo de dichas reglas.

C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las razones principales es que son rápidos, ya que solo tienen uno o dos niveles de abstracción sobre el lenguaje máquina. Pero esto también significa que escribir código seguro, particularmente 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 tiene que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico.

Sin embargo, en C no existe una forma predefinida de recolectar basura; es decir, si asigna un fragmento de memoria para una estructura de datos, debe liberarlo manualmente una vez que haya terminado de usarlo. Si no lo hace, C, a diferencia de otros lenguajes, no liberará la memoria por usted, lo que provocará una fuga de memoria.

MISRA C 2004 (C2) frente a MISRA C 2012 (C3): ¿Qué ha cambiado?

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

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

En general, aquí tiene una lista de los cambios más significativos:

  • Corregir 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 ayudarle a determinar su cumplimiento.
  • Las reglas se clasifican como "requeridas", "asesoradas" u "obligatorias". Las reglas obligatorias nunca deben romperse bajo ninguna circunstancia. Las reglas requeridas y asesoradas pueden violarse en escenarios especiales, siempre que la violación esté justificada.
  • Se ha añadido orientación sobre cómo aplicar las 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.
  • Eliminar las reglas excesivamente generalizadas que prohibían el comportamiento razonable del usuario. Por ejemplo, anteriormente se recomendaba no utilizar macros en absoluto, ya que pueden dar lugar a diversas dificultades y confusiones (no se pueden depurar las 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 conveniente. En MISRA C: 2012, se introdujeron nuevas reglas sobre las macros, permitiendo a las personas utilizarlas con cuidado siempre que sea aplicable. Vea el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.
Text excerpt about using macros in MMMC tool to implement integrators and suppress warnings with code example.

Reglas de MISRA C en acción

Basta de hablar, es hora de ponerse manos a la obra con algunas reglas de MISRA C y ver ejemplos de cómo se aplican.

Utilice 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 del estándar MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros al mismo tipo. Una llamada a función con tipos de puntero incompatibles podría indicar un error.

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

Screenshot of MISRA C Rule 21.15

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

Screenshot of a non-compliant solution.

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

Las funciones de manejo de cadenas que no toman la longitud como entrada no deben provocar accesos fuera de los límites

Las funciones de manejo de cadenas de <string.h> que no toman la longitud como entrada no deben provocar accesos 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 obligatoria, lo que significa que nunca puede infringirse, bajo ninguna circunstancia. Se aplica tanto a C90 como a 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 conforme de strcpy, donde la cadena solo se copiará si el contenido de “str” cabe.

Validar los datos recibidos externamente

La directiva 4.14 recomienda verificar la validez de los datos recibidos de fuentes “externas”. La entrada externa puede ser:

  • Lectura de un archivo.
  • Lectura 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 obligatoria y es aplicable tanto a C90 como a 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 ingrese un número, pero el usuario ingresa una cadena. Antes de procesar la entrada, el programa debe verificar que sea efectivamente un número.

Validity Of Values Received From External Sources Shall Be Checked

Cómo cambiar a MISRA C 2012

Cambiar a MISRA C 2012 requerirá una actualización en su documento de pautas 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 deba obtener una versión más reciente de la herramienta. Aquí hay tres herramientas que verifican el cumplimiento de MISRA C 2012:

  1. Cppcheck es una herramienta de código abierto que puede verificar 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 verificar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
  3. CodeSonar es otra herramienta que verifica el cumplimiento tanto de MISRA C como de C++.

También hay algunos compiladores que pueden probar el cumplimiento de MISRA. En caso de que se detecte una violación de la regla, se generan advertencias o excepciones según corresponda. Por ejemplo, Green Hills Software proporciona compiladores con soporte para todos los estándares MISRA, tanto para arquitecturas de 32 bits como de 64 bits.

Uso de Secure Code Warrior para capacitar a los desarrolladores en MISRA C

El producto estrella de Secure Code Warrior, su plataforma de aprendizaje, cuenta con numerosos desafíos interactivos, cursos y evaluaciones que pueden ayudar a formar a los desarrolladores para escribir código C/C++ seguro. El contenido de la plataforma es específico para cada marco de trabajo y 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 rutas de aprendizaje personalizadas, donde identifican vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden realizar un seguimiento de su progreso para identificar sus puntos débiles e incluso disfrutar de competiciones de programación amistosas con sus compañeros. Descubra más sobre cómo ayudamos a las industrias automotriz y de transporte con nuestras soluciones.

¿Quiere descubrir lo interactivos y centrados en sistemas embebidos que son nuestros desafíos? ¡Pruebe algunos desafíos de C/C++:Embed en la plataforma de aprendizaje hoy mismo!

Eslogan

Controle el desarrollo impulsado por IA antes de su lanzamiento

Mida el riesgo asistido por IA, aplique políticas de codificación segura en el momento de la confirmación y acelere la entrega segura en todo su ciclo de vida de desarrollo de software (SDLC).

Reservar una demostración
Biblioteca de recursos

Explorar más blogs

Acceda a contenido especializado sobre programación segura, gobernanza de IA y gestión de riesgos de software.

ver todo
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Una cultura de seguridad: cómo Sage creó su programa de defensores

Descubre cómo Sage reforzó su seguridad con un enfoque flexible y centrado en las relaciones, logrando formar a más de 200 expertos en seguridad y alcanzar una reducción de riesgos cuantificable.

Más información
Icono de ventana de navegador con las letras KVK en negrita y dos líneas horizontales azules debajo sobre un fondo azul degradado.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Kamer van Koophandel: Seguridad a escala impulsada por los desarrolladores

La Cámara de Comercio (Kamer van Koophandel) comparte cómo integró la programación segura en el desarrollo diario mediante certificaciones basadas en roles, evaluaciones comparativas de puntuación de confianza y una cultura de responsabilidad compartida en seguridad.

Más información
Logotipo de Insurance Australia Group con texto y un icono en azul y gris dentro del diseño de una ventana de navegador web.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cómo un «Juego de Códigos» guía a IAG Group hacia un futuro de programación más seguro

IAG Group es la entidad detrás de muchas de las principales compañías de seguros en la región de Asia-Pacífico, que suscribe pólizas para millones de clientes por un valor aproximado de 11.400 millones de dólares australianos en primas anuales.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Mes de la Concienciación sobre Ciberseguridad 2026: Comprender la seguridad de la IA es fundamental para la defensa empresarial

Hemos llegado a un punto en el que la mayoría de las principales empresas de IA han pedido públicamente una ralentización global en el desarrollo de la IA para que las medidas de seguridad puedan ponerse al día, pero la verdad es que ya se han materializado graves problemas de seguridad. Esto deja a innumerables líderes de seguridad y equipos ejecutivos en una situación urgente, a medida que los costes monetarios y de riesgo de la implementación de la IA siguen acumulándose.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Habilitador 8: Branding de su programa

Un programa de codificación segura necesita algo más que un buen contenido para tener éxito. El Habilitador 8 muestra cómo el branding transforma la participación en una experiencia codiciada basada en el estatus.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cada empleado está ahora en la primera línea de la ciberseguridad de la IA

El panorama tecnológico empresarial está cambiando a una velocidad que pocos previeron hasta que fue demasiado tarde. Hemos cruzado oficialmente el umbral del código escrito por humanos y la asistencia básica de copilotos hacia la era del Ciclo de Vida de Desarrollo Agéntico (ADLC). Si bien los agentes de IA autónomos prometen una eficiencia sin precedentes en múltiples funciones, también traen consigo una clase completamente nueva de riesgos regulatorios y de seguridad.

Más información

Proteja el desarrollo basado en IA antes de su lanzamiento

Identifique riesgos de desarrollo, aplique políticas y prevenga vulnerabilidades en todo el ciclo de vida de su software.

Reservar una demostración
No se encontraron elementos.