From: Dan Carpenter Date: Fri, 11 Jan 2013 13:15:58 +0000 (+0300) Subject: smatch: introduce expr_to_str() X-Git-Tag: 1.57~61 X-Git-Url: https://repo.or.cz/w/smatch.git/commitdiff_plain/2f5f3c675a7ec54f120e93aaff0d6d1cb5ddd721 smatch: introduce expr_to_str() Ho ho ho. It's a late Christmas! Signed-off-by: Dan Carpenter --- diff --git a/check_bogus_loop.c b/check_bogus_loop.c index 30cf40ee..7411d8d9 100644 --- a/check_bogus_loop.c +++ b/check_bogus_loop.c @@ -58,9 +58,9 @@ static void match_loop(struct statement *stmt) return; iterator = get_iterator_set(stmt->iterator_pre_statement); - iter_set = expr_to_str_sym(iterator, NULL); + iter_set = expr_to_str(iterator); iterator = get_iterator_tested(stmt->iterator_pre_condition); - iter_tested = expr_to_str_sym(iterator, NULL); + iter_tested = expr_to_str(iterator); if (!iter_set || !iter_tested) goto free; if (strcmp(iter_set, iter_tested)) diff --git a/check_call_tree.c b/check_call_tree.c index adcc81dd..fa866a97 100644 --- a/check_call_tree.c +++ b/check_call_tree.c @@ -15,7 +15,7 @@ static void match_call(struct expression *expr) { char *fn_name; - fn_name = expr_to_str_sym(expr->fn, NULL); + fn_name = expr_to_str(expr->fn); if (!fn_name) return; sm_prefix(); diff --git a/check_container_of.c b/check_container_of.c index b28f8549..02b4bc07 100644 --- a/check_container_of.c +++ b/check_container_of.c @@ -39,7 +39,7 @@ static void match_condition(struct expression *expr) if (get_state_expr(my_id, expr) == &non_null) { char *name; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("warn: can '%s' even be NULL?", name); set_state_expr(my_id, expr, &undefined); free_string(name); diff --git a/check_dev_queue_xmit.c b/check_dev_queue_xmit.c index b3e784f1..e4df800f 100644 --- a/check_dev_queue_xmit.c +++ b/check_dev_queue_xmit.c @@ -59,7 +59,7 @@ static void match_symbol(struct expression *expr) return; if (valid_use()) return; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("error: '%s' was already used up by dev_queue_xmit()", name); free_string(name); } diff --git a/check_dma_on_stack.c b/check_dma_on_stack.c index 6d3ea263..20706dd3 100644 --- a/check_dma_on_stack.c +++ b/check_dma_on_stack.c @@ -34,7 +34,7 @@ static void match_dma_func(const char *fn, struct expression *expr, void *param) sym = get_type(arg); if (!sym || sym->type != SYM_ARRAY) return; - name = expr_to_str_sym(arg, NULL); + name = expr_to_str(arg); sm_msg("error: doing dma on the stack (%s)", name); free_string(name); } diff --git a/check_free.c b/check_free.c index f91466e6..a93716ef 100644 --- a/check_free.c +++ b/check_free.c @@ -42,7 +42,7 @@ static void match_symbol(struct expression *expr) if (!is_freed(expr)) return; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("warn: '%s' was already freed.", name); free_string(name); } diff --git a/check_freeing_null.c b/check_freeing_null.c index 1302f712..72fb9f4a 100644 --- a/check_freeing_null.c +++ b/check_freeing_null.c @@ -22,7 +22,7 @@ static void match_free(const char *fn, struct expression *expr, void *data) return; if (sval.value != 0) return; - name = expr_to_str_sym(arg_expr, NULL); + name = expr_to_str(arg_expr); sm_msg("warn: calling %s() when '%s' is always NULL.", fn, name); free_string(name); } diff --git a/check_get_user_overflow.c b/check_get_user_overflow.c index 88c77700..e1b0782e 100644 --- a/check_get_user_overflow.c +++ b/check_get_user_overflow.c @@ -96,7 +96,7 @@ static void match_assign(struct expression *expr) match_normal_assign(expr); return; } - name = expr_to_str_sym(expr->right, NULL); + name = expr_to_str(expr->right); if (!name || strcmp(name, "__val_gu") != 0) goto free; set_state_expr(my_max_id, expr->left, &user_data); diff --git a/check_info_leak.c b/check_info_leak.c index 563a1f77..7a1e6af2 100644 --- a/check_info_leak.c +++ b/check_info_leak.c @@ -67,7 +67,7 @@ static void match_copy_to_user(const char *fn, struct expression *expr, void *un sm = get_sm_state(my_id, name, sym); if (!sm || !slist_has_state(sm->possible, &string)) return; - name = expr_to_str_sym(src, NULL); + name = expr_to_str(src); sm_msg("warn: possible info leak '%s'", name); free_string(name); } diff --git a/check_kmalloc_to_bugon.c b/check_kmalloc_to_bugon.c index 4911b070..5f7ef00b 100644 --- a/check_kmalloc_to_bugon.c +++ b/check_kmalloc_to_bugon.c @@ -43,7 +43,7 @@ static void match_condition(struct expression *expr) if (!is_kmalloc_call(right)) return; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("warn: bug on allocation failure '%s'", name); free_string(name); } diff --git a/check_kunmap.c b/check_kunmap.c index 5a18c462..a92a1e3c 100644 --- a/check_kunmap.c +++ b/check_kunmap.c @@ -24,7 +24,7 @@ static void check_assignment(void *data) return; if (expr->type != EXPR_CALL) return; - fn = expr_to_str_sym(expr->fn, NULL); + fn = expr_to_str(expr->fn); if (!fn) return; if (!strcmp(fn, "kmap")) diff --git a/check_leaks.c b/check_leaks.c index f85fba93..8a8cf72c 100644 --- a/check_leaks.c +++ b/check_leaks.c @@ -179,7 +179,7 @@ static void warn_if_allocated(struct expression *expr) if (!slist_has_state(sm->possible, &allocated)) return; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("warn: overwrite may leak '%s'", name); free_string(name); diff --git a/check_locking.c b/check_locking.c index 4b8f125c..079202ff 100644 --- a/check_locking.c +++ b/check_locking.c @@ -368,7 +368,7 @@ static char *get_full_name(struct expression *expr, int index) struct lock_info *lock = &lock_table[index]; if (lock->arg == RETURN_VAL) { - name = expr_to_str_sym(expr->left, NULL); + name = expr_to_str(expr->left); full_name = make_full_name(lock->name, name); } else if (lock->arg == NO_ARG) { full_name = make_full_name(lock->name, ""); diff --git a/check_memory.c b/check_memory.c index 87ba8a5f..afdf38f1 100644 --- a/check_memory.c +++ b/check_memory.c @@ -65,7 +65,7 @@ static int is_complex(struct expression *expr) char *name; int ret = 1; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); if (name) ret = 0; free_string(name); diff --git a/check_missing_break.c b/check_missing_break.c index f6705242..ce5ba3a8 100644 --- a/check_missing_break.c +++ b/check_missing_break.c @@ -65,7 +65,7 @@ static void match_assign(struct expression *expr) if (get_state_expr(my_id, left) == &no_break) { char *name; - name = expr_to_str_sym(left, NULL); + name = expr_to_str(left); sm_msg("warn: missing break? reassigning '%s'", name); free_string(name); } diff --git a/check_overflow.c b/check_overflow.c index fa34cbe0..4f6f9117 100644 --- a/check_overflow.c +++ b/check_overflow.c @@ -165,7 +165,7 @@ static void match_condition(struct expression *expr) if (boundary < 1 && boundary > -1) { char *name; - name = expr_to_str_sym((left ? expr->right : expr->left), NULL); + name = expr_to_str(left ? expr->right : expr->left); sm_msg("error: testing array offset '%s' after use.", name); return; } @@ -232,7 +232,7 @@ static void match_snprintf(const char *fn, struct expression *expr, void *unused if (dest_size && dest_size < limit_size.value) sm_msg("error: snprintf() is printing too much %s vs %d", sval_to_str(limit_size), dest_size); - format = expr_to_str_sym(format_string, NULL); + format = expr_to_str(format_string); if (!format) return; if (strcmp(format, "\"%s\"")) @@ -264,7 +264,7 @@ static void match_sprintf(const char *fn, struct expression *expr, void *unused) dest_size = get_array_size_bytes(dest); if (!dest_size) return; - format = expr_to_str_sym(format_string, NULL); + format = expr_to_str(format_string); if (!format) return; if (strcmp(format, "\"%s\"")) diff --git a/check_passes_sizeof.c b/check_passes_sizeof.c index 253de25e..835b712f 100644 --- a/check_passes_sizeof.c +++ b/check_passes_sizeof.c @@ -98,7 +98,7 @@ static void match_call(struct expression *call) if (call->fn->type != EXPR_SYMBOL) return; - name = expr_to_str_sym(call->fn, NULL); + name = expr_to_str(call->fn); FOR_EACH_PTR(call->args, arg) { i++; if (arg->type != EXPR_SIZEOF) diff --git a/check_pointer_math.c b/check_pointer_math.c index 39d2a7f2..71f7d987 100644 --- a/check_pointer_math.c +++ b/check_pointer_math.c @@ -97,7 +97,7 @@ static void check_assign(struct expression *expr) return; if (!is_size_in_bytes(expr->right)) return; - name = expr_to_str_sym(expr->left, NULL); + name = expr_to_str(expr->left); sm_msg("warn: potential pointer math issue ('%s' is a %d bit pointer)", name, type_bits(type)); free_string(name); diff --git a/check_proc_create.c b/check_proc_create.c index 5497ad91..31bdbdf7 100644 --- a/check_proc_create.c +++ b/check_proc_create.c @@ -34,7 +34,7 @@ static void match_create(const char *fn, struct expression *expr, void *_param_t if (!(sval.uvalue & S_IWOTH)) return; arg_expr = get_argument_from_call_expr(expr->args, param_index[idx].name_param); - name = expr_to_str_sym(arg_expr, NULL); + name = expr_to_str(arg_expr); sm_msg("warn: proc file '%s' is world writable", name); free_string(name); } diff --git a/check_propagate.c b/check_propagate.c index f7a3f2c0..07f7ede3 100644 --- a/check_propagate.c +++ b/check_propagate.c @@ -25,7 +25,7 @@ static char *get_fn_name(struct expression *expr) return NULL; if (expr->fn->type != EXPR_SYMBOL) return NULL; - return expr_to_str_sym(expr->fn, NULL); + return expr_to_str(expr->fn); } static void match_call_assignment(struct expression *expr) @@ -55,7 +55,7 @@ static void match_return(struct expression *ret_value) return; if (get_implied_min(last_return, &lret)) return; - name = expr_to_str_sym(last_return, NULL); + name = expr_to_str(last_return); sm_msg("info: why not propagate '%s' from %s() instead of %s?", name, get_fn_name(last_func), sval_to_str(rval)); free_string(name); diff --git a/check_redundant_null_check.c b/check_redundant_null_check.c index 08329d54..67e60bd5 100644 --- a/check_redundant_null_check.c +++ b/check_redundant_null_check.c @@ -61,10 +61,10 @@ static void dont_check(const char *fn, struct expression *expr, void *unused) return; arg = get_argument_from_call_expr(expr->args, 0); - name = expr_to_str_sym(arg, NULL); + name = expr_to_str(arg); if (!name) goto free; - condition_name = expr_to_str_sym(previous_condition, NULL); + condition_name = expr_to_str(previous_condition); if (!condition_name) goto free; if (!strcmp(name, condition_name)) diff --git a/check_rosenberg.c b/check_rosenberg.c index 4ec2281d..26c2a886 100644 --- a/check_rosenberg.c +++ b/check_rosenberg.c @@ -181,7 +181,7 @@ static void match_copy_to_user(const char *fn, struct expression *expr, void *un if (holey_struct(data)) { char *name; - name = expr_to_str_sym(data, NULL); + name = expr_to_str(data); sm_msg("warn: check that '%s' doesn't leak information (struct has holes)", name); free_string(name); return; diff --git a/check_sizeof.c b/check_sizeof.c index 53209466..0cd4f505 100644 --- a/check_sizeof.c +++ b/check_sizeof.c @@ -57,7 +57,7 @@ static void check_passes_pointer(char *name, struct expression *call) char *ptr_name; FOR_EACH_PTR(call->args, arg) { - ptr_name = expr_to_str_sym(arg, NULL); + ptr_name = expr_to_str(arg); if (!ptr_name) continue; if (strcmp(name, ptr_name) == 0) @@ -78,7 +78,7 @@ static void match_check_params(struct expression *call) obj = strip_expr(arg->cast_expression); if (!is_pointer(obj)) continue; - name = expr_to_str_sym(obj, NULL); + name = expr_to_str(obj); if (!name) continue; check_passes_pointer(name, call); diff --git a/check_template.c b/check_template.c index 07de525c..8119e6d7 100644 --- a/check_template.c +++ b/check_template.c @@ -58,12 +58,12 @@ static void match_call(struct expression *expr) struct expression *sem_expr; char *sem_name; - fn_name = expr_to_str_sym(expr->fn, NULL); + fn_name = expr_to_str(expr->fn); if (!fn_name || (strcmp(fn_name, "down") && strcmp(fn_name, "up"))) goto free_fn; sem_expr = get_argument_from_call_expr(expr->args, 0); - sem_name = expr_to_str_sym(sem_expr, NULL); + sem_name = expr_to_str(sem_expr); if (!strcmp(fn_name, "down")) { set_state(my_id, sem_name, NULL, &lock); } else { diff --git a/check_unused_ret.c b/check_unused_ret.c index e9b6d64f..fc8cd506 100644 --- a/check_unused_ret.c +++ b/check_unused_ret.c @@ -71,7 +71,7 @@ static char *get_fn_name(struct expression *expr) return NULL; if (expr->fn->type != EXPR_SYMBOL) return NULL; - return expr_to_str_sym(expr->fn, NULL); + return expr_to_str(expr->fn); } static int ignored_function(struct expression *expr) @@ -115,7 +115,7 @@ static void match_assign_call(struct expression *expr) assign = __alloc_assignment(0); assign->assign_id = assign_id++; - assign->name = expr_to_str_sym(left, NULL); + assign->name = expr_to_str(left); assign->function = get_fn_name(expr->right); assign->line = get_lineno(); add_ptr_list(&assignment_list, assign); diff --git a/check_user_data.c b/check_user_data.c index 7d3044ce..463cdec5 100644 --- a/check_user_data.c +++ b/check_user_data.c @@ -252,7 +252,7 @@ static void match_assign(struct expression *expr) match_normal_assign(expr); return; } - name = expr_to_str_sym(expr->right, NULL); + name = expr_to_str(expr->right); if (!name || strcmp(name, "__val_gu") != 0) goto free; set_state_expr(my_id, expr->left, &user_data); diff --git a/check_wine_WtoA.c b/check_wine_WtoA.c index 93dbef58..0d99de62 100644 --- a/check_wine_WtoA.c +++ b/check_wine_WtoA.c @@ -60,7 +60,7 @@ static void match_call(struct expression *expr) if (!in_w) return; - fn_name = expr_to_str_sym(expr->fn, NULL); + fn_name = expr_to_str(expr->fn); if (!fn_name) goto free; len = strlen(fn_name); diff --git a/check_wine_filehandles.c b/check_wine_filehandles.c index 934dbbf5..7019239e 100644 --- a/check_wine_filehandles.c +++ b/check_wine_filehandles.c @@ -64,7 +64,7 @@ static void match_condition(struct expression *expr) if (get_state_expr(my_id, expr) == &filehandle) { char *name; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); sm_msg("error: comparing a filehandle against zero '%s'", name); set_state_expr(my_id, expr, &oktocheck); free_string(name); diff --git a/smatch.h b/smatch.h index df843f2d..08af3419 100644 --- a/smatch.h +++ b/smatch.h @@ -222,10 +222,13 @@ void free_string(char *str); struct smatch_state *alloc_state_num(int num); struct expression *get_argument_from_call_expr(struct expression_list *args, int num); + +char *expr_to_str(struct expression *expr); char *expr_to_str_sym_complex(struct expression *expr, struct symbol **sym_ptr); char *expr_to_str_sym(struct expression *expr, struct symbol **sym_ptr); + int sym_name_is(const char *name, struct expression *expr); int get_value(struct expression *expr, sval_t *val); int get_implied_value(struct expression *expr, sval_t *val); diff --git a/smatch_buf_size.c b/smatch_buf_size.c index d5a103e7..2f8cb3ab 100644 --- a/smatch_buf_size.c +++ b/smatch_buf_size.c @@ -148,7 +148,7 @@ static int size_from_db(struct expression *expr) name = get_member_name(expr); if (!name && is_static(expr)) { - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); this_file_only = 1; } if (!name) @@ -491,7 +491,7 @@ static void info_record_alloction(struct expression *buffer, struct expression * name = get_member_name(buffer); if (!name && is_static(buffer)) - name = expr_to_str_sym(buffer, NULL); + name = expr_to_str(buffer); if (!name) return; if (get_implied_value(size, &sval)) @@ -547,7 +547,7 @@ static void match_strlen(const char *fn, struct expression *expr, void *unused) str = get_argument_from_call_expr(right->args, 0); len_expr = strip_expr(expr->left); - len_name = expr_to_str_sym(len_expr, NULL); + len_name = expr_to_str(len_expr); if (!len_name) return; diff --git a/smatch_db.c b/smatch_db.c index bc67d962..a85de1f4 100644 --- a/smatch_db.c +++ b/smatch_db.c @@ -394,7 +394,7 @@ static void match_function_assign(struct expression *expr) if (!sym || sym->type != SYM_FN) return; - fn_name = expr_to_str_sym(right, NULL); + fn_name = expr_to_str(right); ptr_name = get_fnptr_name(expr->left); if (!fn_name || !ptr_name) goto free; @@ -643,7 +643,7 @@ static void print_returned_struct_members(int return_id, char *return_ranges, st type = get_real_base_type(type); if (!type || type->type != SYM_STRUCT) return; - name = expr_to_str_sym(expr, NULL); + name = expr_to_str(expr); if (!name) return; diff --git a/smatch_function_hooks.c b/smatch_function_hooks.c index ea39d292..09797049 100644 --- a/smatch_function_hooks.c +++ b/smatch_function_hooks.c @@ -718,7 +718,7 @@ int get_implied_return(struct expression *expr, struct range_list **rl) *rl = NULL; expr = strip_expr(expr); - fn = expr_to_str_sym(expr->fn, NULL); + fn = expr_to_str(expr->fn); if (!fn) goto out; diff --git a/smatch_helper.c b/smatch_helper.c index 3d8618af..2be5f551 100644 --- a/smatch_helper.c +++ b/smatch_helper.c @@ -291,6 +291,11 @@ char *expr_to_str_sym(struct expression *expr, return alloc_string(var_name); } +char *expr_to_str(struct expression *expr) +{ + return expr_to_str_sym(expr, NULL); +} + int sym_name_is(const char *name, struct expression *expr) { if (!expr) @@ -467,7 +472,7 @@ char *get_member_name(struct expression *expr) char *get_fnptr_name(struct expression *expr) { if (expr->type == EXPR_SYMBOL) - return expr_to_str_sym(expr, NULL); + return expr_to_str(expr); return get_member_name(expr); }