From 83e06f5e5c034378e7f2fef8792ceb38f01925c1 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Tue, 15 May 2012 15:00:32 +0300 Subject: [PATCH] *new* returns: merge all slists from all returns This provides a call back: void all_return_states_hook(void (*callback)(struct state_list *slist)); The way I'm going to use this is to tell if a parameter is derefenced on every path through a function. This combines all the end states together and I'll just do a get_state_slist() to find out which parameters are always dereferenced. Signed-off-by: Dan Carpenter --- Makefile | 2 +- check_list.h | 1 + smatch_returns.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ smatch_slist.h | 5 +++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 smatch_returns.c diff --git a/Makefile b/Makefile index 0e63a784..0879454d 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ SMATCH_FILES=smatch_flow.o smatch_conditions.o smatch_slist.o smatch_states.o \ smatch_ranges.o smatch_implied.o smatch_ignore.o smatch_project.o \ smatch_tracker.o smatch_files.o smatch_expression_stacks.o \ smatch_constraints.o smatch_buf_size.o smatch_capped.o smatch_db.o \ - smatch_expressions.o + smatch_expressions.o smatch_returns.o SMATCH_CHECKS=$(shell ls check_*.c | sed -e 's/\.c/.o/') SMATCH_DATA=smatch_data/kernel.allocation_funcs smatch_data/kernel.balanced_funcs \ diff --git a/check_list.h b/check_list.h index 7a3d59db..cf6bd530 100644 --- a/check_list.h +++ b/check_list.h @@ -100,6 +100,7 @@ CK(check_wine_WtoA) CK(register_modification_hooks_late) CK(register_smatch_extra_late) +CK(register_returns) CK(register_implications) /* implications always has to be last */ #ifdef __undo_CK_def diff --git a/smatch_returns.c b/smatch_returns.c new file mode 100644 index 00000000..c2f6c30a --- /dev/null +++ b/smatch_returns.c @@ -0,0 +1,59 @@ +/* + * smatch/smatch_returns.c + * + * Copyright (C) 2011 Oracle. + * + * Licensed under the Open Software License version 1.1 + * + */ + +#include "smatch.h" +#include "smatch_slist.h" + +static int my_id; + +struct return_states_callback { + void (*callback)(struct state_list *slist); +}; +ALLOCATOR(return_states_callback, "return states callbacks"); +DECLARE_PTR_LIST(callback_list, struct return_states_callback); +static struct callback_list *callback_list; + +static struct state_list *all_return_states; + +void all_return_states_hook(void (*callback)(struct state_list *slist)) +{ + struct return_states_callback *rs_cb = __alloc_return_states_callback(0); + + rs_cb->callback = callback; + add_ptr_list(&callback_list, rs_cb); +} + +static void call_hooks() +{ + struct return_states_callback *rs_cb; + + FOR_EACH_PTR(callback_list, rs_cb) { + rs_cb->callback(all_return_states); + } END_FOR_EACH_PTR(rs_cb); +} + +static void match_return(struct expression *ret_value) +{ + merge_slist(&all_return_states, __get_cur_slist()); +} + +static void match_end_func(struct symbol *sym) +{ + merge_slist(&all_return_states, __get_cur_slist()); + call_hooks(); + free_slist(&all_return_states); +} + +void register_returns(int id) +{ + my_id = id; + + add_hook(&match_return, RETURN_HOOK); + add_hook(&match_end_func, END_FUNC_HOOK); +} diff --git a/smatch_slist.h b/smatch_slist.h index 75bb09fd..3dc84e68 100644 --- a/smatch_slist.h +++ b/smatch_slist.h @@ -72,3 +72,8 @@ struct state_list **get_slist_from_named_stack(struct named_stack *stack, const char *name); void overwrite_slist(struct state_list *from, struct state_list **to); + +/* add stuff smatch_returns.c here */ + +void all_return_states_hook(void (*callback)(struct state_list *slist)); + -- 2.11.4.GIT