From 0c60c25cfa8b22b31f1c94499d5455459537f480 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 12 Jun 2013 18:12:57 +0300 Subject: [PATCH] ranges: handle [==p0] return values correctly These are a special case because we don't a min and max, we want a range_list. Signed-off-by: Dan Carpenter --- smatch_extra.h | 1 + smatch_math.c | 11 +++++++++++ smatch_ranges.c | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/smatch_extra.h b/smatch_extra.h index 7d8eeec7..f4503c05 100644 --- a/smatch_extra.h +++ b/smatch_extra.h @@ -79,6 +79,7 @@ void filter_top_rl(struct range_list_stack **rl_stack, sval_t sval); struct range_list *rl_truncate_cast(struct symbol *type, struct range_list *rl); struct range_list *cast_rl(struct symbol *type, struct range_list *rl); int get_implied_rl(struct expression *expr, struct range_list **rl); +int get_implied_rl_var_sym(const char *var, struct symbol *sym, struct range_list **rl); void free_rl(struct range_list **rlist); void free_data_info_allocs(void); diff --git a/smatch_math.c b/smatch_math.c index 32664f92..06f34366 100644 --- a/smatch_math.c +++ b/smatch_math.c @@ -784,6 +784,17 @@ int get_implied_rl(struct expression *expr, struct range_list **rl) return 0; } +int get_implied_rl_var_sym(const char *var, struct symbol *sym, struct range_list **rl) +{ + struct smatch_state *state; + + state = get_state(SMATCH_EXTRA, var, sym); + *rl = estate_rl(state); + if (*rl) + return 1; + return 0; +} + int get_hard_max(struct expression *expr, sval_t *sval) { struct range_list *rl; diff --git a/smatch_ranges.c b/smatch_ranges.c index 6e80b2d8..9e31c34f 100644 --- a/smatch_ranges.c +++ b/smatch_ranges.c @@ -181,6 +181,16 @@ static void str_to_rl_helper(struct expression *call, struct symbol *type, char if (value && strcmp(value, "empty") == 0) return; + if (strncmp(value, "[==p", 4) == 0) { + struct expression *arg; + int comparison; + + if (!str_to_comparison_arg(value, call, &comparison, &arg, NULL)) + goto out; + get_implied_rl(arg, rl); + goto out; + } + c = value; while (*c) { if (*c == '(') @@ -217,6 +227,7 @@ static void str_to_rl_helper(struct expression *call, struct symbol *type, char c++; } +out: *rl = cast_rl(type, *rl); } -- 2.11.4.GIT