diff --git a/cmd/tools/fuzz/fuzz.sh b/cmd/tools/fuzz/fuzz.sh new file mode 100644 index 0000000000..cbba7d722f --- /dev/null +++ b/cmd/tools/fuzz/fuzz.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +cores=$(nproc --all) + +echo Number of cores: $cores +echo Compiling... +./v -cc clang -o cmd/tools/fuzz/map_fuzz cmd/tools/fuzz/map_fuzz.v -prod -cflags "-fsanitize=memory" + +echo Fuzzing: +while true +do + for ((i=1;i<=cores;++i)) + do + sleep 0.001 + ./cmd/tools/fuzz/map_fuzz & + done + wait +done diff --git a/cmd/tools/fuzz/map_fuzz.v b/cmd/tools/fuzz/map_fuzz.v new file mode 100644 index 0000000000..f1c62f2d56 --- /dev/null +++ b/cmd/tools/fuzz/map_fuzz.v @@ -0,0 +1,144 @@ +import rand +import time + +fn generate_strings(str_len int, arr_len int) []string { + mut arr := []string{len: arr_len} + for i in 0 .. arr_len { + arr[i] = rand.string(str_len) + } + return arr +} + +fn fuzz1() { + amount := 200000 - rand.intn(100000) + amount2 := 200000 - rand.intn(100000) + len := 25 - rand.intn(10) + arr := generate_strings(len, amount) + arr2 := generate_strings(len, amount2) + mut m := map[string]int{} + for i in 0 .. amount { + m[arr[i]] = i + assert i == m[arr[i]] + } + for i in 0 .. amount { + assert i == m[arr[i]] + } + for i in 0 .. amount2 { + assert 0 == m[arr2[i]] + } + unsafe { + m.free() + arr.free() + } +} + +fn fuzz2() { + mut m := map[string]int{} + amount := rand.intn(500000) + 1 + len := 25 - rand.intn(10) + arr := generate_strings(len, amount) + for i, x in arr { + m[x] = i + } + mut i := 0 + for key, val in m { + assert key == arr[i] + assert val == i + i++ + } + unsafe { + m.free() + arr.free() + } +} + +fn fuzz3() { + mut m := map[string]int{} + amount := rand.intn(500000) + 1 + len := 25 - rand.intn(10) + arr := generate_strings(len, amount) + for i, x in arr { + if (i % 10000) == 0 { + keys := m.keys() + assert keys.len == i + assert keys == arr[0..i] + } + m[x] = i + } + assert m.keys() == arr + assert m.keys().len == amount + unsafe { + m.free() + arr.free() + } +} + +fn fuzz4() { + amount := rand.intn(500000) + len := 25 - rand.intn(10) + arr := generate_strings(len, amount) + mut m := map[string]int{} + for i in 0 .. amount { + m[arr[i]] = i + } + for i in 0 .. amount { + m.delete(arr[i]) + assert m[arr[i]] == 0 + } + assert m.len == 0 + unsafe { + m.free() + arr.free() + } +} + +fn fuzz5() { + amount := rand.intn(500000) + 1 + arr := generate_strings(20, amount) + mut m := map[string]int{} + for i in 0 .. amount { + m[arr[i]] = i + assert (arr[i] in m) == true + } + for i in 0 .. amount { + m.delete(arr[i]) + assert (arr[i] !in m) == true + assert m.len == amount - i - 1 + } + assert m.len == 0 + unsafe { + m.free() + arr.free() + } +} + +fn fuzz6() { + mut m := map[string]int{} + amount := rand.intn(500000) + 1 + len := 25 - rand.intn(10) + arr := generate_strings(len, amount) + for i, x in arr { + m[x]++ + m[x] += i + assert m[x] == i + 1 + } + for i, x in arr { + assert m[x] == i + 1 + } + unsafe { + m.free() + arr.free() + } +} + +fn main() { + seed := u32(time.ticks()) + println('seed: $seed.hex()') + rand.seed([seed, seed]) + fuzz1() + fuzz2() + fuzz3() + fuzz4() + fuzz5() + fuzz6() +}