From e2a33714b1415a3c729173e9de4a0de893907b0a Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 28 Jun 2018 10:14:56 +0300 Subject: [PATCH] user_data: don't pass *$ as user data if the struct members are known Say you have a void pointer or a char pointer. Then we record that the data it points to is user data. But if it's a struct member then we set all the struct members so we don't need the *$ information any more. And that information can be misleading if the struct members are reset to non-user data. Signed-off-by: Dan Carpenter --- check_user_data2.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/check_user_data2.c b/check_user_data2.c index faf42b93..c724e395 100644 --- a/check_user_data2.c +++ b/check_user_data2.c @@ -861,6 +861,21 @@ static void match_call_info(struct expression *expr) } END_FOR_EACH_PTR(arg); } +static int is_struct_ptr(struct symbol *sym) +{ + struct symbol *type; + + if (!sym) + return 0; + type = get_real_base_type(sym); + if (!type || type->type != SYM_PTR) + return 0; + type = get_real_base_type(type); + if (!type || type->type != SYM_STRUCT) + return 0; + return 1; +} + static void struct_member_callback(struct expression *call, int param, char *printed_name, struct sm_state *sm) { struct smatch_state *state; @@ -869,6 +884,10 @@ static void struct_member_callback(struct expression *call, int param, char *pri if (strcmp(sm->state->name, "") == 0) return; + if (strcmp(printed_name, "*$") == 0 && + is_struct_ptr(sm->sym)) + return; + state = get_state(SMATCH_EXTRA, sm->name, sm->sym); if (!state || !estate_rl(state)) rl = estate_rl(sm->state); -- 2.11.4.GIT