@@ -13,6 +13,7 @@ module TidSet = Set.Make(Tid)
13
13
14
14
module TidMap = Map. Make (Tid )
15
15
module VarMap = Map. Make (Var )
16
+ module VarSet = Set. Make (Var )
16
17
module TidTupleMap = Map. Make (struct type t = Tid. t * Tid. t [@@ deriving sexp, compare] end )
17
18
18
19
type varToVarMap = Var .t VarMap .t
@@ -296,11 +297,33 @@ let check_isomorphism
296
297
let blk2 = TidMap. find_exn tid_to_blk2 tid2 in
297
298
compare_blk_tid_only graph blk1 blk2)
298
299
299
- let rec get_isomorphism (candidate_map : TidSet.t TidMap.t ) (used_set : TidSet.t ) (node_stack : (blk term) list )
300
- (graph : Tid.t TidMap.t ) (tid_to_blk1 : (blk term) TidMap.t ) (tid_to_blk2 : (blk term) TidMap.t ): (Tid.t TidMap.t) option =
300
+ let merge_maps (merged_map : varToVarMap ) (new_map : varToVarMap ) : varToVarMap option =
301
+ let new_merged_map = VarMap. merge merged_map new_map
302
+ ~f: (fun ~key :_key v ->
303
+ match v with
304
+ | `Left v1 -> Some v1
305
+ | `Right v2 -> Some v2
306
+ | `Both (v1 , v2 ) -> if Var. equal v1 v2 then Some v1 else None )
307
+ in
308
+ let get_keys = (fun m -> VarMap. keys m |> VarSet. of_list) in
309
+ let expected_len = VarSet. union (get_keys merged_map) (get_keys new_map) |> VarSet. length in
310
+ let actual_len = VarMap. keys new_merged_map |> List. length in
311
+ match actual_len = expected_len with
312
+ false -> None
313
+ | true -> Some new_merged_map
314
+
315
+ let rec get_isomorphism
316
+ (candidate_map : TidSet.t TidMap.t ) (used_set : TidSet.t )
317
+ (node_stack : (blk term) list ) (graph : Tid.t TidMap.t )
318
+ (tid_to_blk1 : (blk term) TidMap.t ) (tid_to_blk2 : (blk term) TidMap.t )
319
+ (var_maps : varToVarMap TidTupleMap.t ) (merged_map : varToVarMap ) :
320
+ (Tid. t TidMap. t ) option =
301
321
let node = List. hd node_stack in
302
322
match node with
303
- | None -> if check_isomorphism graph tid_to_blk1 tid_to_blk2 then Some graph else None
323
+ | None ->
324
+ if check_isomorphism graph tid_to_blk1 tid_to_blk2
325
+ then Some graph
326
+ else None
304
327
| Some node ->
305
328
let tid = Term. tid node in
306
329
match TidMap. find candidate_map tid with
@@ -312,58 +335,41 @@ let rec get_isomorphism (candidate_map : TidSet.t TidMap.t) (used_set : TidSet.t
312
335
(* cannot be empty *)
313
336
let node_stack = List. tl_exn node_stack in
314
337
let graph = TidMap. update graph tid ~f: (fun _ -> tid_mapped_to) in
315
- get_isomorphism candidate_map used_set node_stack graph tid_to_blk1 tid_to_blk2)
338
+ (* TODO change this to a map lookup *)
339
+ TidTupleMap. find var_maps (tid, tid_mapped_to) >> =
340
+ fun new_map ->
341
+ merge_maps merged_map new_map >> =
342
+ fun merged_map ->
343
+ get_isomorphism candidate_map used_set node_stack
344
+ graph tid_to_blk1 tid_to_blk2 var_maps merged_map)
316
345
| None -> None
317
346
347
+ let get_length cfg : int =
348
+ let f = ( fun node acc ->
349
+ let lbl = get_label node in
350
+ let def_len = Term. enum def_t lbl |> Sequence. to_list |> List. length in
351
+ let jmp_len = Term. enum jmp_t lbl |> Sequence. to_list |> List. length in
352
+ acc + def_len + jmp_len
353
+ ) in
354
+ BFS. fold f 0 cfg
355
+
318
356
let exist_isomorphism (sub1 : Sub.t ) (sub2 : Sub.t ) : bool =
319
357
let cfg1, cfg2 = Sub. to_cfg sub1, Sub. to_cfg sub2 in
358
+ printf " \n LENGTH IS: %d\n " (get_length cfg1);
320
359
let tid_to_blk1, tid_to_blk2 = get_node_maps cfg1 cfg2 in
321
360
(* the variable mappings on a per-block basis are not actually used *)
322
- let tid_map, _var_maps = compare_blocks sub1 sub2 in
361
+ let tid_map, var_maps = compare_blocks sub1 sub2 in
362
+ let _ = printf " PERCENTAGE_IDENTICAL_BLOCKS_IS: %.4f\n " (((List. length (TidMap. keys tid_map)) |> float_of_int) /. ((List. length (TidMap. keys tid_to_blk1)) |> float_of_int)) in
323
363
(* List.iter (TidMap.keys tid_map) ~f:(fun key -> printf "TID MAP: %s\n" (Tid.to_string key)) ; *)
324
364
let used_set = TidSet. empty in
325
365
let node_stack = TidMap. data tid_to_blk1 in
326
366
let node2_stack = TidMap. data tid_to_blk2 in
327
367
let graph = TidMap. empty in
328
- printf " BLOCK LENGTH: %d" (List. length node_stack);
368
+ printf " BLOCK LENGTH: %d\n " (List. length node_stack);
329
369
(* short circuit if we already know that the length does not match *)
330
370
if (List. length node_stack) = (List. length node2_stack) then
331
- match get_isomorphism tid_map used_set node_stack graph tid_to_blk1 tid_to_blk2 with
371
+ match get_isomorphism tid_map used_set node_stack graph tid_to_blk1 tid_to_blk2 var_maps VarMap. empty with
332
372
| None -> false
333
- | Some _x -> true
373
+ | Some _x ->
374
+ printf " Blocks are syntactically equal! Not performing WP analysis.\n UNSAT!\n " ; true
334
375
else false
335
-
336
- (* let evaluator_overall node1 cur_res =
337
- * match cur_res with
338
- * | Some (seen_set, v_map, cfg2) ->
339
- * let inner_evaluator =
340
- * (fun (node2 : Bap.Std.Graphs.Ir.Node.t) (found_match, seen_set, v_map) ->
341
- * let blk2 = get_label node2 in
342
- * let tid2 = Term.tid blk2 in
343
- * match found_match with
344
- * | true -> true, seen_set, v_map
345
- * | false ->
346
- * (\* if already matched, then don't consider again *\)
347
- * if TidSet.exists seen_set ~f:(fun a -> a = tid2) then false, seen_set, v_map
348
- * (\* otherwise, perform comparison *\)
349
- * else
350
- * match compare_block (get_label node1) blk2 v_map with
351
- * | Some v_map_updated ->
352
- * true, TidSet.union seen_set (TidSet.singleton tid2), v_map_updated
353
- * | None -> false, seen_set, v_map) in
354
- * let r, s, m = BFS.fold inner_evaluator (false, seen_set, v_map) cfg2 in
355
- * if r then
356
- * Some (s, m, cfg2)
357
- * else None
358
- * | None -> None
359
- *
360
- * (\* performs the overarching comparison for exact syntactic equality between subs*\)
361
- * let cmp_overall (sub1 : Sub.t) (sub2 : Sub.t) : bool =
362
- * let cfg1, cfg2 = Sub.to_cfg sub1, Sub.to_cfg sub2 in
363
- * let seen_set = TidSet.empty in
364
- * let v_map = VarMap.empty in
365
- * let r = BFS.fold evaluator_overall (Some (seen_set, v_map, cfg2)) cfg1 in
366
- * match r with
367
- * | Some _ -> true
368
- * | None -> false *)
369
-
0 commit comments