@@ -73,6 +73,7 @@ import experimental.semmle.code.cpp.semantic.SemanticCFG
73
73
import experimental.semmle.code.cpp.semantic.SemanticType
74
74
import experimental.semmle.code.cpp.semantic.SemanticOpcode
75
75
private import ConstantAnalysis
76
+ private import Sign
76
77
import experimental.semmle.code.cpp.semantic.SemanticLocation
77
78
78
79
/**
@@ -248,8 +249,9 @@ signature module OverflowSig<DeltaSig D> {
248
249
}
249
250
250
251
module RangeStage<
251
- DeltaSig D, BoundSig< D > Bounds, OverflowSig< D > OverflowParam, LangSig< D > LangParam,
252
- UtilSig< D > UtilParam> {
252
+ DeltaSig D, BoundSig< D > Bounds, OverflowSig< D > OverflowParam, LangSig< D > LangParam,
253
+ UtilSig< D > UtilParam>
254
+ {
253
255
private import Bounds
254
256
private import LangParam
255
257
private import UtilParam
@@ -932,35 +934,70 @@ UtilSig<D> UtilParam> {
932
934
933
935
predicate bounded (
934
936
SemExpr e , SemBound b , D:: Delta delta , boolean upper , boolean fromBackEdge , D:: Delta origdelta ,
935
- SemReason reason ) {
936
- initialBounded ( e , b , delta , upper , fromBackEdge , origdelta , reason ) and
937
- (
938
- semExprDoesntOverflow ( upper .booleanNot ( ) , e )
939
- or
940
- not potentiallyOverflowingExpr ( upper .booleanNot ( ) , e )
941
- )
937
+ SemReason reason
938
+ ) {
939
+ initialBounded ( e , b , delta , upper , fromBackEdge , origdelta , reason ) and
940
+ (
941
+ semExprDoesntOverflow ( upper .booleanNot ( ) , e )
942
+ or
943
+ not potentiallyOverflowingExpr ( upper .booleanNot ( ) , e )
944
+ )
942
945
}
943
946
944
947
predicate potentiallyOverflowingExpr ( boolean positively , SemExpr expr ) {
945
- positively in [ true , false ] and
946
948
(
947
949
expr .getOpcode ( ) instanceof Opcode:: Add or
948
- expr .getOpcode ( ) instanceof Opcode:: PointerAdd or
950
+ expr .getOpcode ( ) instanceof Opcode:: PointerAdd
951
+ ) and
952
+ (
953
+ positively = true and
954
+ (
955
+ not semExprSign ( expr .( SemBinaryExpr ) .getLeftOperand ( ) ) = TPos ( )
956
+ or
957
+ not semExprSign ( expr .( SemBinaryExpr ) .getRightOperand ( ) ) = TPos ( )
958
+ )
959
+ or
960
+ positively = false and
961
+ (
962
+ not semExprSign ( expr .( SemBinaryExpr ) .getLeftOperand ( ) ) = TNeg ( )
963
+ or
964
+ not semExprSign ( expr .( SemBinaryExpr ) .getRightOperand ( ) ) = TNeg ( )
965
+ )
966
+ )
967
+ or
968
+ (
949
969
expr .getOpcode ( ) instanceof Opcode:: Sub or
950
- expr .getOpcode ( ) instanceof Opcode:: PointerSub or
970
+ expr .getOpcode ( ) instanceof Opcode:: PointerSub
971
+ ) and
972
+ (
973
+ positively = true and
974
+ (
975
+ not semExprSign ( expr .( SemBinaryExpr ) .getLeftOperand ( ) ) = TPos ( )
976
+ or
977
+ not semExprSign ( expr .( SemBinaryExpr ) .getRightOperand ( ) ) = TNeg ( )
978
+ )
979
+ or
980
+ positively = false and
981
+ (
982
+ not semExprSign ( expr .( SemBinaryExpr ) .getLeftOperand ( ) ) = TNeg ( )
983
+ or
984
+ not semExprSign ( expr .( SemBinaryExpr ) .getRightOperand ( ) ) = TPos ( )
985
+ )
986
+ )
987
+ or
988
+ positively in [ true , false ] and
989
+ (
951
990
expr .getOpcode ( ) instanceof Opcode:: Mul or
952
991
expr .getOpcode ( ) instanceof Opcode:: ShiftLeft
953
992
)
954
993
or
955
994
positively = false and
956
995
(
957
996
expr .getOpcode ( ) instanceof Opcode:: Negate or
958
- expr .getOpcode ( ) instanceof Opcode:: SubOne
997
+ expr .getOpcode ( ) instanceof Opcode:: SubOne or
998
+ expr .( SemDivExpr ) .getSemType ( ) instanceof SemFloatingPointType
959
999
)
960
1000
or
961
- positively = false and
962
- expr .( SemDivExpr ) .getSemType ( ) instanceof SemFloatingPointType
963
- or
964
1001
positively = true and
965
1002
expr .getOpcode ( ) instanceof Opcode:: AddOne
966
1003
}
0 commit comments