From 9f422e2de2fb25581fa8491a6f9e2887be4f388c Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 29 Oct 2012 16:27:12 +0300 Subject: [PATCH] sval: change type_min/max() => sval_type_min/max() Replace calls to type_max() with calls to sval_tpye_max() which returns an sval_t. This is useful because ULLONG_MAX doesn't fit into a long long. Signed-off-by: Dan Carpenter --- smatch_absolute.c | 28 ++++++++++++++-------------- smatch_math.c | 20 +++++--------------- smatch_type.c | 13 +++++++++---- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/smatch_absolute.c b/smatch_absolute.c index 27256d4b..2adb9306 100644 --- a/smatch_absolute.c +++ b/smatch_absolute.c @@ -95,33 +95,33 @@ static void reset_state(struct sm_state *sm) static void match_assign(struct expression *expr) { - struct symbol *type; - long long min; - sval_t max; + struct symbol *left_type; + sval_t left_min, left_max, right_min, right_max; if (expr->op != '=') { set_state_expr(absolute_id, expr->left, &undefined); return; } - type = get_type(expr->left); - if (!type) + left_type = get_type(expr->left); + if (!left_type) return; + left_min = sval_type_min(left_type); + left_max = sval_type_max(left_type); - if (!get_absolute_min(expr->right, &min)) - min = whole_range.min; - get_absolute_max_sval(expr->right, &max); + get_absolute_min_sval(expr->right, &right_min); + get_absolute_max_sval(expr->right, &right_max); /* handle wrapping. sort of sloppy */ - if (sval_cmp(sval_type_max(type), max) < 0) - min = type_min(type); - if (type_min(type) > min) - max.value = sval_type_max(max.type).value; + if (sval_cmp(left_max, right_max) < 0) + right_min = left_min; + if (sval_cmp(left_min, right_min) > 0) + right_max = left_max; - if (min <= type_min(type) && sval_cmp(max, sval_type_max(type)) >= 0) + if (sval_cmp(right_min, sval_type_min(left_type)) <= 0 && sval_cmp(right_max, sval_type_max(left_type)) >= 0) set_state_expr(absolute_id, expr->left, &undefined); else - set_state_expr(absolute_id, expr->left, alloc_absolute(min, sval_to_ll(max))); + set_state_expr(absolute_id, expr->left, alloc_absolute(sval_to_ll(right_min), sval_to_ll(right_max))); } static void struct_member_callback(char *fn, char *global_static, int param, char *printed_name, struct smatch_state *state) diff --git a/smatch_math.c b/smatch_math.c index 6af6b72b..b51a1a5a 100644 --- a/smatch_math.c +++ b/smatch_math.c @@ -683,20 +683,10 @@ int get_fuzzy_max_sval(struct expression *expr, sval_t *sval) int get_absolute_min(struct expression *expr, long long *val) { - int undefined = 0; - struct symbol *type; sval_t tmp_ret; - type = get_type(expr); - tmp_ret = _get_value(expr, &undefined, ABSOLUTE_MIN); + get_absolute_min_sval(expr, &tmp_ret); *val = tmp_ret.value; - if (undefined) { - *val = type_min(type); - return 1; - } - - if (sval_cmp_val(tmp_ret, type_min(type)) < 0) - *val = type_min(type); return 1; } @@ -708,12 +698,12 @@ int get_absolute_min_sval(struct expression *expr, sval_t *sval) type = get_type(expr); *sval = _get_value(expr, &undefined, ABSOLUTE_MIN); if (undefined) { - sval->value = type_min(type); + *sval = sval_type_min(type); return 1; } - if (sval_cmp_val(*sval, type_min(type)) < 0) - sval->value = type_min(type); + if (sval_cmp(*sval, sval_type_min(type)) < 0) + *sval = sval_type_min(type); return 1; } @@ -727,7 +717,7 @@ int get_absolute_max_sval(struct expression *expr, sval_t *sval) return 1; } - if (type_max(sval->type) < sval->value) + if (sval_cmp(sval_type_max(sval->type), *sval) < 0) sval->value = sval_type_max(sval->type).value; return 1; } diff --git a/smatch_type.c b/smatch_type.c index 2e5cadca..09534e4e 100644 --- a/smatch_type.c +++ b/smatch_type.c @@ -27,6 +27,7 @@ struct symbol *get_real_base_type(struct symbol *sym) static struct symbol *get_binop_type(struct expression *expr) { struct symbol *left, *right; + sval_t left_max, right_max, int_max; left = get_type(expr->left); right = get_type(expr->right); @@ -39,18 +40,22 @@ static struct symbol *get_binop_type(struct expression *expr) if (right->type == SYM_PTR || right->type == SYM_ARRAY) return right; + left_max = sval_type_max(left); + right_max = sval_type_max(right); + int_max = sval_type_max(&int_ctype); + if (expr->op == SPECIAL_LEFTSHIFT || expr->op == SPECIAL_RIGHTSHIFT) { - if (type_max(left) < type_max(&int_ctype)) + if (sval_cmp(left_max, int_max) < 0) return &int_ctype; return left; } - if (type_max(left) < type_max(&int_ctype) && - type_max(right) < type_max(&int_ctype)) + if (sval_cmp(left_max, int_max) < 0 && + sval_cmp(right_max, int_max) < 0) return &int_ctype; - if (type_max(right) > type_max(left)) + if (sval_cmp(right_max, left_max) > 0) return right; return left; } -- 2.11.4.GIT