Skip to content

Commit

Permalink
[clang] Handle the case: one reference is given to list initializer
Browse files Browse the repository at this point in the history
Summary:
This diff handles the case when one reference is given to the list initializer.

```
class MyClass {
  FieldClass& fld_;

 public:
  MyClass(FieldClass& fld): fld_{fld} {
    ...
  }
};
```

Before this diff, it gave up the translation, i.e. `fld_` was not initialized, so which introduced
false positives in the uninitialized value checker.

Reviewed By: ngorogiannis

Differential Revision: D55647033

fbshipit-source-id: a4de3a4daa0e7bb3d431011b9b5bf7301a38f671
  • Loading branch information
skcho authored and facebook-github-bot committed Apr 3, 2024
1 parent edd6a13 commit 5e9c372
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 4 deletions.
4 changes: 4 additions & 0 deletions infer/src/clang/cTrans.ml
Original file line number Diff line number Diff line change
Expand Up @@ -2914,6 +2914,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
res_super @ List.map2_exn field_exps stmts ~f:init_field
| [], stmts when Int.equal (List.length field_exps) (List.length stmts) ->
List.map2_exn field_exps stmts ~f:init_field
| [], [stmt] ->
(* This handles the case when a single element with a reference type is given. In that
case, it loads/store the argument. *)
[init_expr_trans trans_state (var_exp, var_typ) stmt_info (Some stmt)]
| _, _ ->
(* This happens with some braced-init-list for instance; translate each sub-statement so
as not to lose instructions (we might even get the translation right) *)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,32 @@ digraph cfg {
"union_initialize_FIXME.324b85335f5d2e41_1" [label="1: Start union_initialize_FIXME\nFormals: \nLocals: set_f1_implicit:U set_f2:U set_f1:U \n " color=yellow style=filled]


"union_initialize_FIXME.324b85335f5d2e41_1" -> "union_initialize_FIXME.324b85335f5d2e41_5" ;
"union_initialize_FIXME.324b85335f5d2e41_1" -> "union_initialize_FIXME.324b85335f5d2e41_8" ;
"union_initialize_FIXME.324b85335f5d2e41_2" [label="2: Exit union_initialize_FIXME \n " color=yellow style=filled]


"union_initialize_FIXME.324b85335f5d2e41_3" [label="3: DeclStmt \n VARIABLE_DECLARED(set_f1_implicit:U); [line 15, column 3]\n " shape="box"]
"union_initialize_FIXME.324b85335f5d2e41_3" [label="3: DeclStmt \n VARIABLE_DECLARED(set_f1_implicit:U); [line 15, column 29]\n *&set_f1_implicit:int=1 [line 15, column 29]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_3" -> "union_initialize_FIXME.324b85335f5d2e41_2" ;
"union_initialize_FIXME.324b85335f5d2e41_4" [label="4: DeclStmt \n VARIABLE_DECLARED(set_f2:U); [line 14, column 3]\n *&set_f2[0]:int=1 [line 14, column 27]\n *&set_f2[1]:int=2 [line 14, column 27]\n *&set_f2[2]:int=3 [line 14, column 27]\n " shape="box"]
"union_initialize_FIXME.324b85335f5d2e41_4" [label="4: DeclStmt \n VARIABLE_DECLARED(set_f1_implicit:U); [line 15, column 3]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_4" -> "union_initialize_FIXME.324b85335f5d2e41_3" ;
"union_initialize_FIXME.324b85335f5d2e41_5" [label="5: DeclStmt \n VARIABLE_DECLARED(set_f1:U); [line 13, column 3]\n " shape="box"]
"union_initialize_FIXME.324b85335f5d2e41_5" [label="5: DeclStmt \n VARIABLE_DECLARED(set_f2:U); [line 14, column 20]\n *&set_f2[0]:int=1 [line 14, column 27]\n *&set_f2[1]:int=2 [line 14, column 27]\n *&set_f2[2]:int=3 [line 14, column 27]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_5" -> "union_initialize_FIXME.324b85335f5d2e41_4" ;
"union_initialize_FIXME.324b85335f5d2e41_6" [label="6: DeclStmt \n VARIABLE_DECLARED(set_f2:U); [line 14, column 3]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_6" -> "union_initialize_FIXME.324b85335f5d2e41_5" ;
"union_initialize_FIXME.324b85335f5d2e41_7" [label="7: DeclStmt \n VARIABLE_DECLARED(set_f1:U); [line 13, column 20]\n *&set_f1:int=2 [line 13, column 20]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_7" -> "union_initialize_FIXME.324b85335f5d2e41_6" ;
"union_initialize_FIXME.324b85335f5d2e41_8" [label="8: DeclStmt \n VARIABLE_DECLARED(set_f1:U); [line 13, column 3]\n " shape="box"]


"union_initialize_FIXME.324b85335f5d2e41_8" -> "union_initialize_FIXME.324b85335f5d2e41_7" ;
}
16 changes: 16 additions & 0 deletions infer/tests/codetoanalyze/cpp/pulse/uninit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,19 @@ int call_read_nested_ok() {
Nested x;
return read_nested(x);
}

class Uninit3 {
public:
int f1;
int f2;
};

class Uninit4 {
Uninit3& uninit3_;
int x;

public:
Uninit4(Uninit3& uninit3) : uninit3_{uninit3} { Uninit3 dummy = uninit3_; }
};

void construct_unint4_ok(Uninit3 uninit3) { Uninit4 uninit4(uninit3); }

0 comments on commit 5e9c372

Please sign in to comment.