-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuzzer.rs
81 lines (67 loc) · 1.84 KB
/
fuzzer.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import state;
import state::extensions;
fn rand_map_char(r: rand::rng) -> char {
r.gen_char_from("#*\\\\.... ")
}
fn rand_flooding(r: rand::rng) -> int {
r.gen_uint_range(0u, 51u) as int // MAGIC
}
fn rand_waterproof(r: rand::rng) -> int {
r.gen_uint_range(0u, 51u) as int // MAGIC
}
fn rand_water(r: rand::rng, m: uint) -> uint {
r.gen_uint_range(0u, m + 1u)
}
fn rand_grid(r: rand::rng, m: uint, n: uint)
-> (state::grid, state::coord)
{
let mut s = "";
for n.times {
s += "#";
}
for (m - 2).times {
s += "\n#";
for (n - 2).times {
s += str::from_char(rand_map_char(r));
}
s += "#";
}
s += "\n";
for n.times {
s += "#";
}
let grid = copy state::read_board(io::str_reader(s)).grid;
let bot_x = r.gen_uint_range(1u, m - 1u);
let bot_y = r.gen_uint_range(1u, n - 1u);
let mut lift_x = bot_x;
let mut lift_y = bot_y;
while lift_x == bot_x && lift_y == bot_y {
lift_x = r.gen_uint_range(1u, m - 1u);
lift_y = r.gen_uint_range(1u, n - 1u);
}
grid.grid[bot_x][bot_y] = state::bot;
grid.grid[lift_x][lift_y] = state::lift_c;
(grid, (bot_x + 1, bot_y + 1)) // NIH MAGIC
}
fn gen_state(m: uint, n: uint) -> state::state {
let r = rand::rng();
let (grid, robotpos) = rand_grid(r, m, n);
let z = (0,0);
// TODO: implement trampoline fuzzing
// TODO: implement beard fuzzing
{flooding: rand_flooding(r),
waterproof: rand_waterproof(r),
target: ~[z, z, z, z, z, z, z, z, z, z],
trampoline: ~[z, z, z, z, z, z, z, z, z, z],
growth: 0,
grid: grid,
robotpos: robotpos,
water: rand_water(r, m),
nextflood: 0,
tramp_map: ~[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
underwater: 0,
razors: 0,
lambdas: 0,
lambdasleft: 0,
mut score: 0}
}