Print this page
11506 smatch resync
@@ -41,15 +41,20 @@
value_ranges = rl_union(estate_rl(s1), estate_rl(s2));
tmp = alloc_estate_rl(value_ranges);
rlist = get_shared_relations(estate_related(s1), estate_related(s2));
set_related(tmp, rlist);
- if (estate_has_hard_max(s1) && estate_has_hard_max(s2))
+
+ if ((estate_has_hard_max(s1) && (!estate_rl(s2) || estate_has_hard_max(s2))) ||
+ (estate_has_hard_max(s2) && (!estate_rl(s1) || estate_has_hard_max(s1))))
estate_set_hard_max(tmp);
estate_set_fuzzy_max(tmp, sval_max(estate_get_fuzzy_max(s1), estate_get_fuzzy_max(s2)));
+ if (estate_capped(s1) && estate_capped(s2))
+ estate_set_capped(tmp);
+
return tmp;
}
struct data_info *get_dinfo(struct smatch_state *state)
{
@@ -132,10 +137,25 @@
return 0;
*sval = rl_max(estate_rl(state));
return 1;
}
+bool estate_capped(struct smatch_state *state)
+{
+ if (!state)
+ return false;
+ /* impossible states are capped */
+ if (!estate_rl(state))
+ return true;
+ return get_dinfo(state)->capped;
+}
+
+void estate_set_capped(struct smatch_state *state)
+{
+ get_dinfo(state)->capped = true;
+}
+
sval_t estate_min(struct smatch_state *state)
{
return rl_min(estate_rl(state));
}
@@ -180,10 +200,12 @@
return 0;
if (one == two)
return 1;
if (!rlists_equiv(estate_related(one), estate_related(two)))
return 0;
+ if (estate_capped(one) != estate_capped(two))
+ return 0;
if (strcmp(one->name, two->name) == 0)
return 1;
return 0;
}
@@ -270,10 +292,29 @@
ret->name = state->name;
ret->data = clone_dinfo(get_dinfo(state));
return ret;
}
+struct smatch_state *clone_partial_estate(struct smatch_state *state, struct range_list *rl)
+{
+ struct smatch_state *ret;
+
+ if (!state)
+ return NULL;
+
+ rl = cast_rl(estate_type(state), rl);
+
+ ret = alloc_estate_rl(rl);
+ set_related(ret, clone_related_list(estate_related(state)));
+ if (estate_has_hard_max(state))
+ estate_set_hard_max(ret);
+ if (estate_has_fuzzy_max(state))
+ estate_set_fuzzy_max(ret, estate_get_fuzzy_max(state));
+
+ return ret;
+}
+
struct smatch_state *alloc_estate_empty(void)
{
struct smatch_state *state;
struct data_info *dinfo;
@@ -363,33 +404,10 @@
if (!get_implied_rl(expr, &rl))
rl = alloc_whole_rl(get_type(expr));
return alloc_estate_rl(rl);
}
-struct smatch_state *estate_filter_range(struct smatch_state *orig,
- sval_t filter_min, sval_t filter_max)
-{
- struct range_list *rl;
- struct smatch_state *state;
-
- if (!orig)
- orig = alloc_estate_whole(filter_min.type);
-
- rl = remove_range(estate_rl(orig), filter_min, filter_max);
- state = alloc_estate_rl(rl);
- if (estate_has_hard_max(orig))
- estate_set_hard_max(state);
- if (estate_has_fuzzy_max(orig))
- estate_set_fuzzy_max(state, estate_get_fuzzy_max(orig));
- return state;
-}
-
-struct smatch_state *estate_filter_sval(struct smatch_state *orig, sval_t sval)
-{
- return estate_filter_range(orig, sval, sval);
-}
-
/*
* One of the complications is that smatch tries to free a bunch of data at the
* end of every function.
*/
struct data_info *clone_dinfo_perm(struct data_info *dinfo)