[clang] do not attempt to translate pointer to member constructs

Summary:
C++...

seemsalittlecrazy

Reviewed By: sblackshear

Differential Revision: D7815648

fbshipit-source-id: f36ac4f
master
Jules Villard 7 years ago committed by Facebook Github Bot
parent d4337abcb4
commit 0bbdf63957

@ -70,11 +70,12 @@ let binary_operation_instruction source_range boi ((e1, t1) as e1_with_typ) typ
an integer offset, which is itself semantically ok though too low-level, an integer offset, which is itself semantically ok though too low-level,
but the translation of the argument expressions does not compute such but the translation of the argument expressions does not compute such
offsets and instead passes the member pointer at type 'void'. *) offsets and instead passes the member pointer at type 'void'. *)
| `PtrMemD -> | `PtrMemD
(binop_exp Binop.PlusPI, [])
| `PtrMemI -> | `PtrMemI ->
let id = Ident.create_fresh Ident.knormal in CFrontend_config.unimplemented __POS__ source_range
(Exp.BinOp (PlusPI, Exp.Var id, e2), [Sil.Load (id, e1, typ, loc)]) "Pointer-to-member constructs are unsupported. Got '%a'."
(Pp.to_string ~f:Clang_ast_j.string_of_binary_operator_info)
boi
| `Add -> | `Add ->
if Typ.is_pointer t1 then (binop_exp Binop.PlusPI, []) if Typ.is_pointer t1 then (binop_exp Binop.PlusPI, [])
else if Typ.is_pointer t2 then (binop_exp ~change_order:true Binop.PlusPI, []) else if Typ.is_pointer t2 then (binop_exp ~change_order:true Binop.PlusPI, [])

@ -774,21 +774,30 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
res_trans res_trans
and decl_ref_trans trans_state pre_trans_result stmt_info decl_ref ~is_constructor_init = and decl_ref_trans ?(is_constructor_init= false) ~source trans_state stmt_info decl_ref =
L.(debug Capture Verbose) L.(debug Capture Verbose)
" priority node free = '%s'@\n@." " priority node free = '%s'@\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)) ; (string_of_bool (PriorityNode.is_priority_free trans_state)) ;
let decl_kind = decl_ref.Clang_ast_t.dr_kind in let decl_kind = decl_ref.Clang_ast_t.dr_kind in
match decl_kind with match (decl_kind, source) with
| `EnumConstant -> | `EnumConstant, _ ->
enum_constant_trans trans_state decl_ref enum_constant_trans trans_state decl_ref
| `Function -> | `Function, _ ->
function_deref_trans trans_state decl_ref function_deref_trans trans_state decl_ref
| `Var | `ImplicitParam | `ParmVar -> | (`Var | `ImplicitParam | `ParmVar), _ ->
var_deref_trans trans_state stmt_info decl_ref var_deref_trans trans_state stmt_info decl_ref
| `Field | `ObjCIvar -> | (`Field | `ObjCIvar), `MemberOrIvar pre_trans_result ->
(* a field outside of constructor initialization is probably a pointer to member, which we
do not support *)
field_deref_trans trans_state stmt_info pre_trans_result decl_ref ~is_constructor_init field_deref_trans trans_state stmt_info pre_trans_result decl_ref ~is_constructor_init
| `CXXMethod | `CXXConversion | `CXXConstructor | `CXXDestructor -> | (`CXXMethod | `CXXConversion | `CXXConstructor | `CXXDestructor), _ ->
let pre_trans_result =
match source with
| `MemberOrIvar pre_trans_result ->
pre_trans_result
| `DeclRefExpr ->
empty_res_trans
in
method_deref_trans trans_state pre_trans_result decl_ref stmt_info decl_kind method_deref_trans trans_state pre_trans_result decl_ref stmt_info decl_kind
| _ -> | _ ->
CFrontend_config.unimplemented __POS__ stmt_info.Clang_ast_t.si_source_range CFrontend_config.unimplemented __POS__ stmt_info.Clang_ast_t.si_source_range
@ -808,7 +817,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
| None -> | None ->
assert false assert false
in in
decl_ref_trans trans_state empty_res_trans stmt_info decl_ref ~is_constructor_init:false decl_ref_trans ~source:`DeclRefExpr trans_state stmt_info decl_ref
(** evaluates an enum constant *) (** evaluates an enum constant *)
@ -899,10 +908,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
and binaryOperator_trans trans_state binary_operator_info stmt_info expr_info stmt_list = and binaryOperator_trans trans_state binary_operator_info stmt_info expr_info stmt_list =
let bok = L.(debug Capture Verbose)
Clang_ast_j.string_of_binary_operator_kind binary_operator_info.Clang_ast_t.boi_kind " BinaryOperator '%a' "
in (Pp.to_string ~f:Clang_ast_j.string_of_binary_operator_kind)
L.(debug Capture Verbose) " BinaryOperator '%s' " bok ; binary_operator_info.Clang_ast_t.boi_kind ;
L.(debug Capture Verbose) L.(debug Capture Verbose)
" priority node free = '%s'@\n@." " priority node free = '%s'@\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)) ; (string_of_bool (PriorityNode.is_priority_free trans_state)) ;
@ -1157,7 +1166,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
else tmp_res_trans else tmp_res_trans
in in
let res_trans_callee = let res_trans_callee =
decl_ref_trans trans_state this_res_trans si decl_ref ~is_constructor_init:false decl_ref_trans ~source:(`MemberOrIvar this_res_trans) trans_state si decl_ref
in in
let res_trans = let res_trans =
cxx_method_construct_call_trans trans_state_pri res_trans_callee params_stmt si cxx_method_construct_call_trans trans_state_pri res_trans_callee params_stmt si
@ -2385,7 +2394,7 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
(* int p = X(1).field; *) (* int p = X(1).field; *)
let trans_state' = {trans_state with var_exp_typ= None} in let trans_state' = {trans_state with var_exp_typ= None} in
let result_trans_exp_stmt = exec_with_glvalue_as_reference instruction trans_state' exp_stmt in let result_trans_exp_stmt = exec_with_glvalue_as_reference instruction trans_state' exp_stmt in
decl_ref_trans trans_state result_trans_exp_stmt stmt_info decl_ref ~is_constructor_init:false decl_ref_trans ~source:(`MemberOrIvar result_trans_exp_stmt) trans_state stmt_info decl_ref
and objCIvarRefExpr_trans trans_state stmt_info stmt_list obj_c_ivar_ref_expr_info = and objCIvarRefExpr_trans trans_state stmt_info stmt_list obj_c_ivar_ref_expr_info =
@ -3447,8 +3456,8 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
let class_typ = match this_typ.Typ.desc with Tptr (t, _) -> t | _ -> assert false in let class_typ = match this_typ.Typ.desc with Tptr (t, _) -> t | _ -> assert false in
{this_res_trans with exps= [(this_exp, class_typ)]} {this_res_trans with exps= [(this_exp, class_typ)]}
| `Member decl_ref -> | `Member decl_ref ->
decl_ref_trans trans_state' this_res_trans child_stmt_info decl_ref decl_ref_trans ~is_constructor_init:true ~source:(`MemberOrIvar this_res_trans)
~is_constructor_init:true trans_state' child_stmt_info decl_ref
in in
let var_exp_typ = let var_exp_typ =
extract_exp_from_list var_res_trans.exps extract_exp_from_list var_res_trans.exps

