From e6261b26856fa15d1dee6a60fa33056d23ef471e Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 23 Nov 2012 10:02:14 +0300 Subject: [PATCH] extra: if (unsigned >= unsigned) {: Always true if the right side is zero If you have comparing have a comparison between two unsigned numbers like: if (a <= b) {... Then you know that if a is zero then the condition is true. Signed-off-by: Dan Carpenter --- smatch_extra.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/smatch_extra.c b/smatch_extra.c index a33afdb0..c49b4dab 100644 --- a/smatch_extra.c +++ b/smatch_extra.c @@ -764,6 +764,11 @@ static void match_comparison(struct expression *expr) right_true = remove_range(right_orig, min, sub_one(rl_min(left_orig))); if (!sval_is_max(rl_max(left_orig))) right_false = remove_range(right_orig, rl_max(left_orig), max); + + if (sval_cmp(rl_min(left_orig), rl_min(right_orig)) == 0) + left_false = remove_range(left_false, rl_min(left_orig), rl_min(left_orig)); + if (sval_cmp(rl_max(left_orig), rl_max(right_orig)) == 0) + right_false = remove_range(right_false, rl_max(left_orig), rl_max(left_orig)); break; case SPECIAL_EQUAL: if (!sval_is_max(rl_max(right_orig))) { @@ -793,6 +798,11 @@ static void match_comparison(struct expression *expr) right_true = remove_range(right_orig, add_one(rl_max(left_orig)), max); if (!sval_is_min(rl_min(left_orig))) right_false = remove_range(right_orig, min, rl_min(left_orig)); + + if (sval_cmp(rl_min(left_orig), rl_min(right_orig)) == 0) + right_false = remove_range(right_false, rl_min(left_orig), rl_min(left_orig)); + if (sval_cmp(rl_max(left_orig), rl_max(right_orig)) == 0) + left_false = remove_range(left_false, rl_max(left_orig), rl_max(left_orig)); break; case '>': case SPECIAL_UNSIGNED_GT: -- 2.11.4.GIT