diff --git a/cpp/common/src/codingstandards/cpp/exclusions/cpp/Declarations4.qll b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Declarations4.qll new file mode 100644 index 000000000..eefef3ada --- /dev/null +++ b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Declarations4.qll @@ -0,0 +1,26 @@ +//** THIS FILE IS AUTOGENERATED, DO NOT MODIFY DIRECTLY. **/ +import cpp +import RuleMetadata +import codingstandards.cpp.exclusions.RuleMetadata + +newtype Declarations4Query = TVolatileQualifierNotUsedAppropriatelyQuery() + +predicate isDeclarations4QueryMetadata(Query query, string queryId, string ruleId, string category) { + query = + // `Query` instance for the `volatileQualifierNotUsedAppropriately` query + Declarations4Package::volatileQualifierNotUsedAppropriatelyQuery() and + queryId = + // `@id` for the `volatileQualifierNotUsedAppropriately` query + "cpp/misra/volatile-qualifier-not-used-appropriately" and + ruleId = "RULE-10-1-2" and + category = "required" +} + +module Declarations4Package { + Query volatileQualifierNotUsedAppropriatelyQuery() { + //autogenerate `Query` type + result = + // `Query` type for `volatileQualifierNotUsedAppropriately` query + TQueryCPP(TDeclarations4PackageQuery(TVolatileQualifierNotUsedAppropriatelyQuery())) + } +} diff --git a/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll b/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll index 8b1e8be5d..204db5b4d 100644 --- a/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll +++ b/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll @@ -35,6 +35,7 @@ import Declarations import Declarations1 import Declarations2 import Declarations3 +import Declarations4 import ExceptionSafety import Exceptions1 import Exceptions2 @@ -133,6 +134,7 @@ newtype TCPPQuery = TDeclarations1PackageQuery(Declarations1Query q) or TDeclarations2PackageQuery(Declarations2Query q) or TDeclarations3PackageQuery(Declarations3Query q) or + TDeclarations4PackageQuery(Declarations4Query q) or TExceptionSafetyPackageQuery(ExceptionSafetyQuery q) or TExceptions1PackageQuery(Exceptions1Query q) or TExceptions2PackageQuery(Exceptions2Query q) or @@ -231,6 +233,7 @@ predicate isQueryMetadata(Query query, string queryId, string ruleId, string cat isDeclarations1QueryMetadata(query, queryId, ruleId, category) or isDeclarations2QueryMetadata(query, queryId, ruleId, category) or isDeclarations3QueryMetadata(query, queryId, ruleId, category) or + isDeclarations4QueryMetadata(query, queryId, ruleId, category) or isExceptionSafetyQueryMetadata(query, queryId, ruleId, category) or isExceptions1QueryMetadata(query, queryId, ruleId, category) or isExceptions2QueryMetadata(query, queryId, ruleId, category) or diff --git a/cpp/misra/src/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.ql b/cpp/misra/src/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.ql new file mode 100644 index 000000000..d9bb646e3 --- /dev/null +++ b/cpp/misra/src/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.ql @@ -0,0 +1,32 @@ +/** + * @id cpp/misra/volatile-qualifier-not-used-appropriately + * @name RULE-10-1-2: The volatile qualifier shall be used appropriately + * @description Using the volatile qualifier on certain entities has behavior that is not + * well-defined and can make code harder to understand, especially as its application + * to these entities does not prevent data races or guarantee safe multithreading. + * @kind problem + * @precision very-high + * @problem.severity error + * @tags external/misra/id/rule-10-1-2 + * correctness + * readability + * maintainability + * scope/single-translation-unit + * external/misra/enforcement/decidable + * external/misra/obligation/required + */ + +import cpp +import codingstandards.cpp.misra + +from Declaration d +where + not isExcluded(d, Declarations4Package::volatileQualifierNotUsedAppropriatelyQuery()) and + d.getADeclarationEntry().getType().isVolatile() and + ( + d instanceof LocalVariable or + exists(d.(Parameter).getFunction()) or + d instanceof Function or + d.(Variable).isStructuredBinding() + ) +select d, "Volatile entity '" + d.getName() + "' declared." diff --git a/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.expected b/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.expected new file mode 100644 index 000000000..6e84eb5a7 --- /dev/null +++ b/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.expected @@ -0,0 +1,7 @@ +| test.cpp:2:16:2:16 | g1 | Volatile entity 'g1' declared. | +| test.cpp:5:21:5:21 | p | Volatile entity 'p' declared. | +| test.cpp:6:16:6:16 | x | Volatile entity 'x' declared. | +| test.cpp:10:18:10:18 | a | Volatile entity 'a' declared. | +| test.cpp:13:14:13:15 | f1 | Volatile entity 'f1' declared. | +| test.cpp:16:23:16:23 | p | Volatile entity 'p' declared. | +| test.cpp:20:16:20:16 | m | Volatile entity 'm' declared. | diff --git a/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.qlref b/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.qlref new file mode 100644 index 000000000..f34189a09 --- /dev/null +++ b/cpp/misra/test/rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.qlref @@ -0,0 +1 @@ +rules/RULE-10-1-2/VolatileQualifierNotUsedAppropriately.ql \ No newline at end of file diff --git a/cpp/misra/test/rules/RULE-10-1-2/test.cpp b/cpp/misra/test/rules/RULE-10-1-2/test.cpp new file mode 100644 index 000000000..3ffc07fa2 --- /dev/null +++ b/cpp/misra/test/rules/RULE-10-1-2/test.cpp @@ -0,0 +1,27 @@ +int g[1] = {1}; +auto volatile [g1] = g; // NON_COMPLIANT +volatile int g2; // COMPLIANT + +void f(volatile int p) { // NON_COMPLIANT + volatile int x = 1; // NON_COMPLIANT + int y = 2; // COMPLIANT + + int z[1] = {1}; + auto volatile [a] = z; // NON_COMPLIANT +} + +volatile int f1(); // NON_COMPLIANT + +void f2(volatile int *p); // COMPLIANT +void f3(int *volatile p); // NON_COMPLIANT + +class C { +public: + volatile int m(); // NON_COMPLIANT + int m1(); // COMPLIANT + volatile int m2; // COMPLIANT +}; + +struct S { + volatile int s; // COMPLIANT +}; \ No newline at end of file diff --git a/rule_packages/cpp/Declarations4.json b/rule_packages/cpp/Declarations4.json new file mode 100644 index 000000000..37d009ed7 --- /dev/null +++ b/rule_packages/cpp/Declarations4.json @@ -0,0 +1,27 @@ +{ + "MISRA-C++-2023": { + "RULE-10-1-2": { + "properties": { + "enforcement": "decidable", + "obligation": "required" + }, + "queries": [ + { + "description": "Using the volatile qualifier on certain entities has behavior that is not well-defined and can make code harder to understand, especially as its application to these entities does not prevent data races or guarantee safe multithreading.", + "kind": "problem", + "name": "The volatile qualifier shall be used appropriately", + "precision": "very-high", + "severity": "error", + "short_name": "VolatileQualifierNotUsedAppropriately", + "tags": [ + "correctness", + "readability", + "maintainability", + "scope/single-translation-unit" + ] + } + ], + "title": "The volatile qualifier shall be used appropriately" + } + } +} \ No newline at end of file