From: Dan Carpenter Date: Thu, 12 Jun 2014 15:20:08 +0000 (+0300) Subject: rosenberg: handle struct to struct assignments X-Git-Tag: 1.60~235 X-Git-Url: https://repo.or.cz/w/smatch.git/commitdiff_plain/b74753310d84c818aed32f14750c88592f687a36 rosenberg: handle struct to struct assignments Say you have: struct foo one = two; That clears out all the holes in one. Also the smatch_struct_assignment.c code creates fake struct assignments for copy functions so this is even more important than it might seem at first. Signed-off-by: Dan Carpenter --- diff --git a/check_rosenberg.c b/check_rosenberg.c index 0b5f8729..5bcf85f4 100644 --- a/check_rosenberg.c +++ b/check_rosenberg.c @@ -284,6 +284,16 @@ static void db_param_cleared(struct expression *expr, int param, char *key, char match_clear(NULL, expr, INT_PTR(param)); } +static void match_assign(struct expression *expr) +{ + struct symbol *type; + + type = get_type(expr->left); + if (!type || type->type != SYM_STRUCT) + return; + set_state_expr(my_whole_id, expr->left, &cleared); +} + static void register_clears_argument(void) { struct token *token; @@ -347,6 +357,7 @@ void check_rosenberg(int id) add_function_hook("memcpy", &match_clear, INT_PTR(0)); add_function_hook("__memzero", &match_clear, INT_PTR(0)); add_function_hook("memzero", &match_clear, INT_PTR(0)); + add_hook(&match_assign, ASSIGNMENT_HOOK); register_clears_argument(); select_return_states_hook(PARAM_CLEARED, &db_param_cleared);