# MISRA C

MISRA C es un conjunto de recomendaciones o directrices para el desarrollo de software en lenguaje C desarrollado por MISRA (The Motor Industry Software Reliability Association). Su finalidad es proveer portabilidad, seguridad y fiabilidad al código fuente en el contexto de software embebido. Es aceptado como conjunto de buenas prácticas en sectores como el automovilístico, ferroviario, aeroespacial, telecomunicaciones, equipos médicos y otros. También hay un conjunto de directrices para C++ conocido como MISRA C++. MISRA C no es un estándar abierto; los documentos con las directrices se adquieren mediante compra.

## Historia

La primera edición de MISRA C, llamada Recomendaciones para el uso del lenguaje C en software para vehículos (en inglés: Guidelines for the Use of the C Language in Vehicle Based Software), fue publicada en 1998 y se conoce comúnmente como MISRA-C:1998.
Un segunda edición fue publicada en 2004, llamada Recomendaciones para el uso del lenguaje C en sistemas críticos (en inglés: Guidelines for the Use of the C Language in Critical Systems). Esta segunda versión se conoce como MISRA-C:2004, introdujo cambios sustanciales en las directrices, incluyendo una renumeración completa de las mismas. Tanto en la edición de 1998 como en la de 2004 las recomendaciones o directrices se refieren a la versión C89/C90 del lenguaje C.
En marzo de 2013 se publicó la tercera edición, MISRA-C:2012, con el mismo nombre que la anterior. Esta edición da soporte a la versión C99 del lenguaje C, además de C89/C90. En esta edición se reduce la complejidad y aumenta la comprensión de varias de las recomendaciones. También se han incluido referencias a la norma ISO 26262 sobre sistemas de seguridad en los automóviles.

## Directrices

* MISRA-C:1998 contiene 127 reglas, de las cuales 93 son requisitos (obligatorias, required) y 34 son recomendaciones (no obligatorias, advisory).
* MISRA-C:2004 contiene 142 reglas, de las cuales 122 son requisitos y 20 son recomendaciones. Se dividen en 21 categorías temáticas.
* MISRA-C:2012 contiene 143 reglas y 16 directivas. Las reglas se clasifican en decidibles (decidable) e indecidibles (undecidable). Las directivas se clasifican en preceptivas (mandatory), requeridas (required) y recomendables (advisory).

## Conformidad y desviaciones

Muchas de las reglas de MISRA C pueden ser efectivamente caracterizadas como recomendaciones o directrices ya que, bajo ciertas condiciones, el desarrollador puede desviarse de las reglas sin dejar su código de ser conforme con el estándar MISRA C. Dichas desviaciones deben ser documentadas o bien en el mismo código o bien en un archivo separado, indicando la regla incumplida y una argumentación al respecto. La desviación respecto a una regla no puede tener un efecto negativo en la seguridad del sistema.
Las reglas se clasifican en tres categorías según su prioridad:
* Reglas/directivas preceptivas (mandatory): La regla debe ser cumplida. No se admiten desviaciones.
* Reglas/directivas requeridas (required): La regla debería ser cumplida. Las desviaciones respecto de la regla deben ser solicitadas mediante un proceso de desviación, deben ser justificadas técnicamente, comprobadas y documentadas.
* Reglas/directivas recomendadas (advisory): La regla debería ser cumplida. Las desviaciones respecto de la regla no deben ser solicitdas formalmente, pero sí deben ser documentadas.
La clasificación de las normas es distinta según se escriba el código de manera manual o de manera automática (Anexo E: Applicability to automatically generated code). La envergadura de las normas a aplicar no varía cuando se evalúa código generado automáticamente, sino que sólo varía el rigor con el que se aplican.

## Herramientas

Existen varias herramientas de análisis estático de código que comprueban la conformidad del código con MISRA C, como QA-C/MISRA o PC-lint. También algunos compiladores incluyen dicha comprobación, como los compiladores de Green Hills o de IAR.