Skip to content

Commit 3d93c8e

Browse files
Finalize as Declaration6 - rule 10-1-1 properly const qualify refs & pointers.
1 parent 5facdd5 commit 3d93c8e

File tree

6 files changed

+136
-106
lines changed

6 files changed

+136
-106
lines changed

cpp/common/src/codingstandards/cpp/exclusions/cpp/Declarations3.qll renamed to cpp/common/src/codingstandards/cpp/exclusions/cpp/Declarations6.qll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@ import cpp
33
import RuleMetadata
44
import codingstandards.cpp.exclusions.RuleMetadata
55

6-
newtype Declarations3Query = TPointerOrRefParamNotConstQuery()
6+
newtype Declarations6Query = TPointerOrRefParamNotConstQuery()
77

8-
predicate isDeclarations3QueryMetadata(Query query, string queryId, string ruleId, string category) {
8+
predicate isDeclarations6QueryMetadata(Query query, string queryId, string ruleId, string category) {
99
query =
1010
// `Query` instance for the `pointerOrRefParamNotConst` query
11-
Declarations3Package::pointerOrRefParamNotConstQuery() and
11+
Declarations6Package::pointerOrRefParamNotConstQuery() and
1212
queryId =
1313
// `@id` for the `pointerOrRefParamNotConst` query
1414
"cpp/misra/pointer-or-ref-param-not-const" and
1515
ruleId = "RULE-10-1-1" and
1616
category = "advisory"
1717
}
1818

19-
module Declarations3Package {
19+
module Declarations6Package {
2020
Query pointerOrRefParamNotConstQuery() {
2121
//autogenerate `Query` type
2222
result =
2323
// `Query` type for `pointerOrRefParamNotConst` query
24-
TQueryCPP(TDeclarations3PackageQuery(TPointerOrRefParamNotConstQuery()))
24+
TQueryCPP(TDeclarations6PackageQuery(TPointerOrRefParamNotConstQuery()))
2525
}
2626
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import DeadCode8
2828
import DeadCode9
2929
import Declarations
3030
import Declarations1
31-
import Declarations3
31+
import Declarations6
3232
import ExceptionSafety
3333
import Exceptions1
3434
import Exceptions2
@@ -120,7 +120,7 @@ newtype TCPPQuery =
120120
TDeadCode9PackageQuery(DeadCode9Query q) or
121121
TDeclarationsPackageQuery(DeclarationsQuery q) or
122122
TDeclarations1PackageQuery(Declarations1Query q) or
123-
TDeclarations3PackageQuery(Declarations3Query q) or
123+
TDeclarations6PackageQuery(Declarations6Query q) or
124124
TExceptionSafetyPackageQuery(ExceptionSafetyQuery q) or
125125
TExceptions1PackageQuery(Exceptions1Query q) or
126126
TExceptions2PackageQuery(Exceptions2Query q) or
@@ -212,7 +212,7 @@ predicate isQueryMetadata(Query query, string queryId, string ruleId, string cat
212212
isDeadCode9QueryMetadata(query, queryId, ruleId, category) or
213213
isDeclarationsQueryMetadata(query, queryId, ruleId, category) or
214214
isDeclarations1QueryMetadata(query, queryId, ruleId, category) or
215-
isDeclarations3QueryMetadata(query, queryId, ruleId, category) or
215+
isDeclarations6QueryMetadata(query, queryId, ruleId, category) or
216216
isExceptionSafetyQueryMetadata(query, queryId, ruleId, category) or
217217
isExceptions1QueryMetadata(query, queryId, ruleId, category) or
218218
isExceptions2QueryMetadata(query, queryId, ruleId, category) or

cpp/misra/src/rules/RULE-10-1-1/PointerOrRefParamNotConst.ql

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import cpp
1919
import codingstandards.cpp.misra
2020
import codingstandards.cpp.types.Pointers
21+
import codingstandards.cpp.Call
2122
import codingstandards.cpp.SideEffect
2223
import codingstandards.cpp.alertreporting.HoldsForAllCopies
2324

@@ -94,8 +95,7 @@ class PointerLikeParam extends Parameter {
9495
pointerLikeType = this.getType() and
9596
not pointerLikeType.pointsToConst() and
9697
// Exclude pointers to non-object types
97-
not pointerLikeType.getInnerType() instanceof RoutineType and
98-
not pointerLikeType.getInnerType() instanceof VoidType
98+
not pointerLikeType.getInnerType() instanceof RoutineType
9999
}
100100

101101
/**
@@ -134,6 +134,24 @@ class PointerLikeParam extends Parameter {
134134
}
135135
}
136136

137+
predicate test(Assignment a, Field f, Parameter p, string n) {
138+
a.getLValue() = f.getAnAccess() and
139+
a.getRValue() = p.getAnAccess() and
140+
f.getName() = "planes" and
141+
n = p.getFunction().getName() and
142+
a.getFile().getBaseName() = "matrix_iterator.cpp"
143+
}
144+
145+
predicate test2(Parameter p) {
146+
p.getName() = ["planes", "_planes"] and
147+
p.getFunction().getName() = "init"
148+
}
149+
150+
predicate test3(Function f, int num) {
151+
f.getName() = "init" and
152+
num = strictcount(Parameter p | p.getFunction() = f and p.getName() = ["planes", "_planes"])
153+
}
154+
137155
/**
138156
* A `VariableEffect` whose target variable is a `PointerLikeParam`.
139157
*
@@ -176,6 +194,7 @@ class PointerLikeEffect extends VariableEffect {
176194
class NonConstParam extends PointerLikeParam {
177195
NonConstParam() {
178196
not pointerLikeType.pointsToConst() and
197+
not pointerLikeType.getInnerType() instanceof VoidType and
179198
// Ignore parameters in functions without bodies
180199
exists(this.getFunction().getBlock()) and
181200
// Ignore unnamed parameters
@@ -199,14 +218,14 @@ class NonConstParam extends PointerLikeParam {
199218
effect.getTarget() = this and
200219
effect.affectsInnerType()
201220
) and
202-
// Exclude parameters passed as arguments to functions taking non-const pointer/ref params
203-
not exists(FunctionCall fc, int i |
204-
fc.getArgument(i) = this.getAPointerLikeAccess() and
205-
fc.getTarget().getParameter(i).getType().(PointerLikeType).pointsToNonConst()
221+
// Exclude parameters passed as arguments to non-const pointer/ref params
222+
not exists(CallArgumentExpr arg |
223+
arg = this.getAPointerLikeAccess() and
224+
arg.getParamType().(PointerLikeType).pointsToNonConst()
206225
) and
207226
// Exclude parameters used as qualifier for a non-const member function
208227
not exists(FunctionCall fc |
209-
fc.getQualifier() = this.getAnAccess() and
228+
fc.getQualifier() = [this.getAnAccess(), this.getAPointerLikeAccess()] and
210229
not fc.getTarget().hasSpecifier("const") and
211230
not fc.getTarget().isStatic()
212231
) and
@@ -228,14 +247,25 @@ class NonConstParam extends PointerLikeParam {
228247
// exclude pointer to pointer and reference to pointer cases.
229248
addrOf.getOperand() = this.getAPointerLikeAccess() and
230249
addrOf.getType().(PointerLikeType).getInnerType() instanceof PointerLikeType
250+
) and
251+
not exists(PointerArithmeticOperation pointerManip |
252+
pointerManip.getAnOperand() = this.getAPointerLikeAccess() and
253+
pointerManip.getType().(PointerLikeType).pointsToNonConst()
231254
)
232255
}
233256
}
234257

235258
from NonConstParam param, Type innerType
236259
where
237260
not isExcluded(param, Declarations3Package::pointerOrRefParamNotConstQuery()) and
238-
innerType = param.getPointerLikeType().getInnerType()
261+
innerType = param.getPointerLikeType().getInnerType() and
262+
not param.isAffectedByMacro() and
263+
// Exclude functions with copied parameters which leads to wrong results.
264+
count(Parameter p |
265+
p.getFunction() = param.getFunction() and
266+
p.getIndex() = param.getIndex()
267+
) = 1
239268
select param,
240269
"Parameter '" + param.getName() + "' points/refers to a non-const type '" + innerType.toString() +
241-
"' but does not modify the target object."
270+
"' but does not modify the target object in the $@.", param.getFunction().getDefinition(),
271+
"function definition"

0 commit comments

Comments
 (0)