@@ -1028,4 +1028,75 @@ void test_negate_signed(int s) {
1028
1028
if (10 < s && s < 20 ) {
1029
1029
range<int >(-s); // $ range=<=-11 range=>=-19
1030
1030
}
1031
- }
1031
+ }
1032
+
1033
+ // By setting the guard after the use in another guard we
1034
+ // don't get the useful information
1035
+ void test_guard_after_use (int pos, int size, int offset) {
1036
+ if (pos + offset >= size) { // $ overflow=+-
1037
+ return ;
1038
+ }
1039
+ if (offset != 1 ) {
1040
+ return ;
1041
+ }
1042
+ range (pos + 1 ); // $ overflow=+ range="==InitializeParameter: pos+1" MISSING: range="<=InitializeParameter: size-1"
1043
+ }
1044
+
1045
+ int cond ();
1046
+
1047
+
1048
+ // This is basically what we get when we have a loop that calls
1049
+ // realloc in some iterations
1050
+ void alloc_in_loop (int origLen) {
1051
+ if (origLen <= 10 ) {
1052
+ return ;
1053
+ }
1054
+ int len = origLen;
1055
+ int index = 0 ;
1056
+ while (cond ()) {
1057
+ if (index == len) {
1058
+ if (len >= 1000 ) {
1059
+ return ;
1060
+ }
1061
+ len = len * 2 ; // $ overflow=-
1062
+ }
1063
+ // We want that index < len
1064
+ range (index); // $ MISSING: range="<=InitializeParameter: len-1"
1065
+ index++;
1066
+ }
1067
+ }
1068
+
1069
+ // This came from a case where it handled the leftovers before an unrolled loop
1070
+ void mask_at_start (int len) {
1071
+ if (len < 0 ) {
1072
+ return ;
1073
+ }
1074
+ int leftOver = len & 63 ;
1075
+ for (int i = 0 ; i < leftOver; i++) {
1076
+ range (i); // $ range=<=62 range=>=0 range="<=Store: ... & ... | Store: leftOver-1" range="<=InitializeParameter: len-1"
1077
+ }
1078
+ // Do something with leftOver
1079
+ for (int index = leftOver; index < len; index+=64 ) {
1080
+ range (index); // $ range="<=InitializeParameter: len-1"
1081
+ // This should be in bounds
1082
+ range (index + 16 ); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" MISSING: range="<=InitializeParameter: len-1"
1083
+ }
1084
+ }
1085
+
1086
+
1087
+ // Same as above but with modulo
1088
+ void mod_at_start (int len) {
1089
+ if (len < 0 ) {
1090
+ return ;
1091
+ }
1092
+ int leftOver = len % 64 ;
1093
+ for (int i = 0 ; i < leftOver; i++) {
1094
+ range (i); // $ range=<=62 range=>=0 range="<=Store: ... % ... | Store: leftOver-1" range="<=InitializeParameter: len-1"
1095
+ }
1096
+ // Do something with leftOver
1097
+ for (int index = leftOver; index < len; index+=64 ) {
1098
+ range (index); // $ range="<=InitializeParameter: len-1"
1099
+ // This should be in bounds
1100
+ range (index + 16 ); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" MISSING: range="<=InitializeParameter: len-49"
1101
+ }
1102
+ }
0 commit comments