|
|
@ -60,7 +60,6 @@ module Node = struct
|
|
|
|
let exn_sink_kind = Stmt_node "exceptions sink"
|
|
|
|
let exn_sink_kind = Stmt_node "exceptions sink"
|
|
|
|
let throw_kind = Stmt_node "throw"
|
|
|
|
let throw_kind = Stmt_node "throw"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type cfg = (** data type for the control flow graph *)
|
|
|
|
type cfg = (** data type for the control flow graph *)
|
|
|
|
{ node_id : int ref;
|
|
|
|
{ node_id : int ref;
|
|
|
|
node_list : t list ref;
|
|
|
|
node_list : t list ref;
|
|
|
@ -359,15 +358,26 @@ module Node = struct
|
|
|
|
(** Counter for identifiers of procdescs *)
|
|
|
|
(** Counter for identifiers of procdescs *)
|
|
|
|
let proc_desc_id_counter = ref 0
|
|
|
|
let proc_desc_id_counter = ref 0
|
|
|
|
|
|
|
|
|
|
|
|
let remove_node cfg node =
|
|
|
|
let remove_node' filter_out_fun cfg node =
|
|
|
|
let remove_node_in_cfg nodes =
|
|
|
|
let remove_node_in_cfg nodes =
|
|
|
|
list_filter (fun node' -> not (equal node node')) nodes in
|
|
|
|
list_filter filter_out_fun nodes in
|
|
|
|
cfg.node_list := remove_node_in_cfg !(cfg.node_list)
|
|
|
|
cfg.node_list := remove_node_in_cfg !(cfg.node_list)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let remove_node cfg node =
|
|
|
|
|
|
|
|
remove_node' (fun node' -> not (equal node node'))
|
|
|
|
|
|
|
|
cfg node
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let remove_node_set cfg nodes =
|
|
|
|
|
|
|
|
remove_node' (fun node' -> not (NodeSet.mem node' nodes))
|
|
|
|
|
|
|
|
cfg nodes
|
|
|
|
|
|
|
|
|
|
|
|
let proc_desc_remove cfg name remove_nodes =
|
|
|
|
let proc_desc_remove cfg name remove_nodes =
|
|
|
|
(if remove_nodes then
|
|
|
|
(if remove_nodes then
|
|
|
|
let pdesc = pdesc_tbl_find cfg name in
|
|
|
|
let pdesc = pdesc_tbl_find cfg name in
|
|
|
|
list_iter (remove_node cfg) pdesc.pd_nodes);
|
|
|
|
let proc_nodes =
|
|
|
|
|
|
|
|
list_fold_right (fun node set -> NodeSet.add node set)
|
|
|
|
|
|
|
|
pdesc.pd_nodes NodeSet.empty in
|
|
|
|
|
|
|
|
remove_node_set cfg proc_nodes);
|
|
|
|
pdesc_tbl_remove cfg name
|
|
|
|
pdesc_tbl_remove cfg name
|
|
|
|
|
|
|
|
|
|
|
|
let proc_desc_get_start_node proc_desc =
|
|
|
|
let proc_desc_get_start_node proc_desc =
|
|
|
@ -802,11 +812,12 @@ let remove_abducted_retvars p =
|
|
|
|
| Sil.Eexp (e, _) -> Sil.ExpSet.add e exps
|
|
|
|
| Sil.Eexp (e, _) -> Sil.ExpSet.add e exps
|
|
|
|
| Sil.Estruct (flds, _) ->
|
|
|
|
| Sil.Estruct (flds, _) ->
|
|
|
|
list_fold_left (fun exps (_, strexp) -> collect_exps exps strexp) exps flds
|
|
|
|
list_fold_left (fun exps (_, strexp) -> collect_exps exps strexp) exps flds
|
|
|
|
|
|
|
|
|
|
|
|
| Sil.Earray (_, elems, _) ->
|
|
|
|
| Sil.Earray (_, elems, _) ->
|
|
|
|
list_fold_left (fun exps (index, strexp) -> collect_exps exps strexp) exps elems in
|
|
|
|
list_fold_left (fun exps (index, strexp) -> collect_exps exps strexp) exps elems in
|
|
|
|
let rec compute_reachable_hpreds_rec sigma (reach, exps) =
|
|
|
|
let rec compute_reachable_hpreds_rec sigma (reach, exps) =
|
|
|
|
let add_hpred_if_reachable (reach, exps) = function
|
|
|
|
let add_hpred_if_reachable (reach, exps) = function
|
|
|
|
| Sil.Hpointsto (lhs, rhs, _) as hpred when Sil.ExpSet.mem lhs exps->
|
|
|
|
| Sil.Hpointsto (lhs, rhs, _) as hpred when Sil.ExpSet.mem lhs exps ->
|
|
|
|
let reach' = Sil.HpredSet.add hpred reach in
|
|
|
|
let reach' = Sil.HpredSet.add hpred reach in
|
|
|
|
let exps' = collect_exps exps rhs in
|
|
|
|
let exps' = collect_exps exps rhs in
|
|
|
|
(reach', exps')
|
|
|
|
(reach', exps')
|
|
|
|