Skip to content

Commit ff5f87b

Browse files
committed
[Seedpool] refactor construct
1 parent ddb0a4e commit ff5f87b

File tree

1 file changed

+71
-80
lines changed

1 file changed

+71
-80
lines changed

src/seedpool.ml

Lines changed: 71 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ let check_exist_ret f =
123123

124124
let rec redef_fn llctx f_old wide instr =
125125
let extra_param = [| ALlvm.i32_type llctx; ALlvm.pointer_type llctx |] in
126+
let fmodule = ALlvm.global_parent f_old in
126127
let params_old = ALlvm.params f_old in
127128
let param_tys =
128129
Array.append (Array.map ALlvm.type_of params_old) extra_param
@@ -134,11 +135,8 @@ let rec redef_fn llctx f_old wide instr =
134135
if i = instr then true
135136
else if ALlvm.ChangeRetVal.check_target i then (
136137
let new_ret_ty = ALlvm.type_of i in
137-
let f_new =
138-
ALlvm.define_function ""
139-
(ALlvm.function_type new_ret_ty param_tys)
140-
(ALlvm.global_parent f_old)
141-
in
138+
let new_fty = ALlvm.function_type new_ret_ty param_tys in
139+
let f_new = ALlvm.define_function "" new_fty fmodule in
142140

143141
(* copy function with new return value (target).*)
144142
ALlvm.ChangeRetVal.copy_blocks llctx f_old f_new;
@@ -293,90 +291,83 @@ let save ?(parent : int option) (seed : Seed.t) =
293291
Printf.fprintf line "%s" seed.importants);
294292
ALlvm.save_ll !Config.corpus_dir seed_name llm |> ignore
295293

