Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions change_notes/2026-03-13-make-string-literal-query-shared.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- `A2-13-4` - `StringLiteralsAssignedToNonConstantPointers.ql`:
- 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.
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@

import cpp
import codingstandards.cpp.autosar
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared

from ArrayToPointerConversion apc
where
not isExcluded(apc, StringsPackage::stringLiteralsAssignedToNonConstantPointersQuery()) and
apc.getExpr() instanceof StringLiteral and
apc.getExpr().getUnderlyingType().(ArrayType).getBaseType().isConst() and
not apc.getFullyConverted().getType().getUnderlyingType().(PointerType).getBaseType().isConst()
select apc, "String literal assigned to non-const pointer."
module StringLiteralsAssignedToNonConstantPointersConfig implements
StringLiteralsAssignedToNonConstantPointersSharedConfigSig
{
Query getQuery() { result = StringsPackage::stringLiteralsAssignedToNonConstantPointersQuery() }
}

import StringLiteralsAssignedToNonConstantPointersShared<StringLiteralsAssignedToNonConstantPointersConfig>

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cpp/common/test/rules/stringliteralsassignedtononconstantpointersshared/StringLiteralsAssignedToNonConstantPointersShared.ql
19 changes: 18 additions & 1 deletion cpp/common/src/codingstandards/cpp/exclusions/cpp/Undefined.qll
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ newtype UndefinedQuery =
TCriticalUnspecifiedBehaviorQuery() or
TUndefinedBehaviorAuditQuery() or
TCriticalUnspecifiedBehaviorAuditQuery() or
TPossibleDataRaceBetweenThreadsQuery()
TPossibleDataRaceBetweenThreadsQuery() or
TStringLiteralPossiblyModifiedAuditQuery()

predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, string category) {
query =
Expand Down Expand Up @@ -55,6 +56,15 @@ predicate isUndefinedQueryMetadata(Query query, string queryId, string ruleId, s
"cpp/misra/possible-data-race-between-threads" and
ruleId = "RULE-4-1-3" and
category = "required"
or
query =
// `Query` instance for the `stringLiteralPossiblyModifiedAudit` query
UndefinedPackage::stringLiteralPossiblyModifiedAuditQuery() and
queryId =
// `@id` for the `stringLiteralPossiblyModifiedAudit` query
"cpp/misra/string-literal-possibly-modified-audit" and
ruleId = "RULE-4-1-3" and
category = "required"
}

module UndefinedPackage {
Expand Down Expand Up @@ -92,4 +102,11 @@ module UndefinedPackage {
// `Query` type for `possibleDataRaceBetweenThreads` query
TQueryCPP(TUndefinedPackageQuery(TPossibleDataRaceBetweenThreadsQuery()))
}

Query stringLiteralPossiblyModifiedAuditQuery() {
//autogenerate `Query` type
result =
// `Query` type for `stringLiteralPossiblyModifiedAudit` query
TQueryCPP(TUndefinedPackageQuery(TStringLiteralPossiblyModifiedAuditQuery()))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* Provides a configurable module StringLiteralsAssignedToNonConstantPointersShared with a `problems` predicate
* for the following issue:
* The type of string literal as of C++0x was changed from 'array of char' to array of
* const char and therefore assignment to a non-const pointer is considered an error,
* which is reported as a warning by some compliers.
*/

import cpp
import codingstandards.cpp.Customizations
import codingstandards.cpp.Exclusions

signature module StringLiteralsAssignedToNonConstantPointersSharedConfigSig {
Query getQuery();
}

module StringLiteralsAssignedToNonConstantPointersShared<
StringLiteralsAssignedToNonConstantPointersSharedConfigSig Config>
{
query predicate problems(ArrayToPointerConversion apc, string message) {
not isExcluded(apc, Config::getQuery()) and
apc.getExpr() instanceof StringLiteral and
apc.getExpr().getUnderlyingType().(ArrayType).getBaseType().isConst() and
not apc.getFullyConverted().getType().getUnderlyingType().(PointerType).getBaseType().isConst() and
message = "String literal assigned to non-const pointer."
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
| test.cpp:2:12:2:19 | array to pointer conversion | String literal assigned to non-const pointer. |
| test.cpp:10:15:10:22 | array to pointer conversion | String literal assigned to non-const pointer. |
| test.cpp:20:14:20:22 | array to pointer conversion | String literal assigned to non-const pointer. |
| test.cpp:21:8:21:16 | array to pointer conversion | String literal assigned to non-const pointer. |
| test.cpp:21:8:21:16 | array to pointer conversion | String literal assigned to non-const pointer. |
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// GENERATED FILE - DO NOT MODIFY
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared

module TestFileConfig implements StringLiteralsAssignedToNonConstantPointersSharedConfigSig {
Query getQuery() { result instanceof TestQuery }
}

import StringLiteralsAssignedToNonConstantPointersShared<TestFileConfig>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* @id cpp/misra/string-literal-possibly-modified-audit
* @name RULE-4-1-3: Audit: string literal possibly modified through non-const pointer
* @description Assigning a string literal to a non-const pointer may lead to undefined behaviour if
* the string is modified through that pointer.
* @kind problem
* @precision low
* @problem.severity error
* @tags external/misra/id/rule-4-1-3
* correctness
* scope/system
* external/misra/audit
* external/misra/enforcement/undecidable
* external/misra/obligation/required
*/

import cpp
import codingstandards.cpp.misra
import codingstandards.cpp.rules.stringliteralsassignedtononconstantpointersshared.StringLiteralsAssignedToNonConstantPointersShared

module StringLiteralPossiblyModifiedAuditConfig implements
StringLiteralsAssignedToNonConstantPointersSharedConfigSig
{
Query getQuery() { result = UndefinedPackage::stringLiteralPossiblyModifiedAuditQuery() }
}

import StringLiteralsAssignedToNonConstantPointersShared<StringLiteralPossiblyModifiedAuditConfig>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cpp/common/test/rules/stringliteralsassignedtononconstantpointersshared/StringLiteralsAssignedToNonConstantPointersShared.ql
1 change: 1 addition & 0 deletions rule_packages/cpp/Strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"name": "String literals shall not be assigned to non-constant pointers",
"precision": "very-high",
"severity": "warning",
"shared_implementation_short_name": "StringLiteralsAssignedToNonConstantPointersShared",
"short_name": "StringLiteralsAssignedToNonConstantPointers",
"tags": []
}
Expand Down
14 changes: 14 additions & 0 deletions rule_packages/cpp/Undefined.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,20 @@
"concurrency",
"scope/system"
]
},
{
"description": "Assigning a string literal to a non-const pointer may lead to undefined behaviour if the string is modified through that pointer.",
"kind": "problem",
"name": "Audit: string literal possibly modified through non-const pointer",
"precision": "low",
"severity": "error",
"shared_implementation_short_name": "StringLiteralsAssignedToNonConstantPointersShared",
"short_name": "StringLiteralPossiblyModifiedAudit",
"tags": [
"correctness",
"scope/system",
"external/misra/audit"
]
}
],
"title": "There shall be no occurrence of undefined or critical unspecified behaviour"
Expand Down
Loading