Skip to content

Commit 9f3f3ba

Browse files
Merge pull request #1081 from github/michaelrfairhurst/undefined-behavior-modifying-string-literal
Reuse A2-13-4 as an audit query for undefined behavior.
2 parents d7d4769 + 6a6bcba commit 9f3f3ba

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
@@ -8,7 +8,8 @@ newtype UndefinedQuery =
88
TCriticalUnspecifiedBehaviorQuery() or
99
TUndefinedBehaviorAuditQuery() or
1010
TCriticalUnspecifiedBehaviorAuditQuery() or
11-
TPossibleDataRaceBetweenThreadsQuery()
11+
TPossibleDataRaceBetweenThreadsQuery() or
12+
TStringLiteralPossiblyModifiedAuditQuery()
1213

1314
predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, string category) {
1415
query =
@@ -55,6 +56,15 @@ predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, s
5556
"cpp/misra/possible-data-race-between-threads" and
5657
ruleId = "RULE-4-1-3" and
5758
category = "required"
59+
or
60+
query =
61+
// `Query` instance for the `stringLiteralPossiblyModifiedAudit` query
62+
UndefinedPackage::stringLiteralPossiblyModifiedAuditQuery() and
63+
queryId =
64+
// `@id` for the `stringLiteralPossiblyModifiedAudit` query
65+
"cpp/misra/string-literal-possibly-modified-audit" and
66+
ruleId = "RULE-4-1-3" and
67+
category = "required"
5868
}
5969

6070
module UndefinedPackage {
@@ -92,4 +102,11 @@ module UndefinedPackage {
92102
// `Query` type for `possibleDataRaceBetweenThreads` query
93103
TQueryCPP(TUndefinedPackageQuery(TPossibleDataRaceBetweenThreadsQuery()))
94104
}
105+
106+
Query stringLiteralPossiblyModifiedAuditQuery() {
107+
//autogenerate `Query` type
108+
result =
109+
// `Query` type for `stringLiteralPossiblyModifiedAudit` query
110+
TQueryCPP(TUndefinedPackageQuery(TStringLiteralPossiblyModifiedAuditQuery()))
111+
}
95112
}
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)