From 45be5edd212c62618ab863c0720959fda5751af4 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 27 Oct 2014 17:22:03 +0300 Subject: [PATCH] compare: introduce get_all_comparisons() This returns a static list of compare states so we need to have a public definition of the compare_data structure. The get_all_possible_equal_comparisons() is the same except that it only returns >= comparisons but not < or !=. Signed-off-by: Dan Carpenter --- smatch.h | 9 +++++++++ smatch_comparison.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/smatch.h b/smatch.h index 224a116f..599324be 100644 --- a/smatch.h +++ b/smatch.h @@ -701,9 +701,18 @@ struct expression *get_assigned_expr(struct expression *expr); struct expression *get_assigned_expr_name_sym(const char *name, struct symbol *sym); /* smatch_comparison.c */ +struct compare_data { + const char *var1; + struct var_sym_list *vsl1; + int comparison; + const char *var2; + struct var_sym_list *vsl2; +}; int get_comparison(struct expression *left, struct expression *right); int get_comparison_strings(const char *one, const char *two); int possible_comparison(struct expression *a, int comparison, struct expression *b); +struct state_list *get_all_comparisons(struct expression *expr); +struct state_list *get_all_possible_equal_comparisons(struct expression *expr); void __add_comparison_info(struct expression *expr, struct expression *call, const char *range); char *expr_equal_to_param(struct expression *expr, int ignore); char *expr_lte_to_param(struct expression *expr, int ignore); diff --git a/smatch_comparison.c b/smatch_comparison.c index 29239144..a6923587 100644 --- a/smatch_comparison.c +++ b/smatch_comparison.c @@ -1267,6 +1267,57 @@ free: return ret; } +struct state_list *get_all_comparisons(struct expression *expr) +{ + struct smatch_state *state; + struct string_list *links; + struct state_list *ret = NULL; + struct sm_state *sm; + char *tmp; + + state = get_state_expr(link_id, expr); + if (!state) + return NULL; + links = state->data; + + FOR_EACH_PTR(links, tmp) { + sm = get_sm_state(compare_id, tmp, NULL); + if (!sm) + continue; + // FIXME have to compare name with vsl + add_ptr_list(&ret, sm); + } END_FOR_EACH_PTR(tmp); + + return ret; +} + +struct state_list *get_all_possible_equal_comparisons(struct expression *expr) +{ + struct smatch_state *state; + struct string_list *links; + struct state_list *ret = NULL; + struct sm_state *sm; + char *tmp; + + state = get_state_expr(link_id, expr); + if (!state) + return NULL; + links = state->data; + + FOR_EACH_PTR(links, tmp) { + sm = get_sm_state(compare_id, tmp, NULL); + if (!sm) + continue; + if (!strchr(sm->state->name, '=')) + continue; + if (strcmp(sm->state->name, "!=") == 0) + continue; + add_ptr_list(&ret, sm); + } END_FOR_EACH_PTR(tmp); + + return ret; +} + static void update_links_from_call(struct expression *left, int left_compare, struct expression *right) -- 2.11.4.GIT