aboutsummaryrefslogtreecommitdiffstats
path: root/executor/test.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-06-04 12:55:40 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-06-24 09:57:34 +0000
commit90d67044dab68568e8f35bc14b68055dbd166eff (patch)
treed460a83eafdb63342da8ec992f2d78dbff5403a0 /executor/test.h
parent6ac2b94a701ded60e4782530bd9f209513acb324 (diff)
executor: refactor coverage filter
Diffstat (limited to 'executor/test.h')
-rw-r--r--executor/test.h97
1 files changed, 71 insertions, 26 deletions
diff --git a/executor/test.h b/executor/test.h
index bb1291f97..c49459033 100644
--- a/executor/test.h
+++ b/executor/test.h
@@ -201,37 +201,82 @@ static int test_csum_inet_acc()
return 0;
}
-static int test_coverage_filter()
+static int test_cover_filter()
{
- struct tmp_cov_filter_t {
- uint64 pcstart;
- uint64 pcsize;
- uint8 bitmap[((0x1000 >> 4) + 7) / 8];
+ char* tmp = tempnam(nullptr, "syz-test-cover-filter");
+ CoverFilter filter(tmp);
+ CoverFilter child(filter.FD());
+ free(tmp);
+
+ std::vector<uint64> pcs = {
+ 100,
+ 111,
+ 200,
+ (1 << 20) - 1,
+ 1 << 20,
+ (1 << 30) - 1,
+ 100ull << 30,
+ (100ull << 30) + 100,
+ 200ull << 30,
+ (1ull << 62) + 100,
};
- static struct tmp_cov_filter_t tmp_cov_filter;
- tmp_cov_filter.pcstart = 0xffffffff81000000;
- tmp_cov_filter.pcsize = 0x1000;
- cov_filter = (cov_filter_t*)&tmp_cov_filter;
- flag_coverage_filter = true;
- uint64 enable_pc = 0xffffffff81000765;
- uint64 disable_pc = 0xffffffff81000627;
- uint64 out_pc = 0xffffffff82000000;
+ // These we don't insert, but they are also present due to truncation of low 3 bits.
+ std::vector<uint64> also_contain = {
+ 96,
+ 103,
+ 104,
+ 207,
+ (1 << 20) - 7,
+ (1 << 20) + 7,
+ (1ull << 62) + 96,
+ (1ull << 62) + 103,
+ };
- uint32 idx = ((enable_pc - cov_filter->pcstart) >> 4) / 8;
- uint32 shift = ((enable_pc - cov_filter->pcstart) >> 4) % 8;
- cov_filter->bitmap[idx] |= (1 << shift);
+ std::vector<uint64> dont_contain = {
+ 0,
+ 1,
+ 95,
+ 112,
+ 199,
+ 208,
+ 100 << 10,
+ (1 << 20) - 9,
+ (1 << 20) + 8,
+ (2ull << 30) - 1,
+ 2ull << 30,
+ (2ull << 30) + 1,
+ (100ull << 30) + 108,
+ 150ull << 30,
+ 1ull << 40,
+ 1ull << 63,
+ ~0ull,
+ };
- if (!coverage_filter(enable_pc))
- return 1;
- if (coverage_filter(disable_pc))
- return 1;
- if (coverage_filter(out_pc))
- return 1;
+ int ret = 0;
+ for (auto pc : pcs)
+ filter.Insert(pc);
+ pcs.insert(pcs.end(), also_contain.begin(), also_contain.end());
+ for (auto pc : pcs) {
+ if (!filter.Contains(pc) || !child.Contains(pc)) {
+ printf("filter doesn't contain %llu (0x%llx)\n", pc, pc);
+ ret = 1;
+ }
+ }
+ for (auto pc : dont_contain) {
+ if (filter.Contains(pc) || child.Contains(pc)) {
+ printf("filter contains %llu (0x%llx)\n", pc, pc);
+ ret = 1;
+ }
+ }
- cov_filter = NULL;
- flag_coverage_filter = false;
- return 0;
+ filter.Remove(105);
+ if (filter.Contains(104) || filter.Contains(105) || filter.Contains(111))
+ printf("filter contains 105 after removal\n");
+ if (!filter.Contains(103))
+ printf("filter doesn't contains 103 after 105 removal\n");
+
+ return ret;
}
static struct {
@@ -244,7 +289,7 @@ static struct {
#if GOOS_linux && (GOARCH_amd64 || GOARCH_ppc64 || GOARCH_ppc64le)
{"test_kvm", test_kvm},
#endif
- {"test_coverage_filter", test_coverage_filter},
+ {"test_cover_filter", test_cover_filter},
};
static int run_tests(const char* test)