Print this page
new smatch
@@ -51,10 +51,13 @@
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);
+ if (estate_treat_untagged(s1) && estate_treat_untagged(s2))
+ estate_set_treat_untagged(tmp);
+
return tmp;
}
struct data_info *get_dinfo(struct smatch_state *state)
{
@@ -114,11 +117,11 @@
get_dinfo(state)->fuzzy_max = empty;
}
int estate_has_hard_max(struct smatch_state *state)
{
- if (!state)
+ if (!state || !estate_rl(state))
return 0;
return get_dinfo(state)->hard_max;
}
void estate_set_hard_max(struct smatch_state *state)
@@ -152,10 +155,27 @@
void estate_set_capped(struct smatch_state *state)
{
get_dinfo(state)->capped = true;
}
+bool estate_treat_untagged(struct smatch_state *state)
+{
+ if (!state)
+ return false;
+
+ /* impossible states are capped */
+ if (!estate_rl(state))
+ return true;
+
+ return get_dinfo(state)->treat_untagged;
+}
+
+void estate_set_treat_untagged(struct smatch_state *state)
+{
+ get_dinfo(state)->treat_untagged = true;
+}
+
sval_t estate_min(struct smatch_state *state)
{
return rl_min(estate_rl(state));
}
@@ -202,10 +222,12 @@
return 1;
if (!rlists_equiv(estate_related(one), estate_related(two)))
return 0;
if (estate_capped(one) != estate_capped(two))
return 0;
+ if (estate_treat_untagged(one) != estate_treat_untagged(two))
+ return 0;
if (strcmp(one->name, two->name) == 0)
return 1;
return 0;
}
@@ -232,10 +254,12 @@
int estate_get_single_value(struct smatch_state *state, sval_t *sval)
{
sval_t min, max;
+ if (!estate_rl(state))
+ return 0;
min = rl_min(estate_rl(state));
max = rl_max(estate_rl(state));
if (sval_cmp(min, max) != 0)
return 0;
*sval = min;