SCW图标
英雄背景无分隔线
博客

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

Secure Code Warrior
发布于 2021 年 8 月 17 日
最后更新于 2026年3月6日

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.

MISRA C规则21.15的屏幕截图

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

一个不符合规定的解决方案的截图。

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.

MISRA C规则21.17的屏幕截图。

El ejemplo correspondiente es:

字符串处理功能的一个正确例子的截图

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.

应检查从外部来源获得的数值的有效性

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!

查看资源
查看资源

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

感兴趣了解更多吗?

Secure Code Warrior ,使安全编码成为开发人员提高技能的积极和参与的经验。我们引导每个编码者沿着他们自己喜欢的学习途径前进,从而使具有安全技能的开发人员成为我们互联世界的日常超级英雄。

了解更多

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

预约演示
分享到:
领英品牌社交x 标志
作者
Secure Code Warrior
发表于2021年8月17日

Secure Code Warrior ,使安全编码成为开发人员提高技能的积极和参与的经验。我们引导每个编码者沿着他们自己喜欢的学习途径前进,从而使具有安全技能的开发人员成为我们互联世界的日常超级英雄。

本文由Secure Code Warrior的行业专家团队致力于让开发人员从一开始就具备构建安全软件的知识和技能。凭借在安全编码实践、行业趋势和现实世界见解方面的深厚专业知识。

分享到:
领英品牌社交x 标志

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Reglas de MISRA C en acción

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

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

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

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

MISRA C规则21.15的屏幕截图

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

一个不符合规定的解决方案的截图。

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.

MISRA C规则21.17的屏幕截图。

El ejemplo correspondiente es:

字符串处理功能的一个正确例子的截图

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.

应检查从外部来源获得的数值的有效性

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!

查看资源
查看资源

请填写以下表格以下载报告

我们希望获得您的许可,以便向您发送有关我们产品或安全编码相关主题的信息。我们将始终以最高标准谨慎处理您的个人数据,绝不会出于营销目的将其出售给其他公司。

发送
scw 成功图标
SCW 错误图标
要提交表单,请启用「分析」cookie。完成后请随时将其重新禁用。

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.

MISRA C规则21.15的屏幕截图

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

一个不符合规定的解决方案的截图。

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.

MISRA C规则21.17的屏幕截图。

El ejemplo correspondiente es:

字符串处理功能的一个正确例子的截图

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.

应检查从外部来源获得的数值的有效性

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!

观看网络研讨会
开始
了解更多

点击下方链接,下载此资源的PDF文件。

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

查看报告预约演示
查看资源
分享到:
领英品牌社交x 标志
感兴趣了解更多吗?

分享到:
领英品牌社交x 标志
作者
Secure Code Warrior
发表于2021年8月17日

Secure Code Warrior ,使安全编码成为开发人员提高技能的积极和参与的经验。我们引导每个编码者沿着他们自己喜欢的学习途径前进,从而使具有安全技能的开发人员成为我们互联世界的日常超级英雄。

本文由Secure Code Warrior的行业专家团队致力于让开发人员从一开始就具备构建安全软件的知识和技能。凭借在安全编码实践、行业趋势和现实世界见解方面的深厚专业知识。

分享到:
领英品牌社交x 标志

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Reglas de MISRA C en acción

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

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

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

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

MISRA C规则21.15的屏幕截图

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

一个不符合规定的解决方案的截图。

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.

MISRA C规则21.17的屏幕截图。

El ejemplo correspondiente es:

字符串处理功能的一个正确例子的截图

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.

应检查从外部来源获得的数值的有效性

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!

目录

下载PDF
查看资源
感兴趣了解更多吗?

Secure Code Warrior ,使安全编码成为开发人员提高技能的积极和参与的经验。我们引导每个编码者沿着他们自己喜欢的学习途径前进,从而使具有安全技能的开发人员成为我们互联世界的日常超级英雄。

了解更多

Secure Code Warrior 您的组织在软件开发全生命周期中保护代码安全,并营造将网络安全置于首位的企业文化。无论您是应用安全管理员、开发人员、首席信息安全官,还是任何与安全相关的工作人员,我们都能助力您的组织降低不安全代码带来的风险。

预约演示下载
分享到:
领英品牌社交x 标志
资源中心

入门资源

更多出版物
资源中心

入门资源

更多出版物