Skip to content

Commit 7da80f2

Browse files
committed
[Fuzzer] refactor
1 parent 887d27c commit 7da80f2

File tree

1 file changed

+43
-48
lines changed

1 file changed

+43
-48
lines changed

src/fuzzer.ml

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -64,74 +64,69 @@ let evaluate_mutant parent_llm llm importants covset node_tbl distance_map =
6464
if interesting then Some new_seed else None
6565
| Assert _ -> None
6666

67+
let change_suffix filename suffix =
68+
let base = Filename.chop_suffix filename (Filename.extension filename) in
69+
base ^ suffix
70+
6771
let mutate_seed llctx llset seed =
6872
let muts = !Config.muts_dir in
69-
let seed_filename =
73+
let seedfile =
7074
ALlvm.save_ll muts (F.sprintf "id:%010d.ll" (ALlvm.hash_llm seed)) seed
7175
in
72-
let mut_filename =
73-
Filename.chop_suffix seed_filename ".ll" ^ ".mut.ll" |> Filename.basename
74-
in
75-
let mutated_filename =
76-
Filename.chop_suffix seed_filename ".ll" ^ ".mutated"
77-
in
76+
let mutant_file = change_suffix seedfile ".mut.ll" |> Filename.basename in
77+
let mut_parts = change_suffix seedfile ".mutated" in
7878
let llmutate_args =
7979
if !Config.mutation = Config.FuzzingMode.Uniform then
80-
[
81-
"llmutate"; seed_filename; muts; mut_filename; "-no-focus"; ">> log.txt";
82-
]
83-
else [ "llmutate"; seed_filename; muts; mut_filename; ">> log.txt" ]
80+
[ "llmutate"; seedfile; muts; mutant_file; "-no-focus"; ">> log.txt" ]
81+
else [ "llmutate"; seedfile; muts; mutant_file; ">> log.txt" ]
8482
in
8583

8684
AUtil.cmd llmutate_args |> ignore;
8785

88-
let mutant = ALlvm.read_ll llctx (Filename.concat muts mut_filename) in
86+
let mutant = ALlvm.read_ll llctx (Filename.concat muts mutant_file) in
8987
match mutant with
88+
| Ok mutant when ALlvm.LLModuleSet.mem llset mutant -> None
9089
| Ok mutant ->
91-
if ALlvm.LLModuleSet.mem llset mutant then None
92-
else
93-
let importants =
94-
In_channel.with_open_text mutated_filename In_channel.input_all
95-
in
96-
Some (mutant, importants)
90+
let importants =
91+
In_channel.with_open_text mut_parts In_channel.input_all
92+
in
93+
Some (mutant, importants)
9794
| Error _ -> None
9895

9996
let update_progress progress seed =
10097
let cov_set = Seedpool.Seed.edge_cov seed in
10198
progress |> Progress.add_cov cov_set |> Progress.inc_gen
10299

103-
let run seed_pool node_tbl distmap llctx llset progress =
104-
(* generate and deduplicate seeds *)
105-
let mutator = mutate_seed llctx llset in
106-
107-
let rec generate_mutant energy llm (progress : Progress.t) =
108-
if energy = 0 then None
100+
let rec try_gen_mutant mutator node_tbl distmap energy llm (prog : Progress.t) =
101+
if energy = 0 then None
102+
else
103+
match mutator llm with
104+
| Some (mutant, importants) -> (
105+
match
106+
evaluate_mutant llm mutant importants prog.cov_sofar node_tbl distmap
107+
with
108+
| Some new_seed -> Some new_seed
109+
| None ->
110+
try_gen_mutant mutator node_tbl distmap (energy - 1) mutant prog)
111+
| None -> try_gen_mutant mutator node_tbl distmap (energy - 1) llm prog
112+
113+
let gen_mutants mutator node_tbl distmap energy llm pool progress =
114+
let rec aux times pool progress =
115+
if times = 0 then (pool, progress)
109116
else
110-
match mutator llm with
111-
| Some (mutated_llm, importants) -> (
112-
match
113-
evaluate_mutant llm mutated_llm importants progress.cov_sofar
114-
node_tbl distmap
115-
with
116-
| Some new_seed -> Some new_seed
117-
| None -> generate_mutant (energy - 1) mutated_llm progress)
118-
| None -> generate_mutant (energy - 1) llm progress
117+
match try_gen_mutant mutator node_tbl distmap energy llm progress with
118+
| Some new_seed ->
119+
let new_progress = update_progress progress new_seed in
120+
Seedpool.save ~parent:(ALlvm.hash_llm llm) new_seed;
121+
let new_pool = Seedpool.push new_seed pool in
122+
aux (times - 1) new_pool new_progress
123+
| None -> aux (times - 1) pool progress
119124
in
125+
aux energy pool progress
120126

121-
let generate_interesting_mutants energy llm pool progress =
122-
let rec aux times pool progress =
123-
if times = 0 then (pool, progress)
124-
else
125-
match generate_mutant energy llm progress with
126-
| Some new_seed ->
127-
let new_progress = update_progress progress new_seed in
128-
Seedpool.save ~parent:(ALlvm.hash_llm llm) new_seed;
129-
let new_pool = Seedpool.push new_seed pool in
130-
aux (times - 1) new_pool new_progress
131-
| None -> aux (times - 1) pool progress
132-
in
133-
aux energy pool progress
134-
in
127+
let run seed_pool node_tbl distmap llctx llset progress =
128+
(* generate and deduplicate seeds *)
129+
let mutator = mutate_seed llctx llset in
135130

136131
let rec campaign pool (progress : Progress.t) =
137132
let seed, pool_popped = Seedpool.pop pool in
@@ -146,7 +141,7 @@ let run seed_pool node_tbl distmap llctx llset progress =
146141
assert (energy >= 0);
147142

148143
let new_pool, new_progress =
149-
generate_interesting_mutants energy llm pool_popped progress
144+
gen_mutants mutator node_tbl distmap energy llm pool_popped progress
150145
in
151146

152147
campaign (Seedpool.push seed new_pool) new_progress

0 commit comments

Comments
 (0)