From d5dbb374b99900166b98f781281c7ecb60716b13 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 23 Feb 2009 14:39:53 +0300 Subject: [PATCH] Print fewer Unclear locking messages. If the state is &undefined that really just whatever locks it was called with. if (a) { lock(); frob(); unlock(); } <- &unlock + NULL => &undefined. Signed-off-by: Dan Carpenter --- check_locking.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/check_locking.c b/check_locking.c index a01f5817..7094f729 100644 --- a/check_locking.c +++ b/check_locking.c @@ -218,6 +218,22 @@ static struct locks_on_return *alloc_return(int line) return ret; } +static void check_possible(struct sm_state *sm) +{ + struct sm_state *tmp; + int islocked = 0; + int isunlocked = 0; + + FOR_EACH_PTR(sm->possible, tmp) { + if (tmp->state == &locked) + islocked = 1; + else if (tmp->state == &unlocked) + isunlocked = 1; + } END_FOR_EACH_PTR(tmp); + if (islocked && isunlocked) + smatch_msg("Unclear if '%s' is locked or unlocked.", tmp->name); +} + static void match_return(struct statement *stmt) { struct locks_on_return *ret; @@ -235,8 +251,7 @@ static void match_return(struct statement *stmt) add_tracker(&ret->unlocked, tmp->name, tmp->owner, tmp->sym); } else { - smatch_msg("Unclear if '%s' is locked or unlocked.", - tmp->name); + check_possible(tmp); } } END_FOR_EACH_PTR(tmp); add_ptr_list(&all_returns, ret); -- 2.11.4.GIT