From 4d1bf2b5af4313376a7e106c0be75e7ab347b1ef Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 5 Dec 2012 21:06:16 +0300 Subject: [PATCH] db: introduce add_returned_state_callback() These callbacks will be used to fill the return_states table in the database. Everything that wants a return_id will have to be written like that. It passes an slist as a parameter. Use that instead of the cur_slist. Right now they are equivalent, but later it will change. I have updated the "return_marker" function to the new callback system. Signed-off-by: Dan Carpenter --- smatch.h | 1 + smatch_db.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/smatch.h b/smatch.h index 616c2804..ab659c2b 100644 --- a/smatch.h +++ b/smatch.h @@ -464,6 +464,7 @@ enum info_type { int get_return_id(void); void add_definition_db_callback(void (*callback)(const char *name, struct symbol *sym, char *key, char *value), int type); void add_member_info_callback(int owner, void (*callback)(char *fn, char *global_static, int param, char *printed_name, struct smatch_state *state)); +void add_returned_state_callback(void (*fn)(int return_id, char *return_ranges, struct expression *returned_expr, struct state_list *slist)); 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); diff --git a/smatch_db.c b/smatch_db.c index b45264e2..66f233bd 100644 --- a/smatch_db.c +++ b/smatch_db.c @@ -32,6 +32,13 @@ ALLOCATOR(member_info_callback, "caller_info callbacks"); DECLARE_PTR_LIST(member_info_cb_list, struct member_info_callback); static struct member_info_cb_list *member_callbacks; +struct returned_state_callback { + void (*callback)(int return_id, char *return_ranges, struct expression *return_expr, struct state_list *slist); +}; +ALLOCATOR(returned_state_callback, "returned state callbacks"); +DECLARE_PTR_LIST(returned_state_cb_list, struct returned_state_callback); +static struct returned_state_cb_list *returned_state_callbacks; + struct returned_member_callback { int owner; void (*callback)(int return_id, char *return_ranges, char *printed_name, struct smatch_state *state); @@ -92,6 +99,14 @@ void add_member_info_callback(int owner, void (*callback)(char *fn, char *global add_ptr_list(&member_callbacks, member_callback); } +void add_returned_state_callback(void (*fn)(int return_id, char *return_ranges, struct expression *returned_expr, struct state_list *slist)) +{ + struct returned_state_callback *callback = __alloc_returned_state_callback(0); + + callback->callback = fn; + add_ptr_list(&returned_state_callbacks, callback); +} + void add_returned_member_callback(int owner, void (*callback)(int return_id, char *return_ranges, char *printed_name, struct smatch_state *state)) { struct returned_member_callback *member_callback = __alloc_returned_member_callback(0); @@ -496,14 +511,28 @@ static void global_variable(struct symbol *sym) print_initializer_list(sym->initializer->expr_list, struct_type); } -static void match_return_info(struct expression *ret_value) +static void match_return_info(int return_id, char *return_ranges, struct expression *expr, struct state_list *slist) +{ + sm_msg("info: return_marker %d '%s' %s", return_id, return_ranges, + global_static()); +} + +static void call_return_state_hooks(struct expression *expr) { + struct returned_state_callback *cb; + struct state_list *slist; struct range_list *rl; + char *return_ranges; - get_implied_range_list(ret_value, &rl); + if (!get_implied_range_list(expr, &rl)) + return; rl = cast_rl(cur_func_return_type(), rl); - sm_msg("info: return_marker %d '%s' %s", - get_return_id(), show_ranges(rl), global_static()); + return_ranges = show_ranges(rl); + + slist = __get_cur_slist(); + FOR_EACH_PTR(returned_state_callbacks, cb) { + cb->callback(get_return_id(), return_ranges, expr, slist); + } END_FOR_EACH_PTR(cb); } static void print_returned_struct_members(struct expression *expr) @@ -607,7 +636,8 @@ void register_definition_db_callbacks(int id) add_hook(&match_function_assign, GLOBAL_ASSIGNMENT_HOOK); add_hook(&global_variable, BASE_HOOK); add_hook(&global_variable, DECLARATION_HOOK); - add_hook(&match_return_info, RETURN_HOOK); + add_returned_state_callback(match_return_info); + add_hook(&call_return_state_hooks, RETURN_HOOK); add_hook(&print_returned_struct_members, RETURN_HOOK); add_hook(&match_end_func_info, END_FUNC_HOOK); } -- 2.11.4.GIT