From ca4980392cdfcb4981da2c3b853574c6c58d57c4 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Sun, 22 Feb 2009 21:29:32 +0300 Subject: [PATCH] Don't set let people set states for unreachable code. The problem is that sometimes BUG() returns and sometimes not depending on the .config file. If you set a state after calling BUG() and merge that path with another then you lose all your states because &state + NULL gives you &undefined. Signed-off-by: Dan Carpenter --- smatch_flow.c | 2 +- smatch_states.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/smatch_flow.c b/smatch_flow.c index 1fada592..f9336be1 100644 --- a/smatch_flow.c +++ b/smatch_flow.c @@ -382,8 +382,8 @@ static void split_functions(struct symbol_list *sym_list) cur_func = sym->ident->name; __smatch_lineno = sym->pos.line; SM_DEBUG("new function: %s\n", cur_func); - __pass_to_client(sym, FUNC_DEF_HOOK); __unnullify_path(); + __pass_to_client(sym, FUNC_DEF_HOOK); split_statements(base_type->stmt); __pass_to_client(sym, END_FUNC_HOOK); cur_func = NULL; diff --git a/smatch_states.c b/smatch_states.c index 50224a78..17bae614 100644 --- a/smatch_states.c +++ b/smatch_states.c @@ -60,6 +60,21 @@ void __print_cur_slist() __print_slist(cur_slist); } +static int unreachable() +{ + static int reset_warnings = 1; + + if (cur_slist) { + reset_warnings = 1; + return 0; + } + + if (reset_warnings || debug_states) + smatch_msg("ignoring unreachable code."); + reset_warnings = 0; + return 1; +} + void set_state(const char *name, int owner, struct symbol *sym, struct smatch_state *state) { @@ -78,6 +93,10 @@ void set_state(const char *name, int owner, struct symbol *sym, get_lineno(), name, owner, show_state(s), show_state(state)); } + + if (owner != -1 && unreachable()) + return; + set_state_slist(&cur_slist, name, owner, sym, state); if (cond_true_stack) { @@ -146,6 +165,9 @@ void set_true_false_states(const char *name, int owner, struct symbol *sym, show_state(true_state), show_state(false_state)); } + if (unreachable()) + return; + if (!cond_false_stack || !cond_true_stack) { printf("Error: missing true/false stacks\n"); return; @@ -173,7 +195,7 @@ void nullify_path() void __unnullify_path() { - set_state("unnull_path", 0, NULL, &true_state); + set_state("unnull_path", -1, NULL, &true_state); } int __path_is_null() -- 2.11.4.GIT