@@ -134,34 +134,41 @@ Expr overFlowCand() {
134134 result .( LocalVariableDeclExpr ) .getInit ( ) = overFlowCand ( )
135135}
136136
137- /** Gets an expression that equals `v` plus a positive value. */
138- Expr increaseOfVar ( SsaVariable v ) {
137+ predicate positiveOrNegative ( Expr e ) { positive ( e ) or negative ( e ) }
138+
139+ /** Gets an expression that equals `v` plus a positive or negative value. */
140+ Expr increaseOrDecreaseOfVar ( SsaVariable v ) {
139141 exists ( AssignAddExpr add |
140142 result = add and
141- positive ( add .getDest ( ) ) and
143+ positiveOrNegative ( add .getDest ( ) ) and
142144 add .getRhs ( ) = v .getAUse ( )
143145 )
144146 or
145147 exists ( AddExpr add , Expr e |
146148 result = add and
147149 add .hasOperands ( v .getAUse ( ) , e ) and
148- positive ( e )
150+ positiveOrNegative ( e )
149151 )
150152 or
151- exists ( SsaExplicitUpdate x | result = x .getAUse ( ) and x .getDefiningExpr ( ) = increaseOfVar ( v ) )
153+ exists ( SubExpr sub |
154+ result = sub and
155+ sub .getLeftOperand ( ) = v .getAUse ( ) and
156+ positiveOrNegative ( sub .getRightOperand ( ) )
157+ )
152158 or
153- result .( ParExpr ) .getExpr ( ) = increaseOfVar ( v )
159+ exists ( SsaExplicitUpdate x |
160+ result = x .getAUse ( ) and x .getDefiningExpr ( ) = increaseOrDecreaseOfVar ( v )
161+ )
154162 or
155- result .( AssignExpr ) . getRhs ( ) = increaseOfVar ( v )
163+ result .( ParExpr ) . getExpr ( ) = increaseOrDecreaseOfVar ( v )
156164 or
157- result .( LocalVariableDeclExpr ) .getInit ( ) = increaseOfVar ( v )
165+ result .( AssignExpr ) .getRhs ( ) = increaseOrDecreaseOfVar ( v )
166+ or
167+ result .( LocalVariableDeclExpr ) .getInit ( ) = increaseOrDecreaseOfVar ( v )
158168}
159169
160170predicate overFlowTest ( ComparisonExpr comp ) {
161- exists ( SsaVariable v |
162- comp .getLesserOperand ( ) = increaseOfVar ( v ) and
163- comp .getGreaterOperand ( ) = v .getAUse ( )
164- )
171+ exists ( SsaVariable v | comp .hasOperands ( increaseOrDecreaseOfVar ( v ) , v .getAUse ( ) ) )
165172 or
166173 comp .getLesserOperand ( ) = overFlowCand ( ) and
167174 comp .getGreaterOperand ( ) .( IntegerLiteral ) .getIntValue ( ) = 0
0 commit comments