MISRA C

MISRA C is a set of software development guidelines for the C programming language developed by MISRA (Motor Industry Software Reliability Association). Its aims are to facilitate code safety, security, portability and reliability in the context of embedded systems, specifically those systems programmed in ISO C / C90 / C99.
There is also a set of guidelines for MISRA C++ not covered by this article.
History.
For the first two editions of MISRA-C (1998 and 2004) all Guidelines were considered as Rules. With the publication of MISRA C:2012 a new category of Guideline was introduced - the "Directive" whose compliance is more open to interpretation, or relates to process or procedural matters.
Adoption.
Although originally specifically targeted at the automotive industry, MISRA C has evolved as a widely accepted model for best practices by leading developers in sectors including automotive, aerospace, telecom, medical devices, defense, railway, and others.
For example:
Guideline classification and categorization.
When a new software project is started, the latest MISRA standard should be used. Previous standards are still available for use with legacy software projects that need to refer to it.
Classification.
Each Guideline is classified as "Mandatory" (new for MISRA C:2012), "Required" or "Advisory". Furthermore, the MISRA Compliance document permits "Advisory" guidelines to be "Disapplied".
Categorization.
The rules can be divided logically into a number of categories:
Scope.
MISRA C:2012 separately classifies each guideline as either "Single Translation Unit" or "System".
Decidability.
MISRA C:2012 classifies the "rules" (but not the "directives") as "Decidable" or "Undecidable".
Achieving compliance.
MISRA compliance.
MISRA published documents to provide additional guidance to understand and achieve MISRA compliance.
Compliance.
In order for a piece of software to claim to be compliant to the MISRA C Guidelines, all "mandatory" rules shall be met and all "required" rules and directives shall either be met or subject to a formal deviation. "Advisory" rules may be disapplied without a formal deviation, but this should still be recorded in the project documentation.
Note: For compliance purposes, there is no distinction between "rules" and "directives".
Deviations.
Many MISRA C "rules" can be characterized as "guidelines" because under certain condition software engineers may deviate from rules and still be considered compliant with the standard. Deviations must be documented either in the code or in a file. In addition; proof must be provided that the software engineer has considered the safety of the system and that deviating from the rule will not have a negative impact, requirements for deviations also include:
Published documents.
MISRA C:1998.
The first edition of MISRA C, "Guidelines for the use of the C language in vehicle based software", which was published in 1998 and is officially known as "MISRA-C:1998".
MISRA-C:1998 has 127 rules, of which 93 are required and 34 are advisory; the rules are numbered in sequence from 1 to 127.
MISRA C:2004.
In 2004, a second edition "Guidelines for the use of the C language in critical systems", or "MISRA-C:2004" was produced, with many substantial changes to the guidelines, including a complete renumbering of the rules.
MISRA-C:2004 contains 142 rules, of which 122 are "required" and 20 are "advisory"; they are divided into 21 topical categories, from "Environment" to "Run-time failures".
MISRA C:2012.
Main document.
In 2013, the third edition, MISRA C:2012, was published. MISRA C:2012 extends support to the C99 version of the C language (while maintaining guidelines for C90), in addition to including a number of improvements that can reduce the cost and complexity of compliance, whilst aiding consistent, safe use of C in critical systems.
MISRA-C:2012 contains 143 rules and 16 "directives" (that is, rules whose compliance is more open to interpretation, or relates to process or procedural matters); each of which is classified as "mandatory", "required", or "advisory". They are separately classified as either "Single Translation Unit" or "System". Additionally, the rules are classified as "Decidable" or "Undecidable".
Amendment 1.
In April 2016, MISRA published (as a free download) "MISRA C:2012 - Amendment 1: Additional Security Guidelines" which added fourteen new security guidelines.
Amendment 2.
In February 2020, MISRA published (as a free download) "MISRA C:2012 - Amendment 2: Updates for ISO/IEC 9899:2011/18 Core functionality" which adds mapping for the undefined, unspecified and implementation defined behaviours within C11/C18.
Supporting documents.
MISRA have published the following addenda to support MISRA C:2012:
Example suite.
An exemplar suite (for MISRA-C:2004 and MISRA C:2012) is available from the MISRA GitLab repository. This allows tool-users to evaluate and compare the checking support provided by the various MISRA tools; additionally, it gives tool-implementers some guidance as to the intent of the MISRA Guidelines.
Tools.
While there exist many software tools that claim to check code for "MISRA conformance", there is no MISRA certification process.
Most of the guidelines can be checked using tools that perform static code analysis. The remaining guidelines require the use of dynamic code analysis.
Tools that check code for MISRA conformance include:
C/C++ compilers that support MISRA conformance include:
Criticism.
Some research results question the effectiveness of MISRA.
In a paper that compares earlier work on MISRA C:1998 with MISRA C:2004, Les Hatton comes to the conclusion that:
He goes on to state:
A study at the TU Delft, by Cathal Boogerd and Leon Moonen, empirically assesses the value of MISRA C:2004. It comes to similar results: