From 7f7e473e19b06b316199bd630c449d217f36b3ba Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 25 Jan 2018 17:15:05 +0300 Subject: [PATCH] flow: don't fake an impossible default Before when we had a switch statement that had no default: then we always fake a default path. But sometimes the default path was impossible and we shouldn't create impossible paths if we don't need to. Signed-off-by: Dan Carpenter --- smatch.h | 1 + smatch_flow.c | 2 +- smatch_states.c | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/smatch.h b/smatch.h index c1e2a3c7..b8e43032 100644 --- a/smatch.h +++ b/smatch.h @@ -654,6 +654,7 @@ void __use_breaks(void); void __save_switch_states(struct expression *switch_expr); void __discard_switches(void); +int have_remaining_cases(void); void __merge_switches(struct expression *switch_expr, struct range_list *case_rl); void __push_default(void); void __set_default(void); diff --git a/smatch_flow.c b/smatch_flow.c index 9a1fc379..960bfdd6 100644 --- a/smatch_flow.c +++ b/smatch_flow.c @@ -1068,7 +1068,7 @@ void __split_stmt(struct statement *stmt) __push_default(); __push_breaks(); __split_stmt(stmt->switch_statement); - if (!__pop_default()) + if (!__pop_default() && have_remaining_cases()) fake_an_empty_default(stmt->pos); __discard_switches(); __merge_breaks(); diff --git a/smatch_states.c b/smatch_states.c index 21d42020..11a57339 100644 --- a/smatch_states.c +++ b/smatch_states.c @@ -1057,6 +1057,11 @@ void __save_switch_states(struct expression *switch_expr) push_stree(&switch_stack, clone_stree(cur_stree)); } +int have_remaining_cases(void) +{ + return !!top_rl(remaining_cases); +} + void __merge_switches(struct expression *switch_expr, struct range_list *case_rl) { struct stree *stree; -- 2.11.4.GIT