Skip to content

Commit 98f71d6

Browse files
committed
[Fuzzer] refactor
1 parent efe90a8 commit 98f71d6

File tree

3 files changed

+52
-68
lines changed

3 files changed

+52
-68
lines changed

src/coverage.ml

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,7 @@ end
5656
module EdgeCoverage = struct
5757
include Set.Make (IntInt)
5858

59-
let of_traces traces =
60-
traces
61-
|> List.map AUtil.pairs
62-
|> List.map of_list
63-
|> List.fold_left union empty
59+
let of_trace (trace : int list) = of_list (AUtil.pairs trace)
6460

6561
let read file =
6662
let open AUtil in
@@ -439,7 +435,7 @@ module DistanceTable = struct
439435
|> map harmonic_avg
440436
end
441437

442-
let sliced_cfg_node_of_addr node_tbl distmap addr =
438+
let node_of_addr node_tbl distmap addr =
443439
match AddrToNode.find_opt node_tbl addr with
444440
| None -> None (* in CFG of a function other than the target function *)
445441
| Some node -> if DistanceTable.mem node distmap then Some node else None
@@ -455,37 +451,23 @@ module CfgDistance = struct
455451
type t = float
456452

457453
(** computes distance of a trace *)
458-
let distance_score (traces : BlockTrace.t list) node_tbl distmap =
459-
let nodes_in_trace =
460-
traces
461-
|> List.flatten
462-
|> List.sort_uniq compare
463-
|> List.filter_map (sliced_cfg_node_of_addr node_tbl distmap)
464-
in
465-
let dist_sum : float =
466-
nodes_in_trace
467-
|> List.fold_left
468-
(fun sum node ->
469-
let dist = DistanceTable.find_opt node distmap in
470-
match dist with None -> sum | Some dist -> sum +. dist)
471-
0.0
472-
in
473-
(* let min_dist =
474-
nodes_in_trace
475-
|> List.filter_map (fun node -> Cfg.NodeMap.find_opt node distmap)
476-
|> List.fold_left (fun accu dist -> Float.min accu dist) 65535.0
477-
in *)
478-
if nodes_in_trace = [] then 65535.0
454+
let distance_score (trace : BlockTrace.t) node_tbl distmap =
455+
let nodes = trace |> List.filter_map (node_of_addr node_tbl distmap) in
456+
if nodes = [] then 65535.0
479457
else
480-
let size = List.length nodes_in_trace |> float_of_int in
481-
dist_sum /. size
482-
483-
let get_cover (traces : BlockTrace.t list) node_tbl distmap =
484-
traces
485-
|> List.exists
486-
(List.exists (fun addr ->
487-
let node = AddrToNode.find_opt node_tbl addr in
488-
match node with
489-
| None -> false
490-
| Some node -> DistanceTable.find_opt node distmap = Some 0.0))
458+
let dist_sum : float =
459+
nodes
460+
|> List.filter_map (fun node -> DistanceTable.find_opt node distmap)
461+
|> List.fold_left (fun sum dist -> sum +. dist) 0.0
462+
in
463+
let size = List.length nodes in
464+
dist_sum /. float_of_int size
465+
466+
let get_cover (trace : BlockTrace.t) node_tbl distmap =
467+
trace
468+
|> List.exists (fun addr ->
469+
let node = AddrToNode.find_opt node_tbl addr in
470+
match node with
471+
| None -> false
472+
| Some node -> DistanceTable.find_opt node distmap = Some 0.0)
491473
end

src/fuzzer.ml

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,35 +31,37 @@ let measure_optimizer_coverage llm =
3131
AUtil.clean optimized_ir_filename;
3232
(optimization_res, validation_res)
3333

