Skip to content

Commit da36508

Browse files
committed
Revert "C++: As response to the review comments this commit adds a reference-to-pointer state to AddressFlow. A call to an unwrapper function now adds a pointer -> reference-to-pointer transition, and a ReferenceDereference adds a reference-to-pointer -> pointer transition."
This reverts commit 5aeaab7.
1 parent 5aeaab7 commit da36508

File tree

2 files changed

+38
-116
lines changed

2 files changed

+38
-116
lines changed

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

Lines changed: 18 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ private predicate pointerToLvalueStep(Expr pointerIn, Expr lvalueOut) {
5959
pointerIn = lvalueOut.(ArrayExpr).getArrayBase().getFullyConverted()
6060
or
6161
pointerIn = lvalueOut.(PointerDereferenceExpr).getOperand().getFullyConverted()
62+
or
63+
pointerIn = lvalueOut.(OverloadedPointerDereferenceExpr).getQualifier().getFullyConverted()
6264
}
6365

6466
private predicate lvalueToPointerStep(Expr lvalueIn, Expr pointerOut) {
@@ -67,19 +69,6 @@ private predicate lvalueToPointerStep(Expr lvalueIn, Expr pointerOut) {
6769
lvalueIn = pointerOut.(AddressOfExpr).getOperand().getFullyConverted()
6870
}
6971

70-
/**
71-
* Since pointer wrappers behave as raw pointers, we treat the conversions from `lvalueToLvalueStepPure`
72-
* as pointer-to-pointer steps when they involve pointer wrappers.
73-
*/
74-
private predicate pointerWrapperToPointerWrapperStep(Expr pointerIn, Expr pointerOut) {
75-
pointerIn.getUnspecifiedType() instanceof PointerWrapper and
76-
pointerIn.getConversion() = pointerOut and
77-
pointerOut.(CStyleCast).isImplicit()
78-
or
79-
pointerOut.getUnspecifiedType() instanceof PointerWrapper and
80-
pointerIn.getConversion() = pointerOut.(ReferenceDereferenceExpr)
81-
}
82-
8372
private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) {
8473
(
8574
pointerOut instanceof PointerAddExpr
@@ -104,60 +93,35 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) {
10493
pointerIn = pointerOut.(CommaExpr).getRightOperand().getFullyConverted()
10594
or
10695
pointerIn = pointerOut.(StmtExpr).getResultExpr().getFullyConverted()
107-
or
108-
pointerWrapperToPointerWrapperStep(pointerIn, pointerOut)
10996
}
11097

11198
private predicate lvalueToReferenceStep(Expr lvalueIn, Expr referenceOut) {
11299
lvalueIn.getConversion() = referenceOut.(ReferenceToExpr)
100+
or
101+
exists(PointerWrapper wrapper, Call call | call = referenceOut |
102+
referenceOut.getUnspecifiedType() instanceof ReferenceType and
103+
call = wrapper.getAnUnwrapperFunction().getACallToThisFunction() and
104+
lvalueIn = call.getQualifier().getFullyConverted()
105+
)
113106
}
114107

115108
private predicate referenceToLvalueStep(Expr referenceIn, Expr lvalueOut) {
116109
referenceIn.getConversion() = lvalueOut.(ReferenceDereferenceExpr)
117110
}
118111

119-
private predicate referenceToPointerToPointerStep(Expr referenceToPointerIn, Expr pointerOut) {
120-
exists(CopyConstructor copy, Call call | call = pointerOut |
121-
copy.getDeclaringType() instanceof PointerWrapper and
122-
call.getTarget() = copy and
123-
// The 0'th argument is the value being copied.
124-
referenceToPointerIn = call.getArgument(0).getFullyConverted()
125-
)
126-
or
127-
referenceToPointerIn.getConversion() = pointerOut.(ReferenceDereferenceExpr)
128-
}
129-
130-
/**
131-
* This predicate exists only to support "fake pointer" objects like
132-
* smart pointers. We treat these as raw pointers for dataflow purposes.
133-
*/
134-
private predicate referenceToPointerToUpdate(
135-
Expr referenceToPointer, Expr outer, ControlFlowNode node
136-
) {
137-
exists(Call call |
138-
node = call and
139-
outer = call.getAnArgument().getFullyConverted() and
140-
not stdIdentityFunction(call.getTarget()) and
141-
not stdAddressOf(call.getTarget()) and
142-
exists(ReferenceType rt | rt = outer.getType().stripTopLevelSpecifiers() |
143-
rt.getBaseType().getUnspecifiedType() =
144-
any(PointerWrapper wrapper | not wrapper.pointsToConst())
145-
)
146-
) and
147-
referenceToPointer = outer
148-
or
149-
exists(Expr pointerMid |
150-
referenceToPointerToPointerStep(referenceToPointer, pointerMid) and
151-
pointerToUpdate(pointerMid, outer, node)
152-
)
153-
}
154-
155112
private predicate referenceToPointerStep(Expr referenceIn, Expr pointerOut) {
156113
pointerOut =
157114
any(FunctionCall call |
158115
stdAddressOf(call.getTarget()) and
159116
referenceIn = call.getArgument(0).getFullyConverted()
160117
)
118+
or
119+
exists(CopyConstructor copy, Call call | call = pointerOut |
120+
copy.getDeclaringType() instanceof PointerWrapper and
121+
call.getTarget() = copy and
122+
// The 0'th argument is the value being copied.
123+
referenceIn = call.getArgument(0).getFullyConverted()
124+
)
161125
}
162126

163127
private predicate referenceToReferenceStep(Expr referenceIn, Expr referenceOut) {
@@ -274,16 +238,6 @@ private predicate pointerToUpdate(Expr pointer, Expr outer, ControlFlowNode node
274238
pointerToPointerStep(pointer, pointerMid) and
275239
pointerToUpdate(pointerMid, outer, node)
276240
)
277-
or
278-
exists(Expr referenceMid |
279-
pointerToReferenceStep(pointer, referenceMid) and
280-
referenceToUpdate(referenceMid, outer, node)
281-
)
282-
or
283-
exists(Expr referenceToPointerMid |
284-
pointerToReferenceToPointerStep(pointer, referenceToPointerMid) and
285-
referenceToPointerToUpdate(referenceToPointerMid, outer, node)
286-
)
287241
}
288242

289243
private predicate referenceToUpdate(Expr reference, Expr outer, ControlFlowNode node) {
@@ -293,7 +247,9 @@ private predicate referenceToUpdate(Expr reference, Expr outer, ControlFlowNode
293247
not stdIdentityFunction(call.getTarget()) and
294248
not stdAddressOf(call.getTarget()) and
295249
exists(ReferenceType rt | rt = outer.getType().stripTopLevelSpecifiers() |
296-
not rt.getBaseType().isConst()
250+
not rt.getBaseType().isConst() or
251+
rt.getBaseType().getUnspecifiedType() =
252+
any(PointerWrapper wrapper | not wrapper.pointsToConst())
297253
)
298254
) and
299255
reference = outer
@@ -314,14 +270,6 @@ private predicate referenceToUpdate(Expr reference, Expr outer, ControlFlowNode
314270
)
315271
}
316272

317-
private predicate pointerToReferenceStep(Expr pointerIn, Expr referenceOut) {
318-
exists(PointerWrapper wrapper, Call call | call = referenceOut |
319-
referenceOut.getUnspecifiedType() instanceof ReferenceType and
320-
call = wrapper.getAnUnwrapperFunction().getACallToThisFunction() and
321-
pointerIn = call.getQualifier().getFullyConverted()
322-
)
323-
}
324-
325273
private predicate lvalueFromVariableAccess(VariableAccess va, Expr lvalue) {
326274
// Base case for non-reference types.
327275
lvalue = va and
@@ -383,21 +331,6 @@ private predicate referenceFromVariableAccess(VariableAccess va, Expr reference)
383331
lvalueFromVariableAccess(va, prev) and
384332
lvalueToReferenceStep(prev, reference)
385333
)
386-
or
387-
exists(Expr prev |
388-
pointerFromVariableAccess(va, prev) and
389-
pointerToReferenceStep(prev, reference)
390-
)
391-
}
392-
393-
private predicate pointerToReferenceToPointerStep(Expr pointerIn, Expr referenceToPointerOut) {
394-
pointerIn.getConversion() = referenceToPointerOut.(ReferenceToExpr)
395-
or
396-
exists(PointerWrapper wrapper, Call call | call = referenceToPointerOut |
397-
referenceToPointerOut.getUnspecifiedType() instanceof ReferenceType and
398-
call = wrapper.getAnUnwrapperFunction().getACallToThisFunction() and
399-
pointerIn = call.getQualifier().getFullyConverted()
400-
)
401334
}
402335

403336
/**
@@ -418,8 +351,6 @@ predicate valueToUpdate(Expr inner, Expr outer, ControlFlowNode node) {
418351
pointerToUpdate(inner, outer, node)
419352
or
420353
referenceToUpdate(inner, outer, node)
421-
or
422-
referenceToPointerToUpdate(inner, outer, node)
423354
) and
424355
(
425356
inner instanceof VariableAccess and

0 commit comments

Comments
 (0)