Skip to content

Commit b9dfeb3

Browse files
authored
Merge pull request #14444 from alexet/range-cases
CPP: Add some range analysis cases
2 parents e75562e + 11152de commit b9dfeb3

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)