@@ -123,6 +123,7 @@ let check_exist_ret f =
123123
124124let 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
382373let 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