34-
let evaluate_mutant parent_llm llm importants covset node_tbl distance_map =
34+
let is_in_slice addr node_tbl distmap =
35+
if !Config.coverage = Config.FuzzingMode.Sliced_cfg then
36+
Coverage.node_of_addr node_tbl distmap addr |> Option.is_some
37+
else true
38+
39+
let log_new_points new_points =
40+
if Coverage.EdgeCoverage.is_empty new_points then
41+
L.debug "No new coverage points"
42+
else L.debug "New coverage points"
43+
44+
let save_covering_mutant parent_llm seed =
45+
if seed.Seedpool.CfgSeed.covers then
46+
let seed_name =
47+
Seedpool.Seed.name ~parent:(ALlvm.hash_llm parent_llm) seed
48+
in
49+
ALlvm.save_ll !Config.covers_dir seed_name seed.llm |> ignore
50+
51+
let evaluate_mutant parent_llm llm importants covset node_tbl distmap =
3552
let optim_res, _ = measure_optimizer_coverage llm in
3653
L.debug "Mutant: ";
3754
L.debug "%s" (ALlvm.string_of_llmodule llm);
3855
match optim_res with
3956
| Error _ -> None
4057
| Ok lines ->
41-
let in_slice =
42-
match !Config.coverage with
43-
| Config.FuzzingMode.Sliced_cfg ->
44-
fun addr ->
45-
Coverage.sliced_cfg_node_of_addr node_tbl distance_map addr
46-
|> Option.is_some
47-
| _ -> fun _ -> true
48-
in
49-
let trace = lines |> List.map int_of_string |> List.filter in_slice in
58+
let is_in_slice addr = is_in_slice addr node_tbl distmap in
59+
let trace = lines |> List.map int_of_string |> List.filter is_in_slice in
5060
let cov = trace |> AUtil.pairs |> Coverage.EdgeCoverage.of_list in
5161
let new_points = Coverage.EdgeCoverage.diff cov covset in
52-
if Coverage.EdgeCoverage.is_empty new_points then
53-
prerr_endline "No new coverage points"
54-
else prerr_endline "New coverage points";
55-
let (new_seed : Seedpool.Seed.t) =
56-
Seedpool.Seed.make llm [ trace ] importants node_tbl distance_map
57-
in
58-
(if new_seed.covers then
59-
let seed_name =
60-
Seedpool.Seed.name ~parent:(ALlvm.hash_llm parent_llm) new_seed
61-
in
62-
ALlvm.save_ll !Config.covers_dir seed_name llm |> ignore);
62+
log_new_points new_points;
63+
let new_seed = Seedpool.Seed.make llm trace importants node_tbl distmap in
64+
save_covering_mutant parent_llm new_seed;
6365
let interesting = not (Coverage.EdgeCoverage.is_empty new_points) in
6466
if interesting then Some new_seed else None
6567
| Assert _ -> None
@@ -97,13 +99,14 @@ let update_progress progress seed =
9799
let cov_set = Seedpool.Seed.edge_cov seed in
98100
progress |> Progress.add_cov cov_set |> Progress.inc_gen
99101

100-
let rec try_gen_mutant mutator node_tbl distmap energy llm (prog : Progress.t) =
102+
let rec try_gen_mutant mutator node_tbl distmap energy llm prog =
101103
if energy = 0 then None
102104
else
103105
match mutator llm with
104106
| Some (mutant, importants) -> (
105107
match
106-
evaluate_mutant llm mutant importants prog.cov_sofar node_tbl distmap
108+
evaluate_mutant llm mutant importants prog.Progress.cov_sofar node_tbl
109+
distmap
107110
with
108111
| Some new_seed -> Some new_seed
109112
| None ->

src/seedpool.ml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,14 @@ module CfgSeed = struct
3232
importants : string;
3333
}
3434

35-
let make llm (traces : Coverage.BlockTrace.t list) importants node_tbl distmap
36-
=
37-
let score = Distance.distance_score traces node_tbl distmap in
38-
let covers = Distance.get_cover traces node_tbl distmap in
35+
let make llm (trace : Coverage.BlockTrace.t) importants node_tbl distmap =
36+
let score = Distance.distance_score trace node_tbl distmap in
37+
let covers = Distance.get_cover trace node_tbl distmap in
3938
{
4039
llm;
4140
score;
4241
covers;
43-
edge_cov = Coverage.EdgeCoverage.of_traces traces;
42+
edge_cov = Coverage.EdgeCoverage.of_trace trace;
4443
importants;
4544
}
4645

@@ -285,7 +284,7 @@ let can_optimize seedfile node_tbl distmap =
285284
| Config.FuzzingMode.Sliced_cfg ->
286285
fun line ->
287286
int_of_string line
288-
|> Coverage.sliced_cfg_node_of_addr node_tbl distmap
287+
|> Coverage.node_of_addr node_tbl distmap
289288
|> Option.is_some
290289
| _ -> fun _ -> true
291290
in
@@ -441,7 +440,7 @@ let make llctx node_tbl (distmap : float Coverage.DistanceTable.t) =
441440
| Error _ -> None
442441
| Ok llm ->
443442
if check_llm_for_mutation llm then (
444-
let cov = [ lines |> List.map int_of_string ] in
443+
let cov = lines |> List.map int_of_string in
445444
let llm = add_dummy_params llm in
446445
L.debug "filtered seeds: %s" (ALlvm.string_of_llmodule llm);
447446
seed_count := !seed_count + 1;

0 commit comments

Comments
 (0)