@@ -15,24 +15,33 @@ class ConstantZero extends Expr {
15
15
}
16
16
}
17
17
18
+ /**
19
+ * Holds if `candidate` is an expression such that if it's unsigned then we
20
+ * want an alert at `ge`.
21
+ */
22
+ private predicate lookForUnsignedAt ( GEExpr ge , Expr candidate ) {
23
+ // Base case: `candidate >= 0`
24
+ ge .getRightOperand ( ) instanceof ConstantZero and
25
+ candidate = ge .getLeftOperand ( ) .getFullyConverted ( ) and
26
+ // left operand was a signed or unsigned IntegralType before conversions
27
+ // (not a pointer, checking a pointer >= 0 is an entirely different mistake)
28
+ // (not an enum, as the fully converted type of an enum is compiler dependent
29
+ // so checking an enum >= 0 is always reasonable)
30
+ ge .getLeftOperand ( ) .getUnderlyingType ( ) instanceof IntegralType
31
+ or
32
+ // Recursive case: `...(largerType)candidate >= 0`
33
+ exists ( Conversion conversion |
34
+ lookForUnsignedAt ( ge , conversion ) and
35
+ candidate = conversion .getExpr ( ) and
36
+ conversion .getType ( ) .getSize ( ) > candidate .getType ( ) .getSize ( )
37
+ )
38
+ }
39
+
18
40
class UnsignedGEZero extends GEExpr {
19
41
UnsignedGEZero ( ) {
20
- this .getRightOperand ( ) instanceof ConstantZero and
21
- // left operand was a signed or unsigned IntegralType before conversions
22
- // (not a pointer, checking a pointer >= 0 is an entirely different mistake)
23
- // (not an enum, as the fully converted type of an enum is compiler dependent
24
- // so checking an enum >= 0 is always reasonable)
25
- getLeftOperand ( ) .getUnderlyingType ( ) instanceof IntegralType and
26
42
exists ( Expr ue |
27
- // ue is some conversion of the left operand
28
- ue = getLeftOperand ( ) .getConversion * ( ) and
29
- // ue is unsigned
30
- ue .getUnderlyingType ( ) .( IntegralType ) .isUnsigned ( ) and
31
- // ue may be converted to zero or more strictly larger possibly signed types
32
- // before it is fully converted
33
- forall ( Expr following | following = ue .getConversion + ( ) |
34
- following .getType ( ) .getSize ( ) > ue .getType ( ) .getSize ( )
35
- )
43
+ lookForUnsignedAt ( this , ue ) and
44
+ ue .getUnderlyingType ( ) .( IntegralType ) .isUnsigned ( )
36
45
)
37
46
}
38
47
}
0 commit comments