@@ -1028,4 +1028,75 @@ void test_negate_signed(int s) {
10281028 if (10 < s && s < 20 ) {
10291029 range<int >(-s); // $ range=<=-11 range=>=-19
10301030 }
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