@ -29,9 +29,9 @@ struct List {
E* E::*next_ptr; E* E::*next_ptr;
}; };
int main() { void skip() { List<item> l(&item::next); }
List<item> l(&item::next);
void noskip(List<item> l) {
item i; item i;
l.add(&i); l.add(&i);
l.add_byref(i); l.add_byref(i);

@ -1,28 +1,24 @@
/* @generated */ /* @generated */
digraph cfg { digraph cfg {
"main.fad58de7366495db4650cfefac2fcd61_1" [label="1: Start main\nFormals: \nLocals: i:item l:List<item> \n DECLARE_LOCALS(&return,&i,&l); [line 32, column 1]\n " color=yellow style=filled] "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_1" [label="1: Start noskip\nFormals: l:List<item>&(byval)\nLocals: i:item \n DECLARE_LOCALS(&return,&i); [line 34, column 1]\n " color=yellow style=filled]
"main.fad58de7366495db4650cfefac2fcd61_1" -> "main.fad58de7366495db4650cfefac2fcd61_6" ; "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_1" -> "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_5" ;
"main.fad58de7366495db4650cfefac2fcd61_2" [label="2: Exit main \n " color=yellow style=filled] "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_2" [label="2: Exit noskip \n " color=yellow style=filled]
"main.fad58de7366495db4650cfefac2fcd61_3" [label="3: Call _fun_List<item>_add_byref \n _=*&l:List<item> [line 37, column 3]\n _fun_List<item>_add_byref(&l:List<item>&,&i:item&) [line 37, column 3]\n " shape="box"] "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_3" [label="3: Call _fun_List<item>_add_byref \n n$0=*&l:List<item>& [line 37, column 3]\n _=*n$0:List<item> [line 37, column 3]\n _fun_List<item>_add_byref(n$0:List<item>&,&i:item&) [line 37, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_3" -> "main.fad58de7366495db4650cfefac2fcd61_2" ; "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_3" -> "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_2" ;
"main.fad58de7366495db4650cfefac2fcd61_4" [label="4: Call _fun_List<item>_add \n _=*&l:List<item> [line 36, column 3]\n _fun_List<item>_add(&l:List<item>&,&i:item*) [line 36, column 3]\n " shape="box"] "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_4" [label="4: Call _fun_List<item>_add \n n$2=*&l:List<item>& [line 36, column 3]\n _=*n$2:List<item> [line 36, column 3]\n _fun_List<item>_add(n$2:List<item>&,&i:item*) [line 36, column 3]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_4" -> "main.fad58de7366495db4650cfefac2fcd61_3" ; "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_4" -> "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_3" ;
"main.fad58de7366495db4650cfefac2fcd61_5" [label="5: DeclStmt \n _fun_item_item(&i:item*) [line 35, column 8]\n " shape="box"] "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_5" [label="5: DeclStmt \n _fun_item_item(&i:item*) [line 35, column 8]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_5" -> "main.fad58de7366495db4650cfefac2fcd61_4" ; "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_5" -> "noskip#6149941428299352091.c0e56085ae3c9567084b0f9e4211cfc0_4" ;
"main.fad58de7366495db4650cfefac2fcd61_6" [label="6: DeclStmt \n n$2=*-1.next:item* [line 33, column 17]\n _fun_List<item>_List(&l:List<item>*,n$2:void) [line 33, column 14]\n " shape="box"]
"main.fad58de7366495db4650cfefac2fcd61_6" -> "main.fad58de7366495db4650cfefac2fcd61_5" ;
"List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_1" [label="1: Start List<item>_List\nFormals: this:List<item>* next_ptr:void\nLocals: \n DECLARE_LOCALS(&return); [line 16, column 3]\n " color=yellow style=filled] "List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_1" [label="1: Start List<item>_List\nFormals: this:List<item>* next_ptr:void\nLocals: \n DECLARE_LOCALS(&return); [line 16, column 3]\n " color=yellow style=filled]
@ -38,36 +34,6 @@ digraph cfg {
"List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_4" -> "List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_3" ; "List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_4" -> "List#List<item>#{15914538297308632075}.3434f5c53e6f70f530bf6d3beb27430e_3" ;
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_1" [label="1: Start List<item>_add\nFormals: this:List<item>* e:item*\nLocals: \n DECLARE_LOCALS(&return); [line 18, column 3]\n " color=yellow style=filled]
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_1" -> "add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_4" ;
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_2" [label="2: Exit List<item>_add \n " color=yellow style=filled]
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_3" [label="3: BinaryOperatorStmt: Assign \n n$0=*&this:List<item>* [line 20, column 5]\n n$1=*&e:item* [line 20, column 12]\n *n$0.head:item*=n$1 [line 20, column 5]\n " shape="box"]
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_3" -> "add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_2" ;
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_4" [label="4: BinaryOperatorStmt: Assign \n n$2=*&e:item* [line 19, column 5]\n n$3=*&this:List<item>* [line 19, column 9]\n n$4=*n$3.next_ptr:void [line 19, column 9]\n n$5=*n$2:item* [line 19, column 5]\n n$6=*&this:List<item>* [line 19, column 20]\n n$7=*n$6.head:item* [line 19, column 20]\n *(n$5 + n$4):item*=n$7 [line 19, column 5]\n " shape="box"]
"add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_4" -> "add#List<item>#(8886422348332570962).d7124ab68ff2274165f87f96f8efb745_3" ;
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_1" [label="1: Start List<item>_add_byref\nFormals: this:List<item>* e:item&\nLocals: \n DECLARE_LOCALS(&return); [line 23, column 3]\n " color=yellow style=filled]
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_1" -> "add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_4" ;
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_2" [label="2: Exit List<item>_add_byref \n " color=yellow style=filled]
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_3" [label="3: BinaryOperatorStmt: Assign \n n$0=*&this:List<item>* [line 25, column 5]\n n$1=*&e:item& [line 25, column 13]\n *n$0.head:item*=n$1 [line 25, column 5]\n " shape="box"]
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_3" -> "add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_2" ;
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_4" [label="4: BinaryOperatorStmt: Assign \n n$2=*&e:item& [line 24, column 5]\n n$3=*&this:List<item>* [line 24, column 8]\n n$4=*n$3.next_ptr:void [line 24, column 8]\n n$5=*&this:List<item>* [line 24, column 19]\n n$6=*n$5.head:item* [line 24, column 19]\n *(n$2 + n$4):item*=n$6 [line 24, column 5]\n " shape="box"]
"add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_4" -> "add_byref#List<item>#(435356425820132485).163c5ed0bcef8861fe1a46383d99ea83_3" ;
"item#item#{8704603758565933158}.444c1f007931991a5b2dfd25b7b090f5_1" [label="1: Start item_item\nFormals: this:item*\nLocals: \n DECLARE_LOCALS(&return); [line 9, column 8]\n " color=yellow style=filled] "item#item#{8704603758565933158}.444c1f007931991a5b2dfd25b7b090f5_1" [label="1: Start item_item\nFormals: this:item*\nLocals: \n DECLARE_LOCALS(&return); [line 9, column 8]\n " color=yellow style=filled]

Loading…
Cancel
Save