From be0a33d843bb017b9274e88a38ce4e7465e4185a Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 16 Sep 2013 13:25:17 +0300 Subject: [PATCH] flow: set members to zero by default If a struct it partially initialized then the not-initialized members are set to zero. Signed-off-by: Dan Carpenter --- smatch_flow.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/smatch_flow.c b/smatch_flow.c index 57bd0491..0d5c5708 100644 --- a/smatch_flow.c +++ b/smatch_flow.c @@ -842,6 +842,29 @@ static struct ident *number_to_member(struct expression *expr, int num) static void fake_element_assigns_helper(struct expression *array, struct expression_list *expr_list, fake_cb *fake_cb); +static void set_members_to_zero(struct expression *symbol) +{ + struct expression *deref, *assign; + struct symbol *type; + struct symbol *member, *member_type; + + type = get_type(symbol); + if (!type) + return; + + FOR_EACH_PTR(type->symbol_list, member) { + if (!member->ident) + continue; + member_type = get_real_base_type(member); + if (!member_type || member_type->type == SYM_ARRAY) + continue; + deref = member_expression(symbol, '.', member->ident); + assign = assign_expression(deref, zero_expr()); + __split_expr(assign); + } END_FOR_EACH_PTR(member); + +} + static void fake_member_assigns_helper(struct expression *symbol, struct expression_list *members, fake_cb *fake_cb) { struct expression *deref, *assign, *tmp; @@ -853,6 +876,8 @@ static void fake_member_assigns_helper(struct expression *symbol, struct express if (!type || (type->type != SYM_STRUCT && type->type != SYM_UNION)) return; + set_members_to_zero(symbol); + FOR_EACH_PTR(members, tmp) { member = number_to_member(symbol, member_idx); while (tmp->type == EXPR_IDENTIFIER) { -- 2.11.4.GIT