296-
let evaluate_seeds_and_construct_seedpool seeds node_tbl distmap =
294+
let is_optimuzz_base () =
295+
(* Optimuzz_Base *)
296+
!Config.score = Config.FuzzingMode.Constant
297+
&& !Config.coverage = Config.FuzzingMode.All_edges
298+
299+
let is_nondirected () = !Config.coverage = Config.FuzzingMode.All_edges
300+
301+
let log_seed seed =
302+
L.debug "evaluate seed: \n%s\n" (ALlvm.string_of_llmodule seed.Seed.llm);
303+
L.debug "score: %f" (Seed.score seed)
304+
305+
let classify_seeds node_tbl distmap raw_seeds =
306+
if is_nondirected () then
307+
List.fold_left
308+
(fun (cover_seeds, noncover_seeds) (_, llm, traces) ->
309+
let seed = Seed.make llm traces "" node_tbl distmap in
310+
log_seed seed;
311+
(cover_seeds, seed :: noncover_seeds))
312+
([], []) raw_seeds
313+
else
314+
List.fold_left
315+
(fun (cover_seeds, noncover_seeds) (_, llm, traces) ->
316+
let seed = Seed.make llm traces "" node_tbl distmap in
317+
log_seed seed;
318+
if Seed.covers seed then (seed :: cover_seeds, noncover_seeds)
319+
else (cover_seeds, seed :: noncover_seeds))
320+
([], []) raw_seeds
321+
322+
let hash_seed seed = ALlvm.hash_llm seed.Seed.llm
323+
let compare_hash a b = compare (hash_seed a) (hash_seed b)
324+
let compare_score a b = compare a.Seed.score b.Seed.score
325+
326+
let closest_seeds seeds =
327+
let unique_seeds = List.sort_uniq compare_hash seeds in
328+
let sorted_seeds =
329+
if !Config.score = Config.FuzzingMode.Constant then unique_seeds
330+
else
331+
unique_seeds
332+
|> List.sort (fun a b -> compare (Seed.score a) (Seed.score b))
333+
in
334+
let first_seeds =
335+
if !Config.coverage = Config.FuzzingMode.All_edges then sorted_seeds
336+
else List.take !Config.max_initial_seed sorted_seeds
337+
in
338+
first_seeds
339+
340+
let compute_init_cov seeds =
341+
let open Coverage in
342+
List.fold_left
343+
(fun accu seed -> EdgeCoverage.union accu seed.Seed.edge_cov)
344+
EdgeCoverage.empty seeds
345+
346+
let evaluate_seeds_and_construct_seedpool raw_seeds node_tbl distmap =
297347
let open AUtil in
348+
let open Coverage in
298349
let pool = create () in
299-
if
300-
(* Optimuzz_Base *)
301-
!Config.score = Config.FuzzingMode.Constant
302-
&& !Config.coverage = Config.FuzzingMode.All_edges
303-
then (
304-
let pools =
305-
List.fold_left
306-
(fun pools (_, llm, traces) ->
307-
let seed = Seed.make llm traces "" node_tbl distmap in
308-
L.debug "evaluate seed: \n%s\n" (ALlvm.string_of_llmodule llm);
309-
L.debug "score: %s" (string_of_float (Seed.score seed));
310-
seed :: pools)
311-
[] seeds
312-
in
313-
let init_cov =
314-
List.fold_left
315-
(fun accu seed -> Coverage.EdgeCoverage.union accu (Seed.edge_cov seed))
316-
Coverage.EdgeCoverage.empty pools
317-
in
318-
pools |> List.to_seq |> add_seq pool;
350+
if is_optimuzz_base () then (
351+
let _, seeds = classify_seeds node_tbl distmap raw_seeds in
352+
let init_cov = compute_init_cov seeds in
353+
seeds |> List.to_seq |> add_seq pool;
319354
(pool, init_cov))
320355
else
321-
let pool_covers, pool_noncovers =
322-
List.fold_left
323-
(fun (pool_covers, pool_noncovers) (_, llm, traces) ->
324-
let seed = Seed.make llm traces "" node_tbl distmap in
325-
L.debug "evaluate seed: \n%s\n" (ALlvm.string_of_llmodule llm);
326-
L.debug "score: %s" (string_of_float (Seed.score seed));
327-
(* will assume all-edges option to non-directed fuzzing *)
328-
if !Config.coverage = Config.FuzzingMode.All_edges then
329-
(pool_covers, seed :: pool_noncovers)
330-
else if Seed.covers seed then (seed :: pool_covers, pool_noncovers)
331-
else (pool_covers, seed :: pool_noncovers))
332-
([], []) seeds
356+
let cover_seeds, noncover_seeds =
357+
classify_seeds node_tbl distmap raw_seeds
333358
in
334-
if pool_covers = [] then (
359+
if cover_seeds = [] then (
335360
L.info "No covering seeds found. Using closest seeds.";
336-
let pool_closest =
337-
pool_noncovers
338-
|> List.sort_uniq (fun a b ->
339-
compare
340-
(ALlvm.hash_llm (Seed.llmodule a))
341-
(ALlvm.hash_llm (Seed.llmodule b)))
342-
in
343-
let pool_closest =
344-
if !Config.score = Config.FuzzingMode.Constant then pool_closest
345-
else
346-
pool_closest
347-
|> List.sort (fun a b -> compare (Seed.score a) (Seed.score b))
348-
in
349-
let pool_closest =
350-
(* will assume all-edges option to non-directed fuzzing *)
351-
if !Config.coverage = Config.FuzzingMode.All_edges then pool_closest
352-
else pool_closest |> take !Config.max_initial_seed
353-
in
354-
355-
let init_cov =
356-
List.fold_left
357-
(fun accu seed ->
358-
Coverage.EdgeCoverage.union accu (Seed.edge_cov seed))
359-
Coverage.EdgeCoverage.empty pool_closest
360-
in
361+
let pool_closest = closest_seeds noncover_seeds in
362+
let init_cov = compute_init_cov pool_closest in
361363
pool_closest |> List.to_seq |> add_seq pool;
362364
(pool, init_cov))
363365
else (
364366
(* if we have covering seeds, we use covering seeds only. *)
365367
L.info "Covering seeds found. Using them only.";
366-
let pool_covers =
367-
pool_covers
368-
|> List.sort_uniq (fun a b ->
369-
compare
370-
(ALlvm.hash_llm (Seed.llmodule a))
371-
(ALlvm.hash_llm (Seed.llmodule b)))
372-
in
373-
let init_cov =
374-
List.fold_left
375-
(fun accu seed ->
376-
Coverage.EdgeCoverage.union accu (Seed.edge_cov seed))
377-
Coverage.EdgeCoverage.empty pool_covers
378-
in
379-
pool_covers |> List.to_seq |> add_seq pool;
368+
let sorted_seeds = cover_seeds |> List.sort_uniq compare_score in
369+
let init_cov = compute_init_cov sorted_seeds in
370+
sorted_seeds |> List.to_seq |> add_seq pool;
380371
(pool, init_cov))
381372

382373
let make llctx node_tbl (distmap : float Coverage.DistanceTable.t) =
@@ -412,7 +403,7 @@ let make llctx node_tbl (distmap : float Coverage.DistanceTable.t) =
412403

413404
let seed_count = ref 0 in
414405

415-
let filter_seed seed =
406+
let preprocess_seed seed =
416407
let* path, lines = can_optimize seed node_tbl distmap in
417408
L.debug "filter seed: %s " path;
418409
match ALlvm.read_ll llctx path with
@@ -432,7 +423,7 @@ let make llctx node_tbl (distmap : float Coverage.DistanceTable.t) =
432423

433424
Array.to_list seed_files
434425
|> List.map (Filename.concat seed_dir)
435-
|> List.filter_map filter_seed
426+
|> List.filter_map preprocess_seed
436427
in
437428

438429
let pool = evaluate_seeds_and_construct_seedpool seeds node_tbl distmap in

0 commit comments

Comments
 (0)