From 1c9f603eb047f2f789b2ccf98bad0fc550132db4 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Sat, 13 Mar 2010 10:15:30 +0300 Subject: [PATCH] equiv: preserve ->equiv across merges It's equivalent if both sides are equivalent. Signed-off-by: Dan Carpenter --- smatch_extra.c | 5 +++++ validation/sm_equiv1.c | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/smatch_extra.c b/smatch_extra.c index 740f1171..2ee3a49b 100644 --- a/smatch_extra.c +++ b/smatch_extra.c @@ -256,12 +256,17 @@ static struct smatch_state *merge_func(const char *name, struct symbol *sym, struct data_info *ret_info; struct smatch_state *tmp; struct range_list *value_ranges; + struct tracker *tracker; value_ranges = range_list_union(info1->value_ranges, info2->value_ranges); tmp = alloc_extra_state_empty(); ret_info = get_dinfo(tmp); ret_info->value_ranges = value_ranges; tmp->name = show_ranges(ret_info->value_ranges); + FOR_EACH_PTR(info1->equiv, tracker) { + if (in_tracker_list(info2->equiv, tracker->owner, tracker->name, tracker->sym)) + add_equiv(tmp, tracker->name, tracker->sym); + } END_FOR_EACH_PTR(tracker); return tmp; } diff --git a/validation/sm_equiv1.c b/validation/sm_equiv1.c index 0d96268d..c6ffa9f8 100644 --- a/validation/sm_equiv1.c +++ b/validation/sm_equiv1.c @@ -15,6 +15,12 @@ int func(void) } __smatch_value("one"); __smatch_value("two"); + if (one == 2) { + __smatch_value("one"); + __smatch_value("two"); + } + __smatch_value("one"); + __smatch_value("two"); return 0; } /* @@ -26,5 +32,9 @@ sm_equiv1.c +13 func(6) one = 1 sm_equiv1.c +14 func(7) two = 1 sm_equiv1.c +16 func(9) one = min-max sm_equiv1.c +17 func(10) two = min-max +sm_equiv1.c +19 func(12) one = 2 +sm_equiv1.c +20 func(13) two = 2 +sm_equiv1.c +22 func(15) one = min-max +sm_equiv1.c +23 func(16) two = min-max * check-output-end */ -- 2.11.4.GIT