@@ -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
6466private 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-
8372private 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
11198private 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
115108private 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-
155112private 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
163127private 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
289243private 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-
325273private 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