Print this page
11506 smatch resync
*** 41,55 ****
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))
estate_set_hard_max(tmp);
estate_set_fuzzy_max(tmp, sval_max(estate_get_fuzzy_max(s1), estate_get_fuzzy_max(s2)));
return tmp;
}
struct data_info *get_dinfo(struct smatch_state *state)
{
--- 41,60 ----
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_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,141 ****
--- 137,161 ----
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,189 ****
--- 200,211 ----
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,279 ****
--- 292,320 ----
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,395 ****
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)
--- 404,413 ----