diff --git a/docs/misra_c_compliance_matrix.md b/docs/misra_c_compliance_matrix.md new file mode 100644 index 00000000..2eec74c6 --- /dev/null +++ b/docs/misra_c_compliance_matrix.md @@ -0,0 +1,198 @@ +# MISRA C Compliance and Deviations + +This document outlines the MISRA C compliance of CRSF for Arduino and documents any deviations from the MISRA C guidelines. +The [compliance](#compliance) section lists all of the MISRA C guidelines that CRSF for Arduino is compliant with. +The [deviations](#deviations) section lists any deviations from the MISRA C guidelines. + +## Compliance Matrix + +The following tables represent the compliance level of CRSF for Arduino with the MISRA C guidelines, and the tools used to verify compliance. +The compliance level is determined by the following flags: + +- **Advisory**: CRSF for Arduino should follow this guideline wherever reasonable and practical, unless the relevant deviation is documented. +- **Required**: CRSF for Arduino should follow this guideline without any deviations unless that deviation is already documented. +- **Mandatory**: CRSF for Arduino must follow this guideline. Deviations are not permitted. + +The icons listed here are used in the [directives](#directives) and [rules](#rules) tables to represent the compliance level. +An icon is placed in a cell that corresponds to the guideline and the method used to verify compliance. Each icon represents a different compliance level. +The icons are as follows: + +- :white_check_mark: - CRSF for Arduino is compliant with the guideline. +- :negative_squared_cross_mark: - CRSF for Arduino violates the guideline. A deviation from the guideline is being reviewed and may be documented. +- :o: - A deviation from the guideline is documented. See [deviations](#deviations) for more information. +- :no_entry_sign: - CRSF for Arduino violates the guideline and is yet to be fixed. +- :x: - This method is not used. +- :warning: - Rule status is unknown and requires manual review. + +### Directives + +| MISRA Directive | Rule flag | Manual review | +| --- | --- | --- | +| Directive 1.1 | Required | :warning: | +| Directive 2.1 | Required | :no_entry_sign: | +| Directive 3.1 | Required | :warning: | +| Directive 4.1 | Required | :white_check_mark: | +| Directive 4.2 | Advisory | :white_check_mark: | +| Directive 4.3 | Required | :white_check_mark: | +| Directive 4.4 | Advisory | :warning: | +| Directive 4.5 | Advisory | :white_check_mark: | +| Directive 4.6 | Advisory | :white_check_mark: | +| Directive 4.7 | Required | :white_check_mark: | +| Directive 4.8 | Advisory | :warning: | +| Directive 4.9 | Advisory | :white_check_mark: | +| Directive 4.10 | Required | :white_check_mark: | +| Directive 4.11 | Required | :no_entry_sign: | +| Directive 4.12 | Required | :no_entry_sign: | +| Directive 4.13 | Advisory | :warning: | + +### Rules + +| MISRA Rule | Rule flag | GCC Arm None EABI | Cppcheck | Manual review | +| --- | --- | --- | --- | --- | +| Rule 1.1 | Required | :x: | :x: | :warning: | +| Rule 1.2 | Required | :x: | :x: | :warning: | +| Rule 1.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 2.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 2.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 2.3 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 2.4 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 2.5 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 2.6 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 2.7 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 3.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 3.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 4.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 4.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 5.8 | Required | :x: | :no_entry_sign: | :x: | +| Rule 5.9 | Required | :x: | :white_check_mark: | :x: | +| Rule 6.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 6.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 7.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 7.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 7.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 7.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.2 | Required | :x: | :no_entry_sign: | :x: | +| Rule 8.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.4 | Required | :x: | :no_entry_sign: | :x: | +| Rule 8.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.6 | Required | :x: | :no_entry_sign: | :x: | +| Rule 8.7 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 8.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.9 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 8.10 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.11 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 8.12 | Required | :x: | :white_check_mark: | :x: | +| Rule 8.13 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 8.14 | Required | :x: | :white_check_mark: | :x: | +| Rule 9.1 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 9.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 9.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 9.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 9.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.4 | Required | :x: | :no_entry_sign: | :x: | +| Rule 10.5 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 10.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 10.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.4 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 11.5 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 11.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 11.9 | Required | :x: | :white_check_mark: | :x: | +| Rule 12.1 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 12.2 | Required |:x: | :white_check_mark: | :x: | +| Rule 12.3 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 12.4 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 13.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 13.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 13.3 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 13.4 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 13.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 13.6 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 14.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 14.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 14.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 14.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 15.1 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 15.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 15.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 15.4 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 15.5 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 15.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 15.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 16.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 17.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 17.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 17.3 | Mandatory | :x: | :x: | :warning: | +| Rule 17.4 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 17.5 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 17.6 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 17.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 17.8 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 18.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.4 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 18.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 18.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 19.1 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 19.2 | Advisory | :x: | :no_entry_sign: | :x: | +| Rule 20.1 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 20.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.5 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 20.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.9 | Required | :x: | :no_entry_sign: | :x: | +| Rule 20.10 | Advisory | :x: | :white_check_mark: | :x: | +| Rule 20.11 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.12 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.13 | Required | :x: | :white_check_mark: | :x: | +| Rule 20.14 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.2 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.4 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.5 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.6 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.7 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.8 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.9 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.10 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.11 | Required | :x: | :white_check_mark: | :x: | +| Rule 21.12 | Required | :x: | :white_check_mark: | :x: | +| Rule 22.1 | Required | :x: | :white_check_mark: | :x: | +| Rule 22.2 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 22.3 | Required | :x: | :white_check_mark: | :x: | +| Rule 22.4 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 22.5 | Mandatory | :x: | :white_check_mark: | :x: | +| Rule 22.6 | Mandatory | :x: | :white_check_mark: | :x: | + +## Deviations + +No deviations are documented at this time. diff --git a/library.json b/library.json index 9dfd96e2..01d379a4 100644 --- a/library.json +++ b/library.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/schema/library.json", "name": "CRSFforArduino", - "version": "1.1.0-1.0.0", + "version": "1.1.0-2024.9.3", "description": "An Arduino Library for communicating with ExpressLRS and TBS Crossfire receivers.", "keywords": "arduino, remote-control, arduino-library, protocols, rc, radio-control, crsf, expresslrs", "repository": diff --git a/library.properties b/library.properties index 648bedb0..bba2adef 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=CRSFforArduino -version=1.1.0-1.0.0 +version=1.1.0-2024.9.3 author=Cassandra Robinson maintainer=Cassandra Robinson sentence=CRSF for Arduino brings the Crossfire Protocol to the Arduino ecosystem. diff --git a/platformio.ini b/platformio.ini index a0883b29..0b6a1574 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,8 +11,8 @@ [platformio] core_dir = .pio/core default_envs = - ; defect_detector - development + defect_detector + ; development ; ${build.all} extra_configs = targets/common.ini diff --git a/src/CFA_Config.hpp b/src/CFA_Config.hpp index 2c6425f9..e4db79e2 100644 --- a/src/CFA_Config.hpp +++ b/src/CFA_Config.hpp @@ -46,11 +46,11 @@ See https://semver.org/ for more information. */ // These are the pre-release version details which are only used if CRSFFORARDUINO_VERSION_IS_PRERELEASE is set to 1. // NOTE: Pre-release versions are not recommended for production use. #if CRSFFORARDUINO_VERSION_IS_PRERELEASE == 1 -#define CRSFFORARDUINO_VERSION_PRE "1.0.0" -#define CRSFFORARDUINO_VERSION_BUILD_DATE "2024-7-21" -#define CRSFFORARDUINO_VERSION_BUILD_MAJOR 1 -#define CRSFFORARDUINO_VERSION_BUILD_MINOR 0 -#define CRSFFORARDUINO_VERSION_BUILD_PATCH 0 +#define CRSFFORARDUINO_VERSION_PRE "2024.9.3" +#define CRSFFORARDUINO_VERSION_BUILD_DATE "2024-9-3" +#define CRSFFORARDUINO_VERSION_BUILD_MAJOR 2024 +#define CRSFFORARDUINO_VERSION_BUILD_MINOR 9 +#define CRSFFORARDUINO_VERSION_BUILD_PATCH 3 #endif /* Failsafe Options diff --git a/src/cppcheck/misra-rules.txt b/src/cppcheck/misra-rules.txt new file mode 100644 index 00000000..f38f7c74 --- /dev/null +++ b/src/cppcheck/misra-rules.txt @@ -0,0 +1,283 @@ +Appendix A Summary of guidelines +Rule 1.3 Required +There shall be no occurrence of undefined or critical unspecified behaviour. +Rule 2.1 Required +A project shall not contain unreachable code. +Rule 2.2 Required +There shall be no dead code. +Rule 2.3 Advisory +A project should not contain unused type declarations. +Rule 2.4 Advisory +A project should not contain unused tag declarations. +Rule 2.5 Advisory +A project should not contain unused macro declarations. +Rule 2.6 Advisory +A function should not contain unused label declarations. +Rule 2.7 Advisory +There should be no unused parameters in functions. +Rule 3.1 Required +The character sequence /* or // shall not be used within a comment. +Rule 3.2 Required +Line-splicing shall not be used in // comments. +Rule 4.1 Required +Octal and hexadecimal escape sequences shall be terminated. +Rule 4.2 Advisory +Trigraphs should not be used. +Rule 5.1 Required +External identifiers shall be distinct. +Rule 5.2 Required +Identifiers declared in the same scope and name space shall be distinct. +Rule 5.3 Required +An identifier declared in an inner scope shall not hide an identifier declared in an outer scope. +Rule 5.4 Required +Macro identifiers shall be distinct. +Rule 5.5 Required +Identifiers shall be distinct from macro names. +Rule 5.6 Required +A typedef name shall be a unique identifier. +Rule 5.7 Required +A tag name shall be a unique identifier. +Rule 5.8 Required +Identifiers that define objects or functions with external linkage shall be unique. +Rule 5.9 Required +Identifiers that define objects or functions with internal linkage shall be unique. +Rule 6.1 Required +Bit-fields shall only be declared with an appropriate type. +Rule 6.2 Required +Single-bit named bit-fields shall not be of a signed type. +Rule 7.1 Required +Octal constants shall not be used. +Rule 7.2 Required +A "u" or "U" suffix shall be applied to all integer constants that are represented in an unsigned type. +Rule 7.3 Required +The lowercase character 'l' shall not be used in a literal suffix. +Rule 7.4 Required +A string literal shall not be assigned to an object unless the object's type is "pointer to const-qualified char". +Rule 8.1 Required +Types shall be explicitly specified. +Rule 8.2 Required +Function types shall be in prototype form with named parameters. +Rule 8.3 Required +All declarations of an object or function shall use the same names and type qualifiers. +Rule 8.4 Required +A compatible declaration shall be visible when an object or function with external linkage is defined. +Rule 8.5 Required +An external object or function shall be declared once in one and only one file. +Rule 8.6 Required +An identifier with external linkage shall have exactly one external definition. +Rule 8.7 Advisory +Functions and objects should not be defined with external linkage if they are referenced in only one translation unit. +Rule 8.8 Required +The static storage class specifier shall be used in the declaration of objects and functions that have internal linkage. +Rule 8.9 Advisory +An object should be defined at block scope if its identifier only appears in a single function. +Rule 8.10 Required +An inline function shall be declared with the static storage class. +Rule 8.11 Advisory +When an array with external linkage is declared, its size shall be explicitly specified. +Rule 8.12 Required +Within an enumerator list, the value of an implicitly-specified enumeration constant shall be unique. +Rule 8.13 Advisory +A pointer should point to a const-qualified type whenever possible. +Rule 8.14 Required +The restrict type qualifier shall not be used. +Rule 9.1 Mandatory +The value of an object with automatic storage duration shall not be read before it has been set. +Rule 9.2 Required +The initializer for an aggregate or union type shall be enclosed in braces. +Rule 9.3 Required +Arrays shall not be partially initialized. +Rule 9.4 Required +An element of an object shall not be initialized more than once. +Rule 9.5 Required +Where designated initializers are used to initialize an array object, the size of the array shall be specified explicitly. +Rule 10.1 Required +Operands shall not be of an inappropriate essential type. +Rule 10.2 Required +Expressions of essentially character type shall not be used inappropriately in addition and subtraction operations. +Rule 10.3 Required +The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category. +Rule 10.4 Required +Both operands of an operator in which the usual arithmetic conversions are performed shall have the same essential type category. +Rule 10.5 Advisory +The value of an expression should not be cast to an inappropriate essential type. +Rule 10.6 Required +The value of a composite expression shall not be assigned to an object with wider essential type. +Rule 10.7 Required +If a composite expression is used as one operand of an operator in which the usual arithmetic conversions are performed then the other operand shall not have wider essential type. +Rule 10.8 Required +The value of a composite expression shall not be cast to a different essential type category or a wider essential type. +Rule 11.1 Required +Conversions shall not be performed between a pointer to a function and any other type. +Rule 11.2 Required +Conversions shall not be performed between a pointer to an incomplete type and any other type. +Rule 11.3 Required +A cast shall not be performed between a pointer to object type and a pointer to a different object type. +Rule 11.4 Advisory +A conversion should not be performed between a pointer to object and an integer type. +Rule 11.5 Advisory +A conversion should not be performed from pointer to void into pointer to object. +Rule 11.6 Required +A cast shall not be performed between a pointer to void and an arithmetic type. +Rule 11.7 Required +A cast shall not be performed between a pointer to object and a non-integer arithmetic type. +Rule 11.8 Required +A cast shall not remove any const or volatile qualification from the type pointed to by a pointer. +Rule 11.9 Required +The macro NULL shall be the only permitted form of integer null pointer constant. +Rule 12.1 Advisory +The precedence of operators within expressions should be made explicit. +Rule 12.2 Required +The right hand operand of a shift operator shall lie in the range zero to one less than the width in bits of the essential type of the left hand operand. +Rule 12.3 Advisory +The comma operator should not be used. +Rule 12.4 Advisory +Evaluation of constant expressions should not lead to unsigned integer wrap-around. +Rule 13.1 Required +Initialiser lists shall not contain persistent side effects. +Rule 13.2 Required +The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders. +Rule 13.3 Advisory +A full expression containing an increment (++) or decrement (--) operator should have no other potential side effects other than that caused by the increment or decrement operator. +Rule 13.4 Advisory +The result of an assignment operator should not be used. +Rule 13.5 Required +The right hand operand of a logical && or || operator shall not contain persistent side effects. +Rule 13.6 Mandatory +The operand of the sizeof operator shall not contain any expression which has potential side effects. +Rule 14.1 Required +R14.1 A loop counter shall not have essentially floating type. +Rule 14.2 Required +A for loop shall be well-formed. +Rule 14.3 Required +Controlling expressions shall not be invariant. +Rule 14.4 Required +The controlling expression of an if statement and the controlling expression of an iteration-statement shall have essentially Boolean type. +Rule 15.1 Advisory +The goto statement should not be used. +Rule 15.2 Required +The goto statement shall jump to a label declared later in the same function. +Rule 15.3 Required +Any label referenced by a goto statement shall be declared in the same block, or in any block enclosing the goto statement. +Rule 15.4 Advisory +There should be no more than one break or goto statement used to terminate any iteration statement. +Rule 15.5 Advisory +A function should have a single point of exit at the end. +Rule 15.6 Required +The body of an iteration-statement or a selection-statement shall be a compound statement. +Rule 15.7 Required +All if ... else if constructs shall be terminated with an else clause. +Rule 16.1 Required +All switch statements shall be well-formed. +Rule 16.2 Required +A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement. +Rule 16.3 Required +An unconditional break statement shall terminate every non-empty switch-clause. +Rule 16.4 Required +Every switch statement shall have a default label. +Rule 16.5 Required +A default label shall appear as either the first or the last switch label of a switch statement. +Rule 16.6 Required +Every switch statement shall have at least two switch-clauses. +Rule 16.7 Required +A switch-expression shall not have essentially Boolean type. +Rule 17.1 Required +The features of shall not be used. +Rule 17.2 Required +Functions shall not call themselves, either directly or indirectly. +Rule 17.3 Mandatory +A function shall not be declared implicitly. +Rule 17.4 Mandatory +All exit paths from a function with non-void return type shall have an explicit return statement with an expression. +Rule 17.5 Advisory +The function argument corresponding to a parameter declared to have an array type shall have an appropriate number of elements. +Rule 17.6 Mandatory +The declaration of an array parameter shall not contain the static keyword between the [ ]. +Rule 17.7 Required +The value returned by a function having non-void return type shall be used. +Rule 17.8 Advisory +A function parameter should not be modified. +Rule 18.1 Required +A pointer resulting from arithmetic on a pointer operand shall address an element of the same array as that pointer operand. +Rule 18.2 Required +Subtraction between pointers shall only be applied to pointers that address elements of the same array. +Rule 18.3 Required +The relational operators >, >=, < and <= shall not be applied to objects of pointer type except where they point into the same object. +Rule 18.4 Advisory +The +, -, += and -= operators should not be applied to an expression of pointer type. +Rule 18.5 Advisory +Declarations should contain no more than two levels of pointer nesting. +Rule 18.6 Required +The address of an object with automatic storage shall not be copied to another object that persists after the first object has ceased to exist. +Rule 18.7 Required +Flexible array members shall not be declared. +Rule 18.8 Required +Variable length array types shall not be used. +Rule 19.1 Mandatory +An object shall not be assigned or copied to an overlapping object. +Rule 19.2 Advisory +The union keyword should not be used. +Rule 20.1 Advisory +#include directives should only be preceded by preprocessor directives or comments. +Rule 20.2 Required +The ', " or \ characters and the /* or // character sequences shall not occur in a header file name. +Rule 20.3 Required +The #include directive shall be followed by either a or "filename" sequence. +Rule 20.4 Required +A macro shall not be defined with the same name as a keyword. +Rule 20.5 Advisory +#undef should not be used. +Rule 20.6 Required +Tokens that look like a preprocessing directive shall not occur within a macro argument. +Rule 20.7 Required +Expressions resulting from the expansion of macro parameters shall be enclosed in parentheses. +Rule 20.8 Required +The controlling expression of a #if or #elif preprocessing directive shall evaluate to 0 or 1. +Rule 20.9 Required +All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation. +Rule 20.10 Advisory +The # and ## preprocessor operators should not be used. +Rule 20.11 Required +A macro parameter immediately following a # operator shall not immediately be followed by a ## operator. +Rule 20.12 Required +A macro parameter used as an operand to the # or ## operators, which is itself subject to further macro replacement, shall only be used as an operand to these operators. +Rule 20.13 Required +A line whose first token is # shall be a valid preprocessing directive. +Rule 20.14 Required +All #else and #elif preprocessor directives shall reside in the same file as the #if, #ifdef or #ifndef directive to which they are related. +Rule 21.1 Required +#define and #undef shall not be used on a reserved identifier or reserved macro name. +Rule 21.2 Required +A reserved identifier or macro name shall not be declared. +Rule 21.3 Required +The memory allocation and deallocation functions of shall not be used. +Rule 21.4 Required +The standard header file shall not be used. +Rule 21.5 Required +The standard header file shall not be used. +Rule 21.6 Required +The standard library input/output functions shall not be used. +Rule 21.7 Required +The atof, atoi and atol functions of shall not be used. +Rule 21.8 Required +The library functions abort, exit, getenv and system of shall not be used. +Rule 21.9 Required +The library functions bsearch and qsort of shall not be used. +Rule 21.10 Required +The standard library time and date functions shall not be used. +Rule 21.11 Required +The standard header file shall not be used. +Rule 21.12 Advisory +The exception handling features of shall not be used. +Rule 22.1 Required +All resources obtained dynamically by means of Standard Library functions shall be explicitly released. +Rule 22.2 Mandatory +A block of memory shall only be freed if it was allocated by means of a Standard Library function. +Rule 22.3 Required +The same file shall not be open for read and write access at the same time on different streams. +Rule 22.4 Mandatory +There shall be no attempt to write to a stream that has been opened as read-only. +Rule 22.5 Mandatory +A pointer to a FILE object shall not be dereferenced. +Rule 22.6 Mandatory +The value of a pointer to a FILE object shall not be used after the associated stream has been closed. diff --git a/src/cppcheck/misra.json b/src/cppcheck/misra.json new file mode 100644 index 00000000..df7ce81f --- /dev/null +++ b/src/cppcheck/misra.json @@ -0,0 +1,18 @@ +{ + "version": "2.0", + "script": "addons/misra.py", + "standard": "c2012", + "args":[ + "--rule-texts=src/cppcheck/misra-rules.txt" + ], + "deviations": [ + { + "deviation": "Rule 1.1", + "reason": "Rule 1.1 is not currently handled by Cppcheck, therefore it is not enforced here." + }, + { + "deviation": "Rule 1.2", + "reason": "Rule 1.2 is not currently handled by Cppcheck, therefore it is not enforced here." + } + ] +} diff --git a/src/cppcheck/suppressions.txt b/src/cppcheck/suppressions.txt new file mode 100644 index 00000000..1d49d971 --- /dev/null +++ b/src/cppcheck/suppressions.txt @@ -0,0 +1,7 @@ +missingInclude:*/*.cpp +missingInclude:*/*.hpp +unmatchedSuppression:*/*.cpp +unmatchedSuppression:*/*.hpp +unmatchedSuppression:*/*.ino +unusedFunction:*/*.ino +unusedFunction:*/*.cpp diff --git a/targets/quality_control.ini b/targets/quality_control.ini index a0e75e39..7e8d7e8c 100644 --- a/targets/quality_control.ini +++ b/targets/quality_control.ini @@ -35,8 +35,23 @@ build_src_filter = +<*/*/*.cpp> +<*.cpp> build_type = debug +check_src_filters = + + + + + +<*.hpp> + +<*.cpp> + + + + + + + + + + + + check_flags = - --disable=unusedFunction + --addon=src/cppcheck/misra.json + --enable=all + --language=c++ + --std=c++23 + --suppressions-list=src/cppcheck/suppressions.txt check_severity = low, medium, high check_skip_packages = yes check_tool = cppcheck