From 92a9d1df53bddca7fd9731b748d454a2e4621de8 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 3 Dec 2009 23:33:05 +0200 Subject: [PATCH] fix issue with ranges merging 0 as the first parameter with min-max as the second range gave 0-max instead of min-max. Also added a test case. Signed-off-by: Dan Carpenter --- smatch_ranges.c | 3 +++ validation/sm_range2.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 validation/sm_range2.c diff --git a/smatch_ranges.c b/smatch_ranges.c index 34b95a67..0b581362 100644 --- a/smatch_ranges.c +++ b/smatch_ranges.c @@ -170,6 +170,7 @@ void add_range(struct range_list **list, long long min, long long max) REPLACE_CURRENT_PTR(tmp, new); if (!check_next) return; + continue; } if (max <= tmp->max) /* new range already included */ return; @@ -178,12 +179,14 @@ void add_range(struct range_list **list, long long min, long long max) new = alloc_range(min, max); REPLACE_CURRENT_PTR(tmp, new); check_next = 1; + continue; } if (min != whole_range.min && min - 1 == tmp->max) { /* join 2 ranges into a big range */ new = alloc_range(tmp->min, max); REPLACE_CURRENT_PTR(tmp, new); check_next = 1; + continue; } } END_FOR_EACH_PTR(tmp); if (check_next) diff --git a/validation/sm_range2.c b/validation/sm_range2.c new file mode 100644 index 00000000..950be0b6 --- /dev/null +++ b/validation/sm_range2.c @@ -0,0 +1,35 @@ +#include "check_debug.h" +int some_func(); +int a, b, c, d; +int frob(void) { + if (a) + __smatch_print_value("a"); + else + __smatch_print_value("a"); + __smatch_print_value("a"); + if (a) { + b = 0; + __smatch_print_value("b"); + } + __smatch_print_value("b"); + c = 0; + c = some_func(); + __smatch_print_value("c"); + if (d < -3 || d > 99) + return; + __smatch_print_value("d"); +} +/* + * check-name: Smatch range test #2 + * check-command: smatch -I.. sm_range2.c + * + * check-output-start +sm_range2.c +6 frob(2) a = min-(-1),1-max +sm_range2.c +8 frob(4) a = 0 +sm_range2.c +9 frob(5) a = min-max +sm_range2.c +12 frob(8) b = 0 +sm_range2.c +14 frob(10) b = min-max +sm_range2.c +17 frob(13) c = unknown +sm_range2.c +20 frob(16) d = (-3)-99 + * check-output-end + */ -- 2.11.4.GIT