@@ -59,6 +59,8 @@ private predicate pointerToLvalueStep(Expr pointerIn, Expr lvalueOut) {
59
59
pointerIn = lvalueOut .( ArrayExpr ) .getArrayBase ( ) .getFullyConverted ( )
60
60
or
61
61
pointerIn = lvalueOut .( PointerDereferenceExpr ) .getOperand ( ) .getFullyConverted ( )
62
+ or
63
+ pointerIn = lvalueOut .( OverloadedPointerDereferenceExpr ) .getQualifier ( ) .getFullyConverted ( )
62
64
}
63
65
64
66
private predicate lvalueToPointerStep ( Expr lvalueIn , Expr pointerOut ) {
@@ -67,19 +69,6 @@ private predicate lvalueToPointerStep(Expr lvalueIn, Expr pointerOut) {
67
69
lvalueIn = pointerOut .( AddressOfExpr ) .getOperand ( ) .getFullyConverted ( )
68
70
}
69
71
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
-
83
72
private predicate pointerToPointerStep ( Expr pointerIn , Expr pointerOut ) {
84
73
(
85
74
pointerOut instanceof PointerAddExpr
@@ -104,60 +93,35 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) {
104
93
pointerIn = pointerOut .( CommaExpr ) .getRightOperand ( ) .getFullyConverted ( )
105
94
or
106
95
pointerIn = pointerOut .( StmtExpr ) .getResultExpr ( ) .getFullyConverted ( )
107
- or
108
- pointerWrapperToPointerWrapperStep ( pointerIn , pointerOut )
109
96
}
110
97
111
98
private predicate lvalueToReferenceStep ( Expr lvalueIn , Expr referenceOut ) {
112
99
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
+ )
113
106
}
114
107
115
108
private predicate referenceToLvalueStep ( Expr referenceIn , Expr lvalueOut ) {
116
109
referenceIn .getConversion ( ) = lvalueOut .( ReferenceDereferenceExpr )
117
110
}
118
111
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
-
155
112
private predicate referenceToPointerStep ( Expr referenceIn , Expr pointerOut ) {
156
113
pointerOut =
157
114
any ( FunctionCall call |
158
115
stdAddressOf ( call .getTarget ( ) ) and
159
116
referenceIn = call .getArgument ( 0 ) .getFullyConverted ( )
160
117
)
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
+ )
161
125
}
162
126
163
127
private predicate referenceToReferenceStep ( Expr referenceIn , Expr referenceOut ) {
@@ -274,16 +238,6 @@ private predicate pointerToUpdate(Expr pointer, Expr outer, ControlFlowNode node
274
238
pointerToPointerStep ( pointer , pointerMid ) and
275
239
pointerToUpdate ( pointerMid , outer , node )
276
240
)
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
- )
287
241
}
288
242
289
243
private predicate referenceToUpdate ( Expr reference , Expr outer , ControlFlowNode node ) {
@@ -293,7 +247,9 @@ private predicate referenceToUpdate(Expr reference, Expr outer, ControlFlowNode
293
247
not stdIdentityFunction ( call .getTarget ( ) ) and
294
248
not stdAddressOf ( call .getTarget ( ) ) and
295
249
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 ( ) )
297
253
)
298
254
) and
299
255
reference = outer
@@ -314,14 +270,6 @@ private predicate referenceToUpdate(Expr reference, Expr outer, ControlFlowNode
314
270
)
315
271
}
316
272
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
-
325
273
private predicate lvalueFromVariableAccess ( VariableAccess va , Expr lvalue ) {
326
274
// Base case for non-reference types.
327
275
lvalue = va and
@@ -383,21 +331,6 @@ private predicate referenceFromVariableAccess(VariableAccess va, Expr reference)
383
331
lvalueFromVariableAccess ( va , prev ) and
384
332
lvalueToReferenceStep ( prev , reference )
385
333
)
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
- )
401
334
}
402
335
403
336
/**
@@ -418,8 +351,6 @@ predicate valueToUpdate(Expr inner, Expr outer, ControlFlowNode node) {
418
351
pointerToUpdate ( inner , outer , node )
419
352
or
420
353
referenceToUpdate ( inner , outer , node )
421
- or
422
- referenceToPointerToUpdate ( inner , outer , node )
423
354
) and
424
355
(
425
356
inner instanceof VariableAccess and
0 commit comments