diff --git a/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected b/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected new file mode 100644 index 0000000000..8c529b82ea --- /dev/null +++ b/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected @@ -0,0 +1 @@ +| test.c:36:3:36:18 | ... = ... | An object $@ assigned to overlapping object $@. | test.c:36:9:36:10 | m2 | m2 | test.c:36:17:36:18 | m1 | m1 | diff --git a/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql b/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql new file mode 100644 index 0000000000..3d5b98d281 --- /dev/null +++ b/c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql @@ -0,0 +1,4 @@ +// GENERATED FILE - DO NOT MODIFY +import codingstandards.cpp.rules.objectassignedtoanoverlappingobject.ObjectAssignedToAnOverlappingObject + +class TestFileQuery extends ObjectAssignedToAnOverlappingObjectSharedQuery, TestQuery { } diff --git a/c/common/test/rules/objectassignedtoanoverlappingobject/test.c b/c/common/test/rules/objectassignedtoanoverlappingobject/test.c new file mode 100644 index 0000000000..6b308c130d --- /dev/null +++ b/c/common/test/rules/objectassignedtoanoverlappingobject/test.c @@ -0,0 +1,53 @@ +struct s1 { + int m1[10]; +}; +struct s2 { + int m1; + struct s1 m2; +}; + +union u { + struct s1 m1; + struct s2 m2; +}; + +typedef struct { + char buf[8]; +} Union_t; + +typedef union { + + unsigned char uc[24]; + + struct { + Union_t prefix; + Union_t suffix; + } fnv; + + struct { + unsigned char padding[16]; + Union_t suffix; + } diff; + +} UnionSecret_t; + +void overlapping_access() { + union u u1; + u1.m2.m2 = u1.m1; // NON_COMPLIANT, different struct. u1.m2 and u1.m1 +} + +void cross_copy() { + UnionSecret_t hash1; + hash1.diff.suffix = + hash1.fnv.suffix; // COMPLIANT (copy across structs), but safe. +} + +void internal_shift() { + UnionSecret_t hash1; + hash1.fnv.prefix = hash1.fnv.suffix; // COMPLIANT, same struct. +} + +void separate_access() { + UnionSecret_t hash1, hash2; + hash2.diff.suffix = hash1.fnv.suffix; // COMPLIANT, different union. +} diff --git a/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.expected b/c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.expected similarity index 100% rename from c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.expected rename to c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.expected diff --git a/c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql b/c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql new file mode 100644 index 0000000000..b05ae1c6e0 --- /dev/null +++ b/c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql @@ -0,0 +1,4 @@ +// GENERATED FILE - DO NOT MODIFY +import codingstandards.cpp.rules.objectcopiedtoanoverlappingobject.ObjectCopiedToAnOverlappingObject + +class TestFileQuery extends ObjectCopiedToAnOverlappingObjectSharedQuery, TestQuery { } diff --git a/c/misra/test/rules/RULE-19-1/test.c b/c/common/test/rules/objectcopiedtoanoverlappingobject/test.c similarity index 99% rename from c/misra/test/rules/RULE-19-1/test.c rename to c/common/test/rules/objectcopiedtoanoverlappingobject/test.c index 7f445993cc..47c245c0aa 100644 --- a/c/misra/test/rules/RULE-19-1/test.c +++ b/c/common/test/rules/objectcopiedtoanoverlappingobject/test.c @@ -56,4 +56,4 @@ void test_unions() { memcpy(&u1.m2.m2, &u1.m1, sizeof(u1.m1)); // NON_COMPLIANT memcpy(&u2.diff.suffix, &u2.fnv.suffix, sizeof(u2.fnv.suffix)); // COMPLIANT -} \ No newline at end of file +} diff --git a/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.ql b/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.ql deleted file mode 100644 index 31c24dcdd8..0000000000 --- a/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.ql +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @id c/misra/object-assigned-to-an-overlapping-object - * @name RULE-19-1: An object shall not be assigned to an overlapping object - * @description An object shall not be copied or assigned to an overlapping object. - * @kind problem - * @precision high - * @problem.severity error - * @tags external/misra/id/rule-19-1 - * correctness - * external/misra/c/2012/third-edition-first-revision - * external/misra/obligation/mandatory - */ - -import cpp -import codingstandards.c.misra -import semmle.code.cpp.valuenumbering.GlobalValueNumbering - -VariableAccess getAQualifier(VariableAccess va) { result = va.getQualifier+() } - -int getAccessByteOffset(FieldAccess fa) { - not fa.getQualifier() instanceof FieldAccess and result = fa.getTarget().getByteOffset() - or - result = fa.getTarget().getByteOffset() + getAccessByteOffset(fa.getQualifier()) -} - -predicate overlaps(FieldAccess fa1, FieldAccess fa2) { - exists(int startfa1, int endfa1, int startfa2, int endfa2 | - startfa1 = getAccessByteOffset(fa1) and - endfa1 = startfa1 + fa1.getTarget().getType().getSize() - 1 and - startfa2 = getAccessByteOffset(fa2) and - endfa2 = startfa2 + fa2.getTarget().getType().getSize() - 1 - | - startfa1 = startfa2 and endfa1 = endfa2 - or - startfa1 > startfa2 and endfa1 < endfa2 - or - startfa1 < startfa2 and endfa1 < endfa2 and endfa1 > startfa2 - or - startfa1 > startfa2 and endfa1 > endfa2 and startfa1 < endfa2 - ) -} - -from AssignExpr assignExpr, Expr lhs, Expr rhs, ValueFieldAccess valuelhs, ValueFieldAccess valuerhs -where - not isExcluded(assignExpr, Contracts7Package::objectAssignedToAnOverlappingObjectQuery()) and - lhs.getType() instanceof Union and - rhs.getType() instanceof Union and - lhs = getAQualifier(assignExpr.getLValue()) and - rhs = getAQualifier(assignExpr.getRValue()) and - globalValueNumber(lhs) = globalValueNumber(rhs) and - valuerhs = assignExpr.getRValue() and - valuelhs = assignExpr.getLValue() and // a.b.c == ((a.b).c) - overlaps(valuelhs, valuerhs) -select assignExpr, "An object $@ assigned to overlapping object $@.", valuelhs, - valuelhs.getTarget().getName(), valuerhs, valuerhs.getTarget().getName() diff --git a/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.ql b/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.ql new file mode 100644 index 0000000000..e569b4829c --- /dev/null +++ b/c/misra/src/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.ql @@ -0,0 +1,23 @@ +/** + * @id c/misra/object-assigned-to-an-overlapping-object-misra-c + * @name RULE-19-1: An object shall not be assigned to an overlapping object + * @description An object shall not be copied or assigned to an overlapping object. + * @kind problem + * @precision high + * @problem.severity error + * @tags external/misra/id/rule-19-1 + * correctness + * external/misra/c/2012/third-edition-first-revision + * external/misra/obligation/mandatory + */ + +import cpp +import codingstandards.c.misra +import codingstandards.cpp.rules.objectassignedtoanoverlappingobject.ObjectAssignedToAnOverlappingObject + +class ObjectAssignedToAnOverlappingObjectMisraCQuery extends ObjectAssignedToAnOverlappingObjectSharedQuery +{ + ObjectAssignedToAnOverlappingObjectMisraCQuery() { + this = Contracts7Package::objectAssignedToAnOverlappingObjectMisraCQuery() + } +} diff --git a/c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.ql b/c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.ql new file mode 100644 index 0000000000..57bc31c835 --- /dev/null +++ b/c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.ql @@ -0,0 +1,23 @@ +/** + * @id c/misra/object-copied-to-an-overlapping-object-misra-c + * @name RULE-19-1: An object shall not be copied to an overlapping object + * @description An object shall not be copied to an overlapping object. + * @kind problem + * @precision high + * @problem.severity error + * @tags external/misra/id/rule-19-1 + * correctness + * external/misra/c/2012/third-edition-first-revision + * external/misra/obligation/mandatory + */ + +import cpp +import codingstandards.c.misra +import codingstandards.cpp.rules.objectcopiedtoanoverlappingobject.ObjectCopiedToAnOverlappingObject + +class ObjectCopiedToAnOverlappingObjectMisraCQuery extends ObjectCopiedToAnOverlappingObjectSharedQuery +{ + ObjectCopiedToAnOverlappingObjectMisraCQuery() { + this = Contracts7Package::objectCopiedToAnOverlappingObjectMisraCQuery() + } +} diff --git a/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.expected b/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.expected deleted file mode 100644 index bc8f4461ec..0000000000 --- a/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.expected +++ /dev/null @@ -1 +0,0 @@ -| test.c:55:3:55:18 | ... = ... | An object $@ assigned to overlapping object $@. | test.c:55:9:55:10 | m2 | m2 | test.c:55:17:55:18 | m1 | m1 | diff --git a/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.qlref b/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.qlref deleted file mode 100644 index 088eafa869..0000000000 --- a/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.qlref +++ /dev/null @@ -1 +0,0 @@ -rules/RULE-19-1/ObjectAssignedToAnOverlappingObject.ql \ No newline at end of file diff --git a/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.testref b/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.testref new file mode 100644 index 0000000000..72c714a7a9 --- /dev/null +++ b/c/misra/test/rules/RULE-19-1/ObjectAssignedToAnOverlappingObjectMisraC.testref @@ -0,0 +1 @@ +c/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql \ No newline at end of file diff --git a/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.qlref b/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.qlref deleted file mode 100644 index c371b9bad2..0000000000 --- a/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.qlref +++ /dev/null @@ -1 +0,0 @@ -rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.ql \ No newline at end of file diff --git a/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.testref b/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.testref new file mode 100644 index 0000000000..6f0410785c --- /dev/null +++ b/c/misra/test/rules/RULE-19-1/ObjectCopiedToAnOverlappingObjectMisraC.testref @@ -0,0 +1 @@ +c/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql \ No newline at end of file diff --git a/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.ql b/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.ql deleted file mode 100644 index 17119af07e..0000000000 --- a/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.ql +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @id cpp/autosar/object-assigned-to-an-overlapping-object - * @name M0-2-1: An object shall not be assigned to an overlapping object - * @description An object shall not be assigned to an overlapping object. - * @kind problem - * @precision high - * @problem.severity error - * @tags external/autosar/id/m0-2-1 - * correctness - * external/autosar/allocated-target/implementation - * external/autosar/enforcement/automated - * external/autosar/obligation/required - */ - -//Assignment between different active members of same union instance -import cpp -import codingstandards.cpp.autosar -import semmle.code.cpp.valuenumbering.GlobalValueNumbering - -VariableAccess getAQualifier(VariableAccess va) { result = va.getQualifier+() } - -int getAccessByteOffset(FieldAccess fa) { - not fa.getQualifier() instanceof FieldAccess and result = fa.getTarget().getByteOffset() - or - result = fa.getTarget().getByteOffset() + getAccessByteOffset(fa.getQualifier()) -} - -predicate overlaps(FieldAccess fa1, FieldAccess fa2) { - exists(int startfa1, int endfa1, int startfa2, int endfa2 | - startfa1 = getAccessByteOffset(fa1) and - endfa1 = startfa1 + fa1.getTarget().getType().getSize() - 1 and - startfa2 = getAccessByteOffset(fa2) and - endfa2 = startfa2 + fa2.getTarget().getType().getSize() - 1 - | - startfa1 = startfa2 and endfa1 = endfa2 - or - startfa1 > startfa2 and endfa1 < endfa2 - or - startfa1 < startfa2 and endfa1 < endfa2 and endfa1 > startfa2 - or - startfa1 > startfa2 and endfa1 > endfa2 and startfa1 < endfa2 - ) -} - -from AssignExpr assignExpr, Expr lhs, Expr rhs, ValueFieldAccess valuelhs, ValueFieldAccess valuerhs -where - not isExcluded(assignExpr, RepresentationPackage::objectAssignedToAnOverlappingObjectQuery()) and - lhs.getType() instanceof Union and - rhs.getType() instanceof Union and - lhs = getAQualifier(assignExpr.getLValue()) and - rhs = getAQualifier(assignExpr.getRValue()) and - globalValueNumber(lhs) = globalValueNumber(rhs) and - valuerhs = assignExpr.getRValue() and - valuelhs = assignExpr.getLValue() and // a.b.c == ((a.b).c) - overlaps(valuelhs, valuerhs) -select assignExpr, "An object $@ assigned to overlapping object $@.", valuelhs, - valuelhs.getTarget().getName(), valuerhs, valuerhs.getTarget().getName() diff --git a/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.ql b/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.ql new file mode 100644 index 0000000000..bd15475e10 --- /dev/null +++ b/cpp/autosar/src/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.ql @@ -0,0 +1,24 @@ +/** + * @id cpp/autosar/object-assigned-to-an-overlapping-object-autosar-cpp + * @name M0-2-1: An object shall not be assigned to an overlapping object + * @description An object shall not be assigned to an overlapping object. + * @kind problem + * @precision high + * @problem.severity error + * @tags external/autosar/id/m0-2-1 + * correctness + * external/autosar/allocated-target/implementation + * external/autosar/enforcement/automated + * external/autosar/obligation/required + */ + +import cpp +import codingstandards.cpp.autosar +import codingstandards.cpp.rules.objectassignedtoanoverlappingobject.ObjectAssignedToAnOverlappingObject + +class ObjectAssignedToAnOverlappingObjectAutosarCppQuery extends ObjectAssignedToAnOverlappingObjectSharedQuery +{ + ObjectAssignedToAnOverlappingObjectAutosarCppQuery() { + this = RepresentationPackage::objectAssignedToAnOverlappingObjectAutosarCppQuery() + } +} diff --git a/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.expected b/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.expected deleted file mode 100644 index 13b670e4d9..0000000000 --- a/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.expected +++ /dev/null @@ -1 +0,0 @@ -| test.cpp:37:3:37:18 | ... = ... | An object $@ assigned to overlapping object $@. | test.cpp:37:9:37:10 | m2 | m2 | test.cpp:37:17:37:18 | m1 | m1 | diff --git a/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.qlref b/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.qlref deleted file mode 100644 index 54e12483d0..0000000000 --- a/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObject.qlref +++ /dev/null @@ -1 +0,0 @@ -rules/M0-2-1/ObjectAssignedToAnOverlappingObject.ql \ No newline at end of file diff --git a/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.testref b/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.testref new file mode 100644 index 0000000000..815531d7ad --- /dev/null +++ b/cpp/autosar/test/rules/M0-2-1/ObjectAssignedToAnOverlappingObjectAutosarCpp.testref @@ -0,0 +1 @@ +cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql \ No newline at end of file diff --git a/cpp/common/src/codingstandards/cpp/exclusions/c/Contracts7.qll b/cpp/common/src/codingstandards/cpp/exclusions/c/Contracts7.qll index f6838fe797..8672196153 100644 --- a/cpp/common/src/codingstandards/cpp/exclusions/c/Contracts7.qll +++ b/cpp/common/src/codingstandards/cpp/exclusions/c/Contracts7.qll @@ -7,8 +7,8 @@ newtype Contracts7Query = TDoNotPassInvalidDataToTheAsctimeFunctionQuery() or TDoNotCallVaArgOnAVaListThatHasAnIndeterminateValueQuery() or TRightHandOperandOfAShiftRangeQuery() or - TObjectAssignedToAnOverlappingObjectQuery() or - TObjectCopiedToAnOverlappingObjectQuery() + TObjectAssignedToAnOverlappingObjectMisraCQuery() or + TObjectCopiedToAnOverlappingObjectMisraCQuery() predicate isContracts7QueryMetadata(Query query, string queryId, string ruleId, string category) { query = @@ -39,20 +39,20 @@ predicate isContracts7QueryMetadata(Query query, string queryId, string ruleId, category = "required" or query = - // `Query` instance for the `objectAssignedToAnOverlappingObject` query - Contracts7Package::objectAssignedToAnOverlappingObjectQuery() and + // `Query` instance for the `objectAssignedToAnOverlappingObjectMisraC` query + Contracts7Package::objectAssignedToAnOverlappingObjectMisraCQuery() and queryId = - // `@id` for the `objectAssignedToAnOverlappingObject` query - "c/misra/object-assigned-to-an-overlapping-object" and + // `@id` for the `objectAssignedToAnOverlappingObjectMisraC` query + "c/misra/object-assigned-to-an-overlapping-object-misra-c" and ruleId = "RULE-19-1" and category = "mandatory" or query = - // `Query` instance for the `objectCopiedToAnOverlappingObject` query - Contracts7Package::objectCopiedToAnOverlappingObjectQuery() and + // `Query` instance for the `objectCopiedToAnOverlappingObjectMisraC` query + Contracts7Package::objectCopiedToAnOverlappingObjectMisraCQuery() and queryId = - // `@id` for the `objectCopiedToAnOverlappingObject` query - "c/misra/object-copied-to-an-overlapping-object" and + // `@id` for the `objectCopiedToAnOverlappingObjectMisraC` query + "c/misra/object-copied-to-an-overlapping-object-misra-c" and ruleId = "RULE-19-1" and category = "mandatory" } @@ -79,17 +79,17 @@ module Contracts7Package { TQueryC(TContracts7PackageQuery(TRightHandOperandOfAShiftRangeQuery())) } - Query objectAssignedToAnOverlappingObjectQuery() { + Query objectAssignedToAnOverlappingObjectMisraCQuery() { //autogenerate `Query` type result = - // `Query` type for `objectAssignedToAnOverlappingObject` query - TQueryC(TContracts7PackageQuery(TObjectAssignedToAnOverlappingObjectQuery())) + // `Query` type for `objectAssignedToAnOverlappingObjectMisraC` query + TQueryC(TContracts7PackageQuery(TObjectAssignedToAnOverlappingObjectMisraCQuery())) } - Query objectCopiedToAnOverlappingObjectQuery() { + Query objectCopiedToAnOverlappingObjectMisraCQuery() { //autogenerate `Query` type result = - // `Query` type for `objectCopiedToAnOverlappingObject` query - TQueryC(TContracts7PackageQuery(TObjectCopiedToAnOverlappingObjectQuery())) + // `Query` type for `objectCopiedToAnOverlappingObjectMisraC` query + TQueryC(TContracts7PackageQuery(TObjectCopiedToAnOverlappingObjectMisraCQuery())) } } diff --git a/cpp/common/src/codingstandards/cpp/exclusions/cpp/Memory4.qll b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Memory4.qll new file mode 100644 index 0000000000..fd22bb3478 --- /dev/null +++ b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Memory4.qll @@ -0,0 +1,44 @@ +//** THIS FILE IS AUTOGENERATED, DO NOT MODIFY DIRECTLY. **/ +import cpp +import RuleMetadata +import codingstandards.cpp.exclusions.RuleMetadata + +newtype Memory4Query = + TObjectAssignedToAnOverlappingObjectMisraCppQuery() or + TObjectCopiedToAnOverlappingObjectMisraCppQuery() + +predicate isMemory4QueryMetadata(Query query, string queryId, string ruleId, string category) { + query = + // `Query` instance for the `objectAssignedToAnOverlappingObjectMisraCpp` query + Memory4Package::objectAssignedToAnOverlappingObjectMisraCppQuery() and + queryId = + // `@id` for the `objectAssignedToAnOverlappingObjectMisraCpp` query + "cpp/misra/object-assigned-to-an-overlapping-object-misra-cpp" and + ruleId = "RULE-8-18-1" and + category = "mandatory" + or + query = + // `Query` instance for the `objectCopiedToAnOverlappingObjectMisraCpp` query + Memory4Package::objectCopiedToAnOverlappingObjectMisraCppQuery() and + queryId = + // `@id` for the `objectCopiedToAnOverlappingObjectMisraCpp` query + "cpp/misra/object-copied-to-an-overlapping-object-misra-cpp" and + ruleId = "RULE-8-18-1" and + category = "mandatory" +} + +module Memory4Package { + Query objectAssignedToAnOverlappingObjectMisraCppQuery() { + //autogenerate `Query` type + result = + // `Query` type for `objectAssignedToAnOverlappingObjectMisraCpp` query + TQueryCPP(TMemory4PackageQuery(TObjectAssignedToAnOverlappingObjectMisraCppQuery())) + } + + Query objectCopiedToAnOverlappingObjectMisraCppQuery() { + //autogenerate `Query` type + result = + // `Query` type for `objectCopiedToAnOverlappingObjectMisraCpp` query + TQueryCPP(TMemory4PackageQuery(TObjectCopiedToAnOverlappingObjectMisraCppQuery())) + } +} diff --git a/cpp/common/src/codingstandards/cpp/exclusions/cpp/Representation.qll b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Representation.qll index 2f92ea89ec..fd07ef14e0 100644 --- a/cpp/common/src/codingstandards/cpp/exclusions/cpp/Representation.qll +++ b/cpp/common/src/codingstandards/cpp/exclusions/cpp/Representation.qll @@ -6,7 +6,7 @@ import codingstandards.cpp.exclusions.RuleMetadata newtype RepresentationQuery = TBitFieldsShallBeUsedOnlyWhenInterfacingToHardwareOrConformingToCommunicationProtocolsQuery() or TAuditPossibleHardwareInterfaceDueToBitFieldUsageInDataTypeDefinitionQuery() or - TObjectAssignedToAnOverlappingObjectQuery() or + TObjectAssignedToAnOverlappingObjectAutosarCppQuery() or TDoNotPassAliasedPointerToParamQuery() or TUnderlyingBitRepresentationsOfFloatingPointValuesUsedQuery() or TNamedBitFieldsWithSignedIntegerTypeShallHaveALengthOfMoreThanOneBitQuery() or @@ -34,11 +34,11 @@ predicate isRepresentationQueryMetadata(Query query, string queryId, string rule category = "required" or query = - // `Query` instance for the `objectAssignedToAnOverlappingObject` query - RepresentationPackage::objectAssignedToAnOverlappingObjectQuery() and + // `Query` instance for the `objectAssignedToAnOverlappingObjectAutosarCpp` query + RepresentationPackage::objectAssignedToAnOverlappingObjectAutosarCppQuery() and queryId = - // `@id` for the `objectAssignedToAnOverlappingObject` query - "cpp/autosar/object-assigned-to-an-overlapping-object" and + // `@id` for the `objectAssignedToAnOverlappingObjectAutosarCpp` query + "cpp/autosar/object-assigned-to-an-overlapping-object-autosar-cpp" and ruleId = "M0-2-1" and category = "required" or @@ -112,11 +112,11 @@ module RepresentationPackage { TQueryCPP(TRepresentationPackageQuery(TAuditPossibleHardwareInterfaceDueToBitFieldUsageInDataTypeDefinitionQuery())) } - Query objectAssignedToAnOverlappingObjectQuery() { + Query objectAssignedToAnOverlappingObjectAutosarCppQuery() { //autogenerate `Query` type result = - // `Query` type for `objectAssignedToAnOverlappingObject` query - TQueryCPP(TRepresentationPackageQuery(TObjectAssignedToAnOverlappingObjectQuery())) + // `Query` type for `objectAssignedToAnOverlappingObjectAutosarCpp` query + TQueryCPP(TRepresentationPackageQuery(TObjectAssignedToAnOverlappingObjectAutosarCppQuery())) } Query doNotPassAliasedPointerToParamQuery() { diff --git a/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll b/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll index 20058503aa..33cb32c719 100644 --- a/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll +++ b/cpp/common/src/codingstandards/cpp/exclusions/cpp/RuleMetadata.qll @@ -43,6 +43,7 @@ import Loops import Macros import Memory2 import Memory3 +import Memory4 import MoveForward import Naming import Naming2 @@ -113,6 +114,7 @@ newtype TCPPQuery = TMacrosPackageQuery(MacrosQuery q) or TMemory2PackageQuery(Memory2Query q) or TMemory3PackageQuery(Memory3Query q) or + TMemory4PackageQuery(Memory4Query q) or TMoveForwardPackageQuery(MoveForwardQuery q) or TNamingPackageQuery(NamingQuery q) or TNaming2PackageQuery(Naming2Query q) or @@ -183,6 +185,7 @@ predicate isQueryMetadata(Query query, string queryId, string ruleId, string cat isMacrosQueryMetadata(query, queryId, ruleId, category) or isMemory2QueryMetadata(query, queryId, ruleId, category) or isMemory3QueryMetadata(query, queryId, ruleId, category) or + isMemory4QueryMetadata(query, queryId, ruleId, category) or isMoveForwardQueryMetadata(query, queryId, ruleId, category) or isNamingQueryMetadata(query, queryId, ruleId, category) or isNaming2QueryMetadata(query, queryId, ruleId, category) or diff --git a/cpp/common/src/codingstandards/cpp/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.qll b/cpp/common/src/codingstandards/cpp/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.qll new file mode 100644 index 0000000000..37ce658bf7 --- /dev/null +++ b/cpp/common/src/codingstandards/cpp/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.qll @@ -0,0 +1,74 @@ +/** + * Provides a library with a `problems` predicate for the following issue: + * An object shall not be copied or assigned to an overlapping object. + */ + +import cpp +import codingstandards.cpp.Customizations +import codingstandards.cpp.Exclusions +import semmle.code.cpp.valuenumbering.GlobalValueNumbering + +abstract class ObjectAssignedToAnOverlappingObjectSharedQuery extends Query { } + +Query getQuery() { result instanceof ObjectAssignedToAnOverlappingObjectSharedQuery } + +VariableAccess getAQualifier(VariableAccess va) { result = va.getQualifier+() } + +int getAccessByteOffset(FieldAccess fa) { + not fa.getQualifier() instanceof FieldAccess and result = fa.getTarget().getByteOffset() + or + result = fa.getTarget().getByteOffset() + getAccessByteOffset(fa.getQualifier()) +} + +predicate overlaps(FieldAccess fa1, FieldAccess fa2) { + exists(int startfa1, int endfa1, int startfa2, int endfa2 | + startfa1 = getAccessByteOffset(fa1) and + endfa1 = startfa1 + fa1.getTarget().getType().getSize() - 1 and + startfa2 = getAccessByteOffset(fa2) and + endfa2 = startfa2 + fa2.getTarget().getType().getSize() - 1 + | + startfa1 = startfa2 and endfa1 = endfa2 + or + startfa1 > startfa2 and endfa1 < endfa2 + or + startfa1 < startfa2 and endfa1 < endfa2 and endfa1 > startfa2 + or + startfa1 > startfa2 and endfa1 > endfa2 and startfa1 < endfa2 + ) +} + +query predicate problems( + AssignExpr assignExpr, string message, ValueFieldAccess valuelhs, string valuelhsTargetName, + ValueFieldAccess valuerhs, string valuerhsTargetName +) { + /* + * from AssignExpr assignExpr, Expr lhs, Expr rhs, ValueFieldAccess valuelhs, ValueFieldAccess valuerhs + * where + * not isExcluded(assignExpr, Contracts7Package::objectAssignedToAnOverlappingObjectQuery()) and + * lhs.getType() instanceof Union and + * rhs.getType() instanceof Union and + * lhs = getAQualifier(assignExpr.getLValue()) and + * rhs = getAQualifier(assignExpr.getRValue()) and + * globalValueNumber(lhs) = globalValueNumber(rhs) and + * valuerhs = assignExpr.getRValue() and + * valuelhs = assignExpr.getLValue() and // a.b.c == ((a.b).c) + * overlaps(valuelhs, valuerhs) + * select assignExpr, "An object $@ assigned to overlapping object $@.", valuelhs, + * valuelhs.getTarget().getName(), valuerhs, valuerhs.getTarget().getName() + */ + + exists(Expr lhs, Expr rhs | + not isExcluded(assignExpr, getQuery()) and + lhs.getType() instanceof Union and + rhs.getType() instanceof Union and + lhs = getAQualifier(assignExpr.getLValue()) and + rhs = getAQualifier(assignExpr.getRValue()) and + globalValueNumber(lhs) = globalValueNumber(rhs) and + valuerhs = assignExpr.getRValue() and + valuelhs = assignExpr.getLValue() and // a.b.c == ((a.b).c) + overlaps(valuelhs, valuerhs) and + message = "An object $@ assigned to overlapping object $@." and + valuelhsTargetName = valuelhs.getTarget().getName() and + valuerhsTargetName = valuerhs.getTarget().getName() + ) +} diff --git a/c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.ql b/cpp/common/src/codingstandards/cpp/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.qll similarity index 68% rename from c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.ql rename to cpp/common/src/codingstandards/cpp/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.qll index 33de4f84b6..625a2f5722 100644 --- a/c/misra/src/rules/RULE-19-1/ObjectCopiedToAnOverlappingObject.ql +++ b/cpp/common/src/codingstandards/cpp/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.qll @@ -1,20 +1,18 @@ /** - * @id c/misra/object-copied-to-an-overlapping-object - * @name RULE-19-1: An object shall not be copied to an overlapping object - * @description An object shall not be copied to an overlapping object. - * @kind problem - * @precision high - * @problem.severity error - * @tags external/misra/id/rule-19-1 - * correctness - * external/misra/c/2012/third-edition-first-revision - * external/misra/obligation/mandatory + * Provides a library with a `problems` predicate for the following issue: + * An object shall not be copied to an overlapping object. */ import cpp -import codingstandards.c.misra +import codingstandards.cpp.Customizations +import codingstandards.cpp.Exclusions +import codingstandards.cpp.SimpleRangeAnalysisCustomizations import semmle.code.cpp.valuenumbering.GlobalValueNumbering +abstract class ObjectCopiedToAnOverlappingObjectSharedQuery extends Query { } + +Query getQuery() { result instanceof ObjectCopiedToAnOverlappingObjectSharedQuery } + /** * Offset in bytes of a field access */ @@ -92,9 +90,24 @@ class OverlappingCopy extends Locatable { } } -from OverlappingCopy copy -where - not isExcluded(copy, Contracts7Package::objectCopiedToAnOverlappingObjectQuery()) and - copy.overlaps() -select copy, "The object to copy $@ overlaps the object to copy $@.", copy.getSrc(), "from", - copy.getDst(), "to" +query predicate problems( + OverlappingCopy copy, string message, Expr copySrc, string fromLiteral, Expr copyDst, + string toLiteral +) { + /* + * from OverlappingCopy copy + * where + * not isExcluded(copy, Contracts7Package::objectCopiedToAnOverlappingObjectQuery()) and + * copy.overlaps() + * select copy, "The object to copy $@ overlaps the object to copy $@.", copy.getSrc(), "from", + * copy.getDst(), "to" + */ + + not isExcluded(copy, getQuery()) and + copy.overlaps() and + message = "The object to copy $@ overlaps the object to copy $@." and + copySrc = copy.getSrc() and + fromLiteral = "from" and + copyDst = copy.getDst() and + toLiteral = "to" +} diff --git a/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected b/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected new file mode 100644 index 0000000000..72fc7a4193 --- /dev/null +++ b/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.expected @@ -0,0 +1 @@ +| test.cpp:36:3:36:18 | ... = ... | An object $@ assigned to overlapping object $@. | test.cpp:36:9:36:10 | m2 | m2 | test.cpp:36:17:36:18 | m1 | m1 | diff --git a/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql b/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql new file mode 100644 index 0000000000..3d5b98d281 --- /dev/null +++ b/cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql @@ -0,0 +1,4 @@ +// GENERATED FILE - DO NOT MODIFY +import codingstandards.cpp.rules.objectassignedtoanoverlappingobject.ObjectAssignedToAnOverlappingObject + +class TestFileQuery extends ObjectAssignedToAnOverlappingObjectSharedQuery, TestQuery { } diff --git a/cpp/autosar/test/rules/M0-2-1/test.cpp b/cpp/common/test/rules/objectassignedtoanoverlappingobject/test.cpp similarity index 99% rename from cpp/autosar/test/rules/M0-2-1/test.cpp rename to cpp/common/test/rules/objectassignedtoanoverlappingobject/test.cpp index 3329f12824..1fed9da0e1 100644 --- a/cpp/autosar/test/rules/M0-2-1/test.cpp +++ b/cpp/common/test/rules/objectassignedtoanoverlappingobject/test.cpp @@ -1,4 +1,3 @@ - struct s1 { int m1[10]; }; diff --git a/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.expected b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.expected new file mode 100644 index 0000000000..cc079637f5 --- /dev/null +++ b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.expected @@ -0,0 +1,5 @@ +| test.cpp:8:3:8:8 | call to memcpy | The object to copy $@ overlaps the object to copy $@. | test.cpp:8:17:8:21 | & ... | from | test.cpp:8:10:8:14 | & ... | to | +| test.cpp:10:3:10:8 | call to memcpy | The object to copy $@ overlaps the object to copy $@. | test.cpp:10:17:10:21 | & ... | from | test.cpp:10:10:10:14 | & ... | to | +| test.cpp:11:3:11:8 | call to memcpy | The object to copy $@ overlaps the object to copy $@. | test.cpp:11:17:11:17 | o | from | test.cpp:11:10:11:14 | ... + ... | to | +| test.cpp:13:3:13:8 | call to memcpy | The object to copy $@ overlaps the object to copy $@. | test.cpp:13:17:13:21 | ... + ... | from | test.cpp:13:10:13:14 | ... + ... | to | +| test.cpp:57:3:57:8 | call to memcpy | The object to copy $@ overlaps the object to copy $@. | test.cpp:57:21:57:26 | & ... | from | test.cpp:57:10:57:18 | & ... | to | diff --git a/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql new file mode 100644 index 0000000000..b05ae1c6e0 --- /dev/null +++ b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql @@ -0,0 +1,4 @@ +// GENERATED FILE - DO NOT MODIFY +import codingstandards.cpp.rules.objectcopiedtoanoverlappingobject.ObjectCopiedToAnOverlappingObject + +class TestFileQuery extends ObjectCopiedToAnOverlappingObjectSharedQuery, TestQuery { } diff --git a/cpp/common/test/rules/objectcopiedtoanoverlappingobject/test.cpp b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/test.cpp new file mode 100644 index 0000000000..47c245c0aa --- /dev/null +++ b/cpp/common/test/rules/objectcopiedtoanoverlappingobject/test.cpp @@ -0,0 +1,59 @@ +#include + +int o[10]; +void g(void) { + + o[2] = o[0]; // COMPLIANT + + memcpy(&o[1], &o[0], 2); // NON_COMPLIANT + memcpy(&o[2], &o[0], 2); // COMPLIANT + memcpy(&o[2], &o[1], 2); // NON_COMPLIANT + memcpy(o + 1, o, 2); // NON_COMPLIANT + memcpy(o + 2, o, 2); // COMPLIANT + memcpy(o + 2, o + 1, 2); // NON_COMPLIANT + + // Exception 1 + int *p = &o[0]; + int *q = &o[0]; + + *p = *q; // COMPLIANT + memcpy(&o[0], &o[0], 2); // COMPLIANT + memcpy(o, o, 2); // COMPLIANT + + // Exception 2 + memmove(&o[1], &o[0], 2u * sizeof(o[0])); // COMPLIANT +} + +struct s1 { + int m1[10]; +}; +struct s2 { + int m1; + struct s1 m2; +}; +union u { + struct s1 m1; + struct s2 m2; +} u1; + +typedef struct { + char buf[8]; +} Union_t; +union { + unsigned char uc[24]; + struct { + Union_t prefix; + Union_t suffix; + } fnv; + struct { + unsigned char padding[16]; + Union_t suffix; + } diff; +} u2; + +void test_unions() { + u1.m2.m2 = u1.m1; // NON_COMPLIANT + + memcpy(&u1.m2.m2, &u1.m1, sizeof(u1.m1)); // NON_COMPLIANT + memcpy(&u2.diff.suffix, &u2.fnv.suffix, sizeof(u2.fnv.suffix)); // COMPLIANT +} diff --git a/cpp/misra/src/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.ql b/cpp/misra/src/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.ql new file mode 100644 index 0000000000..20fff7a3f7 --- /dev/null +++ b/cpp/misra/src/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.ql @@ -0,0 +1,24 @@ +/** + * @id cpp/misra/object-assigned-to-an-overlapping-object-misra-cpp + * @name RULE-8-18-1: A member of a union must not be copied to its another member + * @description Copying a member of a union to another member causes undefined behavior. + * @kind problem + * @precision high + * @problem.severity error + * @tags external/misra/id/rule-8-18-1 + * scope/system + * correctness + * external/misra/enforcement/undecidable + * external/misra/obligation/mandatory + */ + +import cpp +import codingstandards.cpp.misra +import codingstandards.cpp.rules.objectassignedtoanoverlappingobject.ObjectAssignedToAnOverlappingObject + +class ObjectAssignedToAnOverlappingObjectMisraCppQuery extends ObjectAssignedToAnOverlappingObjectSharedQuery +{ + ObjectAssignedToAnOverlappingObjectMisraCppQuery() { + this = Memory4Package::objectAssignedToAnOverlappingObjectMisraCppQuery() + } +} diff --git a/cpp/misra/src/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.ql b/cpp/misra/src/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.ql new file mode 100644 index 0000000000..5a2879abe6 --- /dev/null +++ b/cpp/misra/src/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.ql @@ -0,0 +1,25 @@ +/** + * @id cpp/misra/object-copied-to-an-overlapping-object-misra-cpp + * @name RULE-8-18-1: A slice of an array must not be copied to an overlapping region of itself + * @description Copying a slice of an array to an overlapping region of the same array causes + * undefined behavior. + * @kind problem + * @precision high + * @problem.severity error + * @tags external/misra/id/rule-8-18-1 + * scope/system + * correctness + * external/misra/enforcement/undecidable + * external/misra/obligation/mandatory + */ + +import cpp +import codingstandards.cpp.misra +import codingstandards.cpp.rules.objectcopiedtoanoverlappingobject.ObjectCopiedToAnOverlappingObject + +class ObjectCopiedToAnOverlappingObjectMisraCppQuery extends ObjectCopiedToAnOverlappingObjectSharedQuery +{ + ObjectCopiedToAnOverlappingObjectMisraCppQuery() { + this = Memory4Package::objectCopiedToAnOverlappingObjectMisraCppQuery() + } +} diff --git a/cpp/misra/test/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.testref b/cpp/misra/test/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.testref new file mode 100644 index 0000000000..815531d7ad --- /dev/null +++ b/cpp/misra/test/rules/RULE-8-18-1/ObjectAssignedToAnOverlappingObjectMisraCpp.testref @@ -0,0 +1 @@ +cpp/common/test/rules/objectassignedtoanoverlappingobject/ObjectAssignedToAnOverlappingObject.ql \ No newline at end of file diff --git a/cpp/misra/test/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.testref b/cpp/misra/test/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.testref new file mode 100644 index 0000000000..7b1cb63129 --- /dev/null +++ b/cpp/misra/test/rules/RULE-8-18-1/ObjectCopiedToAnOverlappingObjectMisraCpp.testref @@ -0,0 +1 @@ +cpp/common/test/rules/objectcopiedtoanoverlappingobject/ObjectCopiedToAnOverlappingObject.ql \ No newline at end of file diff --git a/rule_packages/c/Contracts7.json b/rule_packages/c/Contracts7.json index 95df01ca32..8b9ac838ca 100644 --- a/rule_packages/c/Contracts7.json +++ b/rule_packages/c/Contracts7.json @@ -82,7 +82,8 @@ "name": "An object shall not be assigned to an overlapping object", "precision": "high", "severity": "error", - "short_name": "ObjectAssignedToAnOverlappingObject", + "short_name": "ObjectAssignedToAnOverlappingObjectMisraC", + "shared_implementation_short_name": "ObjectAssignedToAnOverlappingObject", "tags": [ "correctness", "external/misra/c/2012/third-edition-first-revision" @@ -94,7 +95,8 @@ "name": "An object shall not be copied to an overlapping object", "precision": "high", "severity": "error", - "short_name": "ObjectCopiedToAnOverlappingObject", + "short_name": "ObjectCopiedToAnOverlappingObjectMisraC", + "shared_implementation_short_name": "ObjectCopiedToAnOverlappingObject", "tags": [ "correctness", "external/misra/c/2012/third-edition-first-revision" @@ -104,4 +106,4 @@ "title": "An object shall not be assigned or copied to an overlapping object" } } -} \ No newline at end of file +} diff --git a/rule_packages/cpp/Memory4.json b/rule_packages/cpp/Memory4.json new file mode 100644 index 0000000000..e25ff0d30c --- /dev/null +++ b/rule_packages/cpp/Memory4.json @@ -0,0 +1,39 @@ +{ + "MISRA-C++-2023": { + "RULE-8-18-1": { + "properties": { + "enforcement": "undecidable", + "obligation": "mandatory" + }, + "queries": [ + { + "description": "Copying a member of a union to another member causes undefined behavior.", + "kind": "problem", + "name": "A member of a union must not be copied to its another member", + "precision": "high", + "severity": "error", + "short_name": "ObjectAssignedToAnOverlappingObjectMisraCpp", + "shared_implementation_short_name": "ObjectAssignedToAnOverlappingObject", + "tags": [ + "scope/system", + "correctness" + ] + }, + { + "description": "Copying a slice of an array to an overlapping region of the same array causes undefined behavior.", + "kind": "problem", + "name": "A slice of an array must not be copied to an overlapping region of itself", + "precision": "high", + "severity": "error", + "short_name": "ObjectCopiedToAnOverlappingObjectMisraCpp", + "shared_implementation_short_name": "ObjectCopiedToAnOverlappingObject", + "tags": [ + "scope/system", + "correctness" + ] + } + ], + "title": "Copying a member of a union to another, and copying a slice of an array to an overlapping one causes undefined behavior." + } + } +} diff --git a/rule_packages/cpp/Representation.json b/rule_packages/cpp/Representation.json index 813373afb4..08056422cc 100644 --- a/rule_packages/cpp/Representation.json +++ b/rule_packages/cpp/Representation.json @@ -49,7 +49,8 @@ "name": "An object shall not be assigned to an overlapping object", "precision": "high", "severity": "error", - "short_name": "ObjectAssignedToAnOverlappingObject", + "short_name": "ObjectAssignedToAnOverlappingObjectAutosarCpp", + "shared_implementation_short_name": "ObjectAssignedToAnOverlappingObject", "tags": [ "correctness" ] @@ -176,4 +177,4 @@ "title": "Do not access the bits of an object representation that are not part of the object's value representation" } } -} \ No newline at end of file +} diff --git a/rules.csv b/rules.csv index e6b3f5cd98..8301bc2a1d 100644 --- a/rules.csv +++ b/rules.csv @@ -899,7 +899,7 @@ cpp,MISRA-C++-2023,RULE-8-7-1,Yes,Required,Undecidable,System,Pointer arithmetic cpp,MISRA-C++-2023,RULE-8-7-2,Yes,Required,Undecidable,System,Subtraction between pointers shall only be applied to pointers that address elements of the same array,ARR36-C,Memory2,Easy, cpp,MISRA-C++-2023,RULE-8-9-1,Yes,Required,Undecidable,System,"The built-in relational operators >, >=, < and <= shall not be applied to objects of pointer type, except where they point to elements of the same array",ARR36-C,Memory3,Easy, cpp,MISRA-C++-2023,RULE-8-14-1,Yes,Advisory,Undecidable,System,The right-hand operand of a logical && or operator should not contain persistent side effects,"M5-14-1, RULE-13-5",SideEffects3,Medium, -cpp,MISRA-C++-2023,RULE-8-18-1,Yes,Mandatory,Undecidable,System,An object or subobject must not be copied to an overlapping object,"M0-2-1, RULE-19-1",Memory,Hard, +cpp,MISRA-C++-2023,RULE-8-18-1,Yes,Mandatory,Undecidable,System,An object or subobject must not be copied to an overlapping object,"M0-2-1, RULE-19-1",Memory4,Hard, cpp,MISRA-C++-2023,RULE-8-18-2,Yes,Advisory,Decidable,Single Translation Unit,The result of an assignment operator should not be used,RULE-13-4,ImportMisra23,Import, cpp,MISRA-C++-2023,RULE-8-19-1,Yes,Advisory,Decidable,Single Translation Unit,The comma operator should not be used,M5-18-1,ImportMisra23,Import, cpp,MISRA-C++-2023,RULE-8-20-1,Yes,Advisory,Decidable,Single Translation Unit,An unsigned arithmetic operation with constant operands should not wrap,INT30-C,ImportMisra23,Import,