From 3ac3169278c836c067ac9add0b3a6e05de9af899 Mon Sep 17 00:00:00 2001 From: Alex Eyers-Taylor Date: Tue, 10 Oct 2023 19:38:40 +0100 Subject: [PATCH 1/3] CPP: Add some range analysis cases --- .../SimpleRangeAnalysis_tests.cpp | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp index 825e02b8616..9338ed51239 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp +++ b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp @@ -1028,4 +1028,75 @@ void test_negate_signed(int s) { if(10 < s && s < 20) { range(-s); // $ range=<=-11 range=>=-19 } -} \ No newline at end of file +} + +// By setting the guard after the use in another guard we +// don't get the useful information +void test_guard_after_use(int pos, int size, int offset) { + if (pos + offset >= size) { // $ overflow=+- + return; + } + if (offset == 1) { + return; + } + range(pos + 1); // $ overflow=+ range="==InitializeParameter: pos+1" +} + +int cond(); + + +// This is basically what we get when we have a loop that calls +// realloc in some iterations +void alloc_in_loop(int origLen) { + if (origLen <= 10) { + return; + } + int len = origLen; + int index = 0; + while (cond()) { + if (index == len) { + if (len >= 1000) { + return; + } + len = len * 2; // $ overflow=- + } + // We want that index <= len + range(index); + index++; + } +} + +// This came from a case where it handled the leftovers before an unrolled loop +void mask_at_start(int len) { + if (len < 0) { + return; + } + int leftOver = len & 63; + for (int i = 0; i < leftOver; i++) { + range(i); // $ range=<=62 range=>=0 range="<=Store: ... & ... | Store: leftOver-1" range="<=InitializeParameter: len-1" + } + // Do something with leftOver + for (int index = leftOver; index < len; index+=64) { + range(index); // $ range="<=InitializeParameter: len-1" + // This should be in bounds + range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" + } +} + + +// Same as above but with modulo +void mod_at_start(int len) { + if (len < 0) { + return; + } + int leftOver = len % 64; + for (int i = 0; i < leftOver; i++) { + range(i); // $ range=<=62 range=>=0 range="<=Store: ... % ... | Store: leftOver-1" range="<=InitializeParameter: len-1" + } + // Do something with leftOver + for (int index = leftOver; index < len; index+=64) { + range(index); // $ range="<=InitializeParameter: len-1" + // This should be in bounds + range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" + } +} From fb0f9ec6014299ed00e3b6ec20fb28b114d6db0a Mon Sep 17 00:00:00 2001 From: Alex Eyers-Taylor Date: Mon, 30 Oct 2023 14:17:03 +0000 Subject: [PATCH 2/3] CPP: Add missing rnage analysis ranges in test. --- .../ir/range-analysis/SimpleRangeAnalysis_tests.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp index 9338ed51239..469a90a74f0 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp +++ b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp @@ -1039,7 +1039,7 @@ void test_guard_after_use(int pos, int size, int offset) { if (offset == 1) { return; } - range(pos + 1); // $ overflow=+ range="==InitializeParameter: pos+1" + range(pos + 1); // $ overflow=+ range="==InitializeParameter: pos+1" MISSING: range="<=InitializeParameter: size-1" } int cond(); @@ -1060,8 +1060,8 @@ void alloc_in_loop(int origLen) { } len = len * 2; // $ overflow=- } - // We want that index <= len - range(index); + // We want that index < len + range(index); // $ MISSING: range="<=InitializeParameter: len-1" index++; } } @@ -1079,7 +1079,7 @@ void mask_at_start(int len) { for (int index = leftOver; index < len; index+=64) { range(index); // $ range="<=InitializeParameter: len-1" // This should be in bounds - range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" + range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" MISSING: range="<=InitializeParameter: len-1" } } @@ -1096,7 +1096,7 @@ void mod_at_start(int len) { // Do something with leftOver for (int index = leftOver; index < len; index+=64) { range(index); // $ range="<=InitializeParameter: len-1" - // This should be in bounds - range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" + // This should be in bounds + range(index + 16); // $ range="<=InitializeParameter: len+15" range="==Phi: index+16" MISSING: range="<=InitializeParameter: len-49" } } From 11152deeb5c7da05bebc49baba2383e7cdfe629a Mon Sep 17 00:00:00 2001 From: Alexander Eyers-Taylor Date: Tue, 31 Oct 2023 13:52:33 +0000 Subject: [PATCH 3/3] Update cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp Co-authored-by: Anders Schack-Mulligen --- .../ir/range-analysis/SimpleRangeAnalysis_tests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp index 469a90a74f0..a4ffdb76370 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp +++ b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp @@ -1036,7 +1036,7 @@ void test_guard_after_use(int pos, int size, int offset) { if (pos + offset >= size) { // $ overflow=+- return; } - if (offset == 1) { + if (offset != 1) { return; } range(pos + 1); // $ overflow=+ range="==InitializeParameter: pos+1" MISSING: range="<=InitializeParameter: size-1"