From 512a2654589af6804fce275c05983cc12fcd47ef Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 25 Nov 2009 17:08:06 +0200 Subject: [PATCH] [patch 7/many] no UNDEFINED from get_value() There was also a clean up in one of the checks from an earlier change. Apparently modifying smatch_extra.h doesn't cause the checks to recompile. :/ Need to fix that. Signed-off-by: Dan Carpenter --- check_allocation_funcs.c | 3 ++- check_leaks.c | 5 ++--- check_overflow.c | 9 ++++---- check_template.c | 5 ++--- smatch.h | 2 +- smatch_extra.c | 55 ++++++++++++++++++++---------------------------- smatch_helper.c | 21 +++++++++--------- smatch_implied.c | 11 ++++------ 8 files changed, 49 insertions(+), 62 deletions(-) diff --git a/check_allocation_funcs.c b/check_allocation_funcs.c index 7d4f62bb..03d66c41 100644 --- a/check_allocation_funcs.c +++ b/check_allocation_funcs.c @@ -51,8 +51,9 @@ static void match_return(struct expression *ret_value) { char *name; struct symbol *sym; + long long tmp; - if (get_value(ret_value) == 0) + if (get_value(ret_value, &tmp) && tmp == 0) return; returns_new_stuff = 1; name = get_variable_from_expr(ret_value, &sym); diff --git a/check_leaks.c b/check_leaks.c index 4a1e2c78..fb10c0bf 100644 --- a/check_leaks.c +++ b/check_leaks.c @@ -148,13 +148,12 @@ free: static void match_return(struct expression *ret_value) { - int ret_val; + long long ret_val; char *skip_name; struct symbol *skip_sym; - ret_val = get_value(ret_value); skip_name = get_variable_from_expr(ret_value, &skip_sym); - if (ret_val == UNDEFINED) { + if (!get_value(ret_value, &ret_val)) { do_implication_check(ret_value, skip_name, skip_sym); return; } diff --git a/check_overflow.c b/check_overflow.c index 9fd92adf..e70b28f6 100644 --- a/check_overflow.c +++ b/check_overflow.c @@ -184,7 +184,7 @@ static void array_check(struct expression *expr) print_args(offset, array_size); } else if (array_size <= max) { name = get_variable_from_expr(dest, NULL); - sm_msg("error: buffer overflow '%s' %d <= %d", name, array_size, max); + sm_msg("error: buffer overflow '%s' %d <= %lld", name, array_size, max); free_string(name); } } @@ -270,20 +270,21 @@ static void match_limitted(const char *fn, struct expression *expr, struct expression *data; char *dest_name = NULL; struct smatch_state *state; - int needed; + long long needed; int has; dest = get_argument_from_call_expr(expr->args, 0); dest_name = get_variable_from_expr(dest, NULL); data = get_argument_from_call_expr(expr->args, PTR_INT(limit_arg)); - needed = get_value(data); + if (!get_value(data, &needed)) + goto free; state = get_state(my_id, dest_name, NULL); if (!state || !state->data) goto free; has = *(int *)state->data / 8; if (has < needed) - sm_msg("error: %s too small for %d bytes.", dest_name, + sm_msg("error: %s too small for %lld bytes.", dest_name, needed); free: free_string(dest_name); diff --git a/check_template.c b/check_template.c index 6d11d0e4..dc17476c 100644 --- a/check_template.c +++ b/check_template.c @@ -76,12 +76,11 @@ free_fn: static void match_return(struct expression *ret_value) { - int ret_val; + long long ret_val; struct state_list *slist; struct sm_state *tmp; - ret_val = get_value(ret_value); - if (ret_val == UNDEFINED || ret_val >= 0) + if (!get_value(ret_value, &ret_val) || ret_val >= 0) return; slist = get_all_states(my_id); diff --git a/smatch.h b/smatch.h index ad358fac..dfe6d578 100644 --- a/smatch.h +++ b/smatch.h @@ -164,7 +164,7 @@ char *get_variable_from_expr(struct expression *expr, struct symbol **sym_ptr); struct symbol *get_ptr_type(struct expression *expr); int sym_name_is(const char *name, struct expression *expr); -int get_value(struct expression *expr); +int get_value(struct expression *expr, long long *val); int get_implied_value(struct expression *expr, long long *val); int is_zero(struct expression *expr); int is_array(struct expression *expr); diff --git a/smatch_extra.c b/smatch_extra.c index f7b26e68..1cfe02b1 100644 --- a/smatch_extra.c +++ b/smatch_extra.c @@ -46,10 +46,7 @@ static struct smatch_state *alloc_extra_state_no_name(int val) struct smatch_state *state; state = __alloc_smatch_state(0); - if (val == UNDEFINED) - state->data = (void *)alloc_dinfo_range(whole_range.min, whole_range.max); - else - state->data = (void *)alloc_dinfo_range(val, val); + state->data = (void *)alloc_dinfo_range(val, val); return state; } @@ -75,8 +72,6 @@ struct smatch_state *alloc_extra_state(int val) { struct smatch_state *state; - if (val == UNDEFINED) - return extra_undefined(); state = alloc_extra_state_no_name(val); state->name = show_ranges(((struct data_info *)state->data)->value_ranges); return state; @@ -218,10 +213,8 @@ void __extra_pre_loop_hook_after(struct sm_state *sm, if (condition->type != EXPR_COMPARE) return; - value = get_value(condition->left); - if (value == UNDEFINED) { - value = get_value(condition->right); - if (value == UNDEFINED) + if (!get_value(condition->left, &value)) { + if (!get_value(condition->right, &value)) return; left = 1; } @@ -277,12 +270,16 @@ static void match_assign(struct expression *expr) struct expression *left; struct symbol *sym; char *name; + long long value; left = strip_expr(expr->left); name = get_variable_from_expr(left, &sym); if (!name) return; - set_state(my_id, name, sym, alloc_extra_state(get_value(expr->right))); + if (get_value(expr->right, &value)) + set_state(my_id, name, sym, alloc_extra_state(value)); + else + set_state(my_id, name, sym, extra_undefined()); free_string(name); } @@ -318,11 +315,15 @@ free: static void match_declarations(struct symbol *sym) { const char *name; + long long val; if (sym->ident) { name = sym->ident->name; if (sym->initializer) { - set_state(my_id, name, sym, alloc_extra_state(get_value(sym->initializer))); + if (get_value(sym->initializer, &val)) + set_state(my_id, name, sym, alloc_extra_state(val)); + else + set_state(my_id, name, sym, extra_undefined()); scoped_state(name, my_id, sym); } else { set_state(my_id, name, sym, extra_undefined()); @@ -354,8 +355,7 @@ static int get_implied_value_helper(struct expression *expr, long long *val, int struct symbol *sym; char *name; - *val = get_value(expr); - if (*val != UNDEFINED) + if (get_value(expr, val)) return 1; name = get_variable_from_expr(expr, &sym); @@ -405,10 +405,7 @@ static int last_stmt_val(struct statement *stmt, long long *val) if (stmt->type != STMT_EXPRESSION) return 0; expr = stmt->expression; - *val = get_value(expr); - if (*val == UNDEFINED) - return 0; - return 1; + return get_value(expr, val); } static void match_comparison(struct expression *expr) @@ -423,10 +420,8 @@ static void match_comparison(struct expression *expr) int comparison = expr->op; struct expression *varies = expr->right; - fixed = get_value(expr->left); - if (fixed == UNDEFINED) { - fixed = get_value(expr->right); - if (fixed == UNDEFINED) + if (!get_value(expr->left, &fixed)) { + if (!get_value(expr->right, &fixed)) return; varies = expr->left; left = 1; @@ -560,13 +555,12 @@ exit: int known_condition_true(struct expression *expr) { - int tmp; + long long tmp; if (!expr) return 0; - tmp = get_value(expr); - if (tmp && tmp != UNDEFINED) + if (get_value(expr, &tmp) && tmp) return 1; expr = strip_expr(expr); @@ -615,10 +609,8 @@ static int do_comparison_range(struct expression *expr) int left = 0; int poss_true, poss_false; - value = get_value(expr->left); - if (value == UNDEFINED) { - value = get_value(expr->right); - if (value == UNDEFINED) + if (!get_value(expr->left, &value)) { + if (!get_value(expr->right, &value)) return 3; left = 1; } @@ -649,14 +641,13 @@ free: int implied_condition_true(struct expression *expr) { struct statement *stmt; - int tmp; + long long tmp; long long val; if (!expr) return 0; - tmp = get_value(expr); - if (tmp && tmp != UNDEFINED) + if (get_value(expr, &tmp) && tmp) return 1; expr = strip_expr(expr); diff --git a/smatch_helper.c b/smatch_helper.c index 9c6b6858..517d652c 100644 --- a/smatch_helper.c +++ b/smatch_helper.c @@ -432,17 +432,15 @@ static int _get_value(struct expression *expr, int *discard, int *undefined, int return ret; } -/* returns UNDEFINED on error */ -int get_value(struct expression *expr) +/* returns 1 if it can get a value literal or else returns 0 */ +int get_value(struct expression *expr, long long *val) { int undefined = 0; - int ret; - ret = _get_value(expr, NULL, &undefined, NOTIMPLIED); + *val = _get_value(expr, NULL, &undefined, NOTIMPLIED); if (undefined) - return UNDEFINED; - else - return ret; + return 0; + return 1; } int get_implied_value(struct expression *expr, long long *val) @@ -455,7 +453,9 @@ int get_implied_value(struct expression *expr, long long *val) int is_zero(struct expression *expr) { - if (get_value(expr) == 0) + long long val; + + if (get_value(expr, &val) && val == 0) return 1; return 0; } @@ -542,7 +542,7 @@ void scoped_state(const char *name, int my_id, struct symbol *sym) int is_error_return(struct expression *expr) { struct symbol *cur_func = cur_func_sym; - int val; + long long val; if (!expr) return 0; @@ -554,8 +554,7 @@ int is_error_return(struct expression *expr) cur_func = get_base_type(cur_func); if (cur_func == &void_ctype) return 0; - val = get_value(expr); - if (val == UNDEFINED) + if (!get_value(expr, &val)) return 0; if (val < 0) return 1; diff --git a/smatch_implied.c b/smatch_implied.c index 5eb0e8ab..3f9636f6 100644 --- a/smatch_implied.c +++ b/smatch_implied.c @@ -325,13 +325,11 @@ static void handle_comparison(struct expression *expr, struct symbol *sym; char *name; struct sm_state *state; - int value; + long long value; int left = 0; - value = get_value(expr->left); - if (value == UNDEFINED) { - value = get_value(expr->right); - if (value == UNDEFINED) + if (!get_value(expr->left, &value)) { + if (!get_value(expr->right, &value)) return; left = 1; } @@ -471,8 +469,7 @@ struct state_list *__implied_case_slist(struct expression *switch_expr, if (!case_expr) { vals = top_range_list(*remaining_cases); } else { - val = get_value(case_expr); - if (val == UNDEFINED) { + if (!get_value(case_expr, &val)) { goto free; } else { filter_top_range_list(remaining_cases, val); -- 2.11.4.GIT