[inferbo] Change the order of StdBasicString and StdVector

Summary:
It changes the order of StdBasicString and StdVector for easier
reviewing of the following diff.

Reviewed By: ezgicicek

Differential Revision: D16963153

fbshipit-source-id: 50325e4e1
master
Sungkeun Cho 5 years ago committed by Facebook Github Bot
parent e49f3f1512
commit d11444f7d3

@ -575,79 +575,6 @@ let array_empty_exec ret_id array_v mem =
model_by_value empty ret_id mem
module StdBasicString = struct
(* The (4) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let constructor_from_char_ptr tgt src len =
let {exec= malloc_exec; check= malloc_check} = malloc ~can_be_zero:true len in
let exec model_env ~ret:((ret_id, _) as ret) mem =
let mem = malloc_exec model_env ~ret mem in
let v = Dom.Mem.find (Loc.of_id ret_id) mem in
let mem = Dom.Mem.update_mem (Sem.eval_locs tgt mem) v mem in
let contents =
let src_locs = Sem.eval_locs src mem in
Dom.Mem.find_set src_locs mem
in
Dom.Mem.update_mem (Dom.Val.get_all_locs v) contents mem
in
let check ({location; integer_type_widths} as model_env) mem cond_set =
let cond_set = malloc_check model_env mem cond_set in
BoUtils.Check.lindex integer_type_widths ~array_exp:src ~index_exp:len ~last_included:true
mem location cond_set
in
{exec; check}
(* The (5) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let constructor_from_char_ptr_without_len tgt src =
let exec ({integer_type_widths} as model_env) ~ret:_ mem =
match src with
| Exp.Const (Const.Cstr s) ->
let locs = Sem.eval_locs tgt mem in
BoUtils.Exec.decl_string model_env ~do_alloc:true locs s mem
| _ ->
let tgt_locs = Sem.eval_locs tgt mem in
let v = Sem.eval integer_type_widths src mem in
Dom.Mem.update_mem tgt_locs v mem
in
{exec; check= no_check}
(* The (7) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let copy_constructor tgt src =
let exec _ ~ret:_ mem =
let tgt_locs = Sem.eval_locs tgt mem in
let v = Dom.Mem.find_set (Sem.eval_locs src mem) mem in
Dom.Mem.update_mem tgt_locs v mem
in
{exec; check= no_check}
let empty e =
let exec {integer_type_widths} ~ret:(ret_id, _) mem =
let array_v = Sem.eval integer_type_widths e mem in
let mem = array_empty_exec ret_id array_v mem in
match e with
| Exp.Var id -> (
match Dom.Mem.find_simple_alias id mem with
| Some (l, None) ->
Dom.Mem.load_empty_alias ret_id l mem
| _ ->
mem )
| _ ->
mem
in
{exec; check= no_check}
let length e =
let exec {integer_type_widths} ~ret:(ret_id, _) mem =
let v = Sem.eval_arr integer_type_widths e mem in
let length = Dom.Val.of_itv (ArrayBlk.sizeof (Dom.Val.get_array_blk v)) in
Dom.Mem.add_stack (Loc.of_id ret_id) length mem
in
{exec; check= no_check}
end
module StdVector = struct
let append_field loc ~vec_typ ~elt_typ =
Loc.append_field loc ~fn:(BufferOverrunField.cpp_vector_elem ~vec_typ ~elt_typ)
@ -777,6 +704,79 @@ module StdVector = struct
{exec; check= no_check}
end
module StdBasicString = struct
(* The (4) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let constructor_from_char_ptr tgt src len =
let {exec= malloc_exec; check= malloc_check} = malloc ~can_be_zero:true len in
let exec model_env ~ret:((ret_id, _) as ret) mem =
let mem = malloc_exec model_env ~ret mem in
let v = Dom.Mem.find (Loc.of_id ret_id) mem in
let mem = Dom.Mem.update_mem (Sem.eval_locs tgt mem) v mem in
let contents =
let src_locs = Sem.eval_locs src mem in
Dom.Mem.find_set src_locs mem
in
Dom.Mem.update_mem (Dom.Val.get_all_locs v) contents mem
in
let check ({location; integer_type_widths} as model_env) mem cond_set =
let cond_set = malloc_check model_env mem cond_set in
BoUtils.Check.lindex integer_type_widths ~array_exp:src ~index_exp:len ~last_included:true
mem location cond_set
in
{exec; check}
(* The (5) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let constructor_from_char_ptr_without_len tgt src =
let exec ({integer_type_widths} as model_env) ~ret:_ mem =
match src with
| Exp.Const (Const.Cstr s) ->
let locs = Sem.eval_locs tgt mem in
BoUtils.Exec.decl_string model_env ~do_alloc:true locs s mem
| _ ->
let tgt_locs = Sem.eval_locs tgt mem in
let v = Sem.eval integer_type_widths src mem in
Dom.Mem.update_mem tgt_locs v mem
in
{exec; check= no_check}
(* The (7) constructor in https://en.cppreference.com/w/cpp/string/basic_string/basic_string *)
let copy_constructor tgt src =
let exec _ ~ret:_ mem =
let tgt_locs = Sem.eval_locs tgt mem in
let v = Dom.Mem.find_set (Sem.eval_locs src mem) mem in
Dom.Mem.update_mem tgt_locs v mem
in
{exec; check= no_check}
let empty e =
let exec {integer_type_widths} ~ret:(ret_id, _) mem =
let array_v = Sem.eval integer_type_widths e mem in
let mem = array_empty_exec ret_id array_v mem in
match e with
| Exp.Var id -> (
match Dom.Mem.find_simple_alias id mem with
| Some (l, None) ->
Dom.Mem.load_empty_alias ret_id l mem
| _ ->
mem )
| _ ->
mem
in
{exec; check= no_check}
let length e =
let exec {integer_type_widths} ~ret:(ret_id, _) mem =
let v = Sem.eval_arr integer_type_widths e mem in
let length = Dom.Val.of_itv (ArrayBlk.sizeof (Dom.Val.get_array_blk v)) in
Dom.Mem.add_stack (Loc.of_id ret_id) length mem
in
{exec; check= no_check}
end
(** Java's integers are modeled with an indirection to a memory
location that holds the actual integer value *)
module JavaInteger = struct

Loading…
Cancel
Save