From 1283419ad6f89e8586411c8afbc023d140b22ee3 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 17 Jun 2013 16:56:01 +0300 Subject: [PATCH] db: introduce return_state_to_var_sym() This function is sort of like get_variable_from_key() except that it can also handle param -1 (the return value). So you just take the information from the database and you get the var-sym combo that you care about. Signed-off-by: Dan Carpenter --- smatch.h | 1 + smatch_db.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/smatch.h b/smatch.h index d4d3690b..d299a154 100644 --- a/smatch.h +++ b/smatch.h @@ -513,6 +513,7 @@ void add_returned_state_callback(void (*fn)(int return_id, char *return_ranges, void add_returned_member_callback(int owner, void (*callback)(int return_id, char *return_ranges, char *printed_name, struct smatch_state *state)); void add_db_fn_call_callback(int type, void (*callback)(struct expression *arg, char *value)); struct range_list *db_return_vals(struct expression *expr); +char *return_state_to_var_sym(struct expression *expr, int param, char *key, struct symbol **sym); char *get_variable_from_key(struct expression *arg, char *key, struct symbol **sym); const char *get_param_name(struct sm_state *sm); diff --git a/smatch_db.c b/smatch_db.c index a345220c..97979bbe 100644 --- a/smatch_db.c +++ b/smatch_db.c @@ -1031,6 +1031,37 @@ void register_db_call_marker(int id) add_hook(&match_call_marker, FUNCTION_CALL_HOOK); } +char *return_state_to_var_sym(struct expression *expr, int param, char *key, struct symbol **sym) +{ + struct expression *arg; + char *name = NULL; + char member_name[256]; + + *sym = NULL; + + if (param == -1) { + if (expr->type != EXPR_ASSIGNMENT) + return NULL; + name = expr_to_var_sym(expr->left, sym); + if (!name) + return NULL; + snprintf(member_name, sizeof(member_name), "%s%s", name, key + 2); + free_string(name); + return alloc_string(member_name); + } + + while (expr->type == EXPR_ASSIGNMENT) + expr = strip_expr(expr->right); + if (expr->type != EXPR_CALL) + return NULL; + + arg = get_argument_from_call_expr(expr->args, param); + if (!arg) + return NULL; + + return get_variable_from_key(arg, key, sym); +} + char *get_variable_from_key(struct expression *arg, char *key, struct symbol **sym) { char buf[256]; -- 2.11.4.GIT