Skip to content

Commit 0a6aef7

Browse files
committed
C++: Respond to review comments.
1 parent 32a8b9a commit 0a6aef7

File tree

3 files changed

+37
-45
lines changed

3 files changed

+37
-45
lines changed

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ private class VariablePartialDefinitionNode extends PartialDefinitionNode {
326326
* A synthetic data flow node used for flow into a collection when an iterator
327327
* write occurs in a callee.
328328
*/
329-
class IteratorPartialDefinitionNode extends PartialDefinitionNode {
329+
private class IteratorPartialDefinitionNode extends PartialDefinitionNode {
330330
override IteratorPartialDefinition pd;
331331

332332
override Node getPreUpdateNode() { pd.definesExpressions(_, result.asExpr()) }
@@ -338,7 +338,7 @@ class IteratorPartialDefinitionNode extends PartialDefinitionNode {
338338
* A synthetic data flow node used for flow into a collection when a smart pointer
339339
* write occurs in a callee.
340340
*/
341-
class SmartPointerPartialDefinitionNode extends PartialDefinitionNode {
341+
private class SmartPointerPartialDefinitionNode extends PartialDefinitionNode {
342342
override SmartPointerPartialDefinition pd;
343343

344344
override Node getPreUpdateNode() { pd.definesExpressions(_, result.asExpr()) }

cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,14 @@ private module PartialDefinitions {
159159
Expr innerDefinedExpr;
160160

161161
IteratorPartialDefinition() {
162-
exists(Expr convertedInner |
163-
not this instanceof Conversion and
164-
valueToUpdate(convertedInner, this.getFullyConverted(), node) and
165-
innerDefinedExpr = convertedInner.getUnconverted() and
166-
(
167-
innerDefinedExpr.(Call).getQualifier() = getAnIteratorAccess(collection)
168-
or
169-
innerDefinedExpr.(Call).getQualifier() = collection.getAnAccess() and
170-
collection instanceof IteratorParameter
171-
) and
172-
innerDefinedExpr.(Call).getTarget() instanceof IteratorPointerDereferenceMemberOperator
173-
)
162+
innerDefinedExpr = getInnerDefinedExpr(this, node) and
163+
(
164+
innerDefinedExpr.(Call).getQualifier() = getAnIteratorAccess(collection)
165+
or
166+
innerDefinedExpr.(Call).getQualifier() = collection.getAnAccess() and
167+
collection instanceof IteratorParameter
168+
) and
169+
innerDefinedExpr.(Call).getTarget() instanceof IteratorPointerDereferenceMemberOperator
174170
or
175171
// iterators passed by value without a copy constructor
176172
exists(Call call |
@@ -208,16 +204,18 @@ private module PartialDefinitions {
208204
}
209205
}
210206

207+
private Expr getInnerDefinedExpr(Expr e, ControlFlowNode node) {
208+
not e instanceof Conversion and
209+
exists(Expr convertedInner |
210+
valueToUpdate(convertedInner, e.getFullyConverted(), node) and
211+
result = convertedInner.getUnconverted()
212+
)
213+
}
214+
211215
class VariablePartialDefinition extends PartialDefinition {
212216
Expr innerDefinedExpr;
213217

214-
VariablePartialDefinition() {
215-
not this instanceof Conversion and
216-
exists(Expr convertedInner |
217-
valueToUpdate(convertedInner, this.getFullyConverted(), node) and
218-
innerDefinedExpr = convertedInner.getUnconverted()
219-
)
220-
}
218+
VariablePartialDefinition() { innerDefinedExpr = getInnerDefinedExpr(this, node) }
221219

222220
deprecated override predicate partiallyDefines(Variable v) {
223221
innerDefinedExpr = v.getAnAccess()
@@ -249,30 +247,15 @@ private module PartialDefinitions {
249247
Expr innerDefinedExpr;
250248

251249
SmartPointerPartialDefinition() {
252-
exists(Expr convertedInner |
253-
not this instanceof Conversion and
254-
valueToUpdate(convertedInner, this.getFullyConverted(), node) and
255-
innerDefinedExpr = convertedInner.getUnconverted() and
256-
innerDefinedExpr = getAPointerWrapperAccess(pointer)
257-
)
250+
innerDefinedExpr = pragma[only_bind_out](getInnerDefinedExpr(this, node)) and
251+
innerDefinedExpr = getAPointerWrapperAccess(pointer, -1)
258252
or
259-
// pointer wrappers passed by value without a copy constructor
253+
// Pointer wrappers passed to a function by value.
260254
exists(Call call |
261255
call = node and
262256
call.getAnArgument() = innerDefinedExpr and
263257
innerDefinedExpr = this and
264-
this = getAPointerWrapperAccess(pointer) and
265-
not call instanceof OverloadedPointerDereferenceExpr
266-
)
267-
or
268-
// pointer wrappers passed by value with a copy constructor
269-
exists(Call call, ConstructorCall copy |
270-
copy.getTarget() instanceof CopyConstructor and
271-
call = node and
272-
call.getAnArgument() = copy and
273-
copy.getArgument(0) = getAPointerWrapperAccess(pointer) and
274-
innerDefinedExpr = this and
275-
this = copy and
258+
this = getAPointerWrapperAccess(pointer, 0) and
276259
not call instanceof OverloadedPointerDereferenceExpr
277260
)
278261
}
@@ -893,9 +876,20 @@ module FlowVar_internal {
893876
)
894877
}
895878

896-
Call getAPointerWrapperAccess(Variable pointer) {
897-
pointer.getUnspecifiedType() instanceof PointerWrapper and
898-
[result.getQualifier(), result.getAnArgument()] = pointer.getAnAccess()
879+
/**
880+
* Gets either:
881+
* - A call to an unwrapper function, where an access to `pointer` is the qualifier, or
882+
* - A call to the `CopyConstructor` that copies the value of an access to `pointer`.
883+
*/
884+
Call getAPointerWrapperAccess(Variable pointer, int n) {
885+
exists(PointerWrapper wrapper | wrapper = pointer.getUnspecifiedType().stripType() |
886+
n = -1 and
887+
result.getQualifier() = pointer.getAnAccess() and
888+
result.getTarget() = wrapper.getAnUnwrapperFunction()
889+
or
890+
result.getArgument(n) = pointer.getAnAccess() and
891+
result.getTarget() instanceof CopyConstructor
892+
)
899893
}
900894

901895
class IteratorParameter extends Parameter {

cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3223,7 +3223,6 @@
32233223
| smart_pointer.cpp:11:30:11:50 | call to make_shared | smart_pointer.cpp:12:11:12:11 | p | |
32243224
| smart_pointer.cpp:11:30:11:50 | call to make_shared | smart_pointer.cpp:13:10:13:10 | p | |
32253225
| smart_pointer.cpp:11:52:11:57 | call to source | smart_pointer.cpp:11:30:11:50 | call to make_shared | TAINT |
3226-
| smart_pointer.cpp:12:10:12:10 | call to operator* [post update] | smart_pointer.cpp:13:10:13:10 | p | |
32273226
| smart_pointer.cpp:12:11:12:11 | p | smart_pointer.cpp:12:10:12:10 | call to operator* | TAINT |
32283227
| smart_pointer.cpp:12:11:12:11 | ref arg p | smart_pointer.cpp:13:10:13:10 | p | |
32293228
| smart_pointer.cpp:17:32:17:54 | call to make_shared | smart_pointer.cpp:18:11:18:11 | p | |
@@ -3234,7 +3233,6 @@
32343233
| smart_pointer.cpp:23:30:23:50 | call to make_unique | smart_pointer.cpp:24:11:24:11 | p | |
32353234
| smart_pointer.cpp:23:30:23:50 | call to make_unique | smart_pointer.cpp:25:10:25:10 | p | |
32363235
| smart_pointer.cpp:23:52:23:57 | call to source | smart_pointer.cpp:23:30:23:50 | call to make_unique | TAINT |
3237-
| smart_pointer.cpp:24:10:24:10 | call to operator* [post update] | smart_pointer.cpp:25:10:25:10 | p | |
32383236
| smart_pointer.cpp:24:11:24:11 | p | smart_pointer.cpp:24:10:24:10 | call to operator* | TAINT |
32393237
| smart_pointer.cpp:24:11:24:11 | ref arg p | smart_pointer.cpp:25:10:25:10 | p | |
32403238
| smart_pointer.cpp:29:32:29:54 | call to make_unique | smart_pointer.cpp:30:11:30:11 | p | |

0 commit comments

Comments
 (0)