Skip to content

Commit 5b693f5

Browse files
Merge remote-tracking branch 'origin/michaelrfairhurst/package-undefined-behavior' into michaelrfairhurst/undefined-behavior-new-delete-malloc-mismatch
2 parents c727f2f + 9f3f3ba commit 5b693f5

File tree

13 files changed

+108
-10
lines changed

13 files changed

+108
-10
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- `A2-13-4` - `StringLiteralsAssignedToNonConstantPointers.ql`:
2+
- Refactored query logic into a shared module (`StringLiteralsAssignedToNonConstantPointersShared`) to enable reuse by MISRA C++ `RULE-4-1-3`. The query logic is unchanged. No visible changes to results or performance are expected.

cpp/autosar/src/rules/A2-13-4/StringLiteralsAssignedToNonConstantPointers.ql

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@
1717

1818
import cpp
1919
import codingstandards.cpp.autosar
20+
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared
2021

21-
from ArrayToPointerConversion apc
22-
where
23-
not isExcluded(apc, StringsPackage::stringLiteralsAssignedToNonConstantPointersQuery()) and
24-
apc.getExpr() instanceof StringLiteral and
25-
apc.getExpr().getUnderlyingType().(ArrayType).getBaseType().isConst() and
26-
not apc.getFullyConverted().getType().getUnderlyingType().(PointerType).getBaseType().isConst()
27-
select apc, "String literal assigned to non-const pointer."
22+
module StringLiteralsAssignedToNonConstantPointersConfig implements
23+
StringLiteralsAssignedToNonConstantPointersSharedConfigSig
24+
{
25+
Query getQuery() { result = StringsPackage::stringLiteralsAssignedToNonConstantPointersQuery() }
26+
}
27+
28+
import StringLiteralsAssignedToNonConstantPointersShared<StringLiteralsAssignedToNonConstantPointersConfig>

cpp/autosar/test/rules/A2-13-4/StringLiteralsAssignedToNonConstantPointers.qlref

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cpp/common/test/rules/stringliteralsassignedtononconstantpointersshared/StringLiteralsAssignedToNonConstantPointersShared.ql

cpp/common/src/codingstandards/cpp/exclusions/cpp/Undefined.qll

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ newtype UndefinedQuery =
99
TUndefinedBehaviorAuditQuery() or
1010
TCriticalUnspecifiedBehaviorAuditQuery() or
1111
TPossibleDataRaceBetweenThreadsQuery() or
12-
TDeallocationTypeMismatchQuery()
12+
TDeallocationTypeMismatchQuery() or
13+
TStringLiteralPossiblyModifiedAuditQuery()
1314

1415
predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, string category) {
1516
query =
@@ -65,6 +66,15 @@ predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, s
6566
"cpp/misra/deallocation-type-mismatch" and
6667
ruleId = "RULE-4-1-3" and
6768
category = "required"
69+
or
70+
query =
71+
// `Query` instance for the `stringLiteralPossiblyModifiedAudit` query
72+
UndefinedPackage::stringLiteralPossiblyModifiedAuditQuery() and
73+
queryId =
74+
// `@id` for the `stringLiteralPossiblyModifiedAudit` query
75+
"cpp/misra/string-literal-possibly-modified-audit" and
76+
ruleId = "RULE-4-1-3" and
77+
category = "required"
6878
}
6979

7080
module UndefinedPackage {
@@ -109,4 +119,11 @@ module UndefinedPackage {
109119
// `Query` type for `deallocationTypeMismatch` query
110120
TQueryCPP(TUndefinedPackageQuery(TDeallocationTypeMismatchQuery()))
111121
}
122+
123+
Query stringLiteralPossiblyModifiedAuditQuery() {
124+
//autogenerate `Query` type
125+
result =
126+
// `Query` type for `stringLiteralPossiblyModifiedAudit` query
127+
TQueryCPP(TUndefinedPackageQuery(TStringLiteralPossiblyModifiedAuditQuery()))
128+
}
112129
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* Provides a configurable module StringLiteralsAssignedToNonConstantPointersShared with a `problems` predicate
3+
* for the following issue:
4+
* The type of string literal as of C++0x was changed from 'array of char' to array of
5+
* const char and therefore assignment to a non-const pointer is considered an error,
6+
* which is reported as a warning by some compilers.
7+
*/
8+
9+
import cpp
10+
import codingstandards.cpp.Customizations
11+
import codingstandards.cpp.Exclusions
12+
13+
signature module StringLiteralsAssignedToNonConstantPointersSharedConfigSig {
14+
Query getQuery();
15+
}
16+
17+
module StringLiteralsAssignedToNonConstantPointersShared<
18+
StringLiteralsAssignedToNonConstantPointersSharedConfigSig Config>
19+
{
20+
query predicate problems(ArrayToPointerConversion apc, string message) {
21+
not isExcluded(apc, Config::getQuery()) and
22+
apc.getExpr() instanceof StringLiteral and
23+
apc.getExpr().getUnderlyingType().(ArrayType).getBaseType().isConst() and
24+
not apc.getFullyConverted().getType().getUnderlyingType().(PointerType).getBaseType().isConst() and
25+
message = "String literal assigned to non-const pointer."
26+
}
27+
}

cpp/autosar/test/rules/A2-13-4/StringLiteralsAssignedToNonConstantPointers.expected renamed to cpp/common/test/rules/stringliteralsassignedtononconstantpointersshared/StringLiteralsAssignedToNonConstantPointersShared.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
| test.cpp:2:12:2:19 | array to pointer conversion | String literal assigned to non-const pointer. |
22
| test.cpp:10:15:10:22 | array to pointer conversion | String literal assigned to non-const pointer. |
33
| test.cpp:20:14:20:22 | array to pointer conversion | String literal assigned to non-const pointer. |
4-
| test.cpp:21:8:21:16 | array to pointer conversion | String literal assigned to non-const pointer. |
4+
| test.cpp:21:8:21:16 | array to pointer conversion | String literal assigned to non-const pointer. |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// GENERATED FILE - DO NOT MODIFY
2+
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared
3+
4+
module TestFileConfig implements StringLiteralsAssignedToNonConstantPointersSharedConfigSig {
5+
Query getQuery() { result instanceof TestQuery }
6+
}
7+
8+
import StringLiteralsAssignedToNonConstantPointersShared<TestFileConfig>

cpp/autosar/test/rules/A2-13-4/test.cpp renamed to cpp/common/test/rules/stringliteralsassignedtononconstantpointersshared/test.cpp

File renamed without changes.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @id cpp/misra/string-literal-possibly-modified-audit
3+
* @name RULE-4-1-3: Audit: string literal possibly modified through non-const pointer
4+
* @description Assigning a string literal to a non-const pointer may lead to undefined behaviour if
5+
* the string is modified through that pointer.
6+
* @kind problem
7+
* @precision low
8+
* @problem.severity error
9+
* @tags external/misra/id/rule-4-1-3
10+
* correctness
11+
* scope/system
12+
* external/misra/audit
13+
* external/misra/enforcement/undecidable
14+
* external/misra/obligation/required
15+
*/
16+
17+
import cpp
18+
import codingstandards.cpp.misra
19+
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared
20+
21+
module StringLiteralPossiblyModifiedAuditConfig implements
22+
StringLiteralsAssignedToNonConstantPointersSharedConfigSig
23+
{
24+
Query getQuery() { result = UndefinedPackage::stringLiteralPossiblyModifiedAuditQuery() }
25+
}
26+
27+
import StringLiteralsAssignedToNonConstantPointersShared<StringLiteralPossiblyModifiedAuditConfig>

0 commit comments

Comments
 (0)