From 0b78084aeb0004db657d6e2d4fa4c17ec9f2e8e5 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 31 Jul 2015 12:45:25 +0300 Subject: [PATCH] implied: we have to make the false states match as well Before I thought that so long as the true states had a matching false state then it would be ok. It turns out the false states have to have a matching true state as well. Signed-off-by: Dan Carpenter --- smatch_implied.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/smatch_implied.c b/smatch_implied.c index 63330135..f24e4191 100644 --- a/smatch_implied.c +++ b/smatch_implied.c @@ -582,17 +582,24 @@ static void set_implied_states(struct expression *expr) struct sm_state *sm; FOR_EACH_SM(saved_implied_true, sm) { - /* - * Setting the true sm means setting the cur_stree. If we are - * not also setting the false_stree then it causes problems. - */ if (!get_state_stree(saved_implied_false, sm->owner, sm->name, sm->sym)) { struct sm_state *orig; orig = get_sm_state(sm->owner, sm->name, sm->sym); - if (orig) - set_state_stree(&saved_implied_false, sm->owner, sm->name, sm->sym, orig->state); + set_state_stree(&saved_implied_false, sm->owner, sm->name, sm->sym, orig->state); } + } END_FOR_EACH_SM(sm); + + FOR_EACH_SM(saved_implied_false, sm) { + if (!get_state_stree(saved_implied_true, sm->owner, sm->name, sm->sym)) { + struct sm_state *orig; + + orig = get_sm_state(sm->owner, sm->name, sm->sym); + set_state_stree(&saved_implied_true, sm->owner, sm->name, sm->sym, orig->state); + } + } END_FOR_EACH_SM(sm); + + FOR_EACH_SM(saved_implied_true, sm) { __set_true_false_sm(sm, NULL); } END_FOR_EACH_SM(sm); free_stree(&saved_implied_true); -- 2.11.4.GIT