From 30af29cd7e0c47c7b67f3e8921a589e2c40fedd9 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 22 Apr 2016 14:06:31 +0300 Subject: [PATCH] ranges: fix a bug in rl_invert() The first line which returns early for void types is, basically an admission that I'm not sure what's going on here. I don't think it actually changes behavior. The bug is the next part. If we were supposed to add type_max to inverted range then it wasn't doing that. Signed-off-by: Dan Carpenter --- smatch_ranges.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/smatch_ranges.c b/smatch_ranges.c index c946af2c..0e9601ee 100644 --- a/smatch_ranges.c +++ b/smatch_ranges.c @@ -1175,6 +1175,8 @@ struct range_list *rl_invert(struct range_list *orig) if (!orig) return NULL; + if (type_bits(rl_type(orig)) < 0) /* void type mostly */ + return NULL; gap_min = sval_type_min(rl_min(orig).type); abs_max = sval_type_max(rl_max(orig).type); @@ -1184,12 +1186,12 @@ struct range_list *rl_invert(struct range_list *orig) sval = sval_type_val(tmp->min.type, tmp->min.value - 1); add_range(&ret, gap_min, sval); } - gap_min = sval_type_val(tmp->max.type, tmp->max.value + 1); if (sval_cmp(tmp->max, abs_max) == 0) - gap_min = abs_max; + return ret; + gap_min = sval_type_val(tmp->max.type, tmp->max.value + 1); } END_FOR_EACH_PTR(tmp); - if (sval_cmp(gap_min, abs_max) < 0) + if (sval_cmp(gap_min, abs_max) <= 0) add_range(&ret, gap_min, abs_max); return ret; -- 2.11.4.GIT