From 75759d5ee20e9b4db0bc392bd4c659af31e3b8f8 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 20 Sep 2018 14:44:54 +0300 Subject: [PATCH] param_set: handle when the stack variable was modified better Say you have a function like strcmp() which takes a parameter s1 does "s1++;". We need to save that "s1" was modified, because we want param_was_set() to work. We don't want to save that *s1 was set, because it actually wasn't. And then generally if the stack variable changes, we don't want to put that *s1 type stuff was changed (because it wasn't) so we need to insert "s1" into the &set_list. Signed-off-by: Dan Carpenter --- smatch_param_set.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/smatch_param_set.c b/smatch_param_set.c index 6a0e9abc..21456057 100644 --- a/smatch_param_set.c +++ b/smatch_param_set.c @@ -59,7 +59,16 @@ static int parent_is_set(const char *name, struct symbol *sym, struct smatch_sta return 0; faked = get_faked_expression(); - if (!faked || faked->type != EXPR_ASSIGNMENT) + if (!faked) + return 0; + if ((faked->type == EXPR_PREOP || faked->type == EXPR_POSTOP) && + (faked->op == SPECIAL_INCREMENT || faked->op == SPECIAL_DECREMENT)) { + faked = strip_expr(faked->unop); + if (faked->type == EXPR_SYMBOL) + return 1; + return 0; + } + if (faked->type != EXPR_ASSIGNMENT) return 0; left_name = expr_to_var(faked->left); @@ -175,8 +184,10 @@ static void print_return_value_param(int return_id, char *return_ranges, struct param_name = get_param_name(sm); if (!param_name) continue; - if (strcmp(param_name, "$") == 0) + if (strcmp(param_name, "$") == 0) { + insert_string(&set_list, (char *)sm->name); continue; + } if (rl_to_sval(rl, &sval)) { insert_string(&set_list, (char *)sm->name); -- 2.11.4.GIT