@@ -73,47 +73,33 @@ private int isSource(Expr bufferExpr, Element why) {
7373 )
7474}
7575
76- private predicate localFlowToExprStep ( DataFlow:: Node n1 , DataFlow:: Node n2 ) {
77- not exists ( n2 .asExpr ( ) ) and
78- DataFlow:: localFlowStep ( n1 , n2 )
79- }
80-
81- /** Holds if `n2 + delta` may be equal to `n1`. */
82- private predicate localFlowStepToExpr ( Expr e1 , Expr e2 ) {
83- getBufferSizeCand0 ( e1 ) and
84- exists ( DataFlow:: Node n1 , DataFlow:: Node mid , DataFlow:: Node n2 |
85- n1 .asExpr ( ) = e1 and
86- localFlowToExprStep * ( n1 , mid ) and
87- DataFlow:: localFlowStep ( mid , n2 ) and
88- n2 .asExpr ( ) = e2
89- )
90- }
91-
9276/**
9377 * Holds if `e2` is an expression that is derived from `e1` such that if `e1[n]` is a
9478 * well-defined expression for some number `n`, then `e2[n + delta]` is also a well-defined
9579 * expression.
9680 */
9781private predicate step ( Expr e1 , Expr e2 , int delta ) {
9882 getBufferSizeCand0 ( e1 ) and
99- exists ( Variable bufferVar , Class parentClass , VariableAccess parentPtr , int bufferSize |
100- e1 = parentPtr
101- |
102- bufferVar = e2 .( VariableAccess ) .getTarget ( ) and
103- // buffer is the parentPtr->bufferVar of a 'variable size struct'
104- memberMayBeVarSize ( parentClass , bufferVar ) and
105- parentPtr = e2 .( VariableAccess ) .getQualifier ( ) and
106- parentPtr .getTarget ( ) .getUnspecifiedType ( ) .( PointerType ) .getBaseType ( ) = parentClass and
107- (
108- if exists ( bufferVar .getType ( ) .getSize ( ) )
109- then bufferSize = bufferVar .getType ( ) .getSize ( )
110- else bufferSize = 0
111- ) and
112- delta = bufferSize - parentClass .getSize ( )
83+ (
84+ exists ( Variable bufferVar , Class parentClass , VariableAccess parentPtr , int bufferSize |
85+ e1 = parentPtr
86+ |
87+ bufferVar = e2 .( VariableAccess ) .getTarget ( ) and
88+ // buffer is the parentPtr->bufferVar of a 'variable size struct'
89+ memberMayBeVarSize ( parentClass , bufferVar ) and
90+ parentPtr = e2 .( VariableAccess ) .getQualifier ( ) and
91+ parentPtr .getTarget ( ) .getUnspecifiedType ( ) .( PointerType ) .getBaseType ( ) = parentClass and
92+ (
93+ if exists ( bufferVar .getType ( ) .getSize ( ) )
94+ then bufferSize = bufferVar .getType ( ) .getSize ( )
95+ else bufferSize = 0
96+ ) and
97+ delta = bufferSize - parentClass .getSize ( )
98+ )
99+ or
100+ DataFlow:: localExprFlowStep ( e1 , e2 ) and
101+ delta = 0
113102 )
114- or
115- localFlowStepToExpr ( e1 , e2 ) and
116- delta = 0
117103}
118104
119105pragma [ nomagic]
0 commit comments