smatch: introduce expr_to_str()
authorDan Carpenter <dan.carpenter@oracle.com>
Fri, 11 Jan 2013 13:15:58 +0000 (11 16:15 +0300)
committerDan Carpenter <dan.carpenter@oracle.com>
Fri, 11 Jan 2013 13:15:58 +0000 (11 16:15 +0300)
Ho ho ho.  It's a late Christmas!

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
33 files changed:
check_bogus_loop.c
check_call_tree.c
check_container_of.c
check_dev_queue_xmit.c
check_dma_on_stack.c
check_free.c
check_freeing_null.c
check_get_user_overflow.c
check_info_leak.c
check_kmalloc_to_bugon.c
check_kunmap.c
check_leaks.c
check_locking.c
check_memory.c
check_missing_break.c
check_overflow.c
check_passes_sizeof.c
check_pointer_math.c
check_proc_create.c
check_propagate.c
check_redundant_null_check.c
check_rosenberg.c
check_sizeof.c
check_template.c
check_unused_ret.c
check_user_data.c
check_wine_WtoA.c
check_wine_filehandles.c
smatch.h
smatch_buf_size.c
smatch_db.c
smatch_function_hooks.c
smatch_helper.c

index 30cf40e..7411d8d 100644 (file)
@@ -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))
index adcc81d..fa866a9 100644 (file)
@@ -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();
index b28f854..02b4bc0 100644 (file)
@@ -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);
index b3e784f..e4df800 100644 (file)
@@ -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);
 }
index 6d3ea26..20706dd 100644 (file)
@@ -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);
 }
index f91466e..a93716e 100644 (file)
@@ -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);
 }
index 1302f71..72fb9f4 100644 (file)
@@ -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);
 }
index 88c7770..e1b0782 100644 (file)
@@ -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);
index 563a1f7..7a1e6af 100644 (file)
@@ -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);
 }
index 4911b07..5f7ef00 100644 (file)
@@ -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);
 }
index 5a18c46..a92a1e3 100644 (file)
@@ -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"))
index f85fba9..8a8cf72 100644 (file)
@@ -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);
 
index 4b8f125..079202f 100644 (file)
@@ -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, "");
index 87ba8a5..afdf38f 100644 (file)
@@ -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);
index f670524..ce5ba3a 100644 (file)
@@ -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);
        }
index fa34cbe..4f6f911 100644 (file)
@@ -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\""))
index 253de25..835b712 100644 (file)
@@ -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)
index 39d2a7f..71f7d98 100644 (file)
@@ -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);
index 5497ad9..31bdbdf 100644 (file)
@@ -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);
 }
index f7a3f2c..07f7ede 100644 (file)
@@ -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);
index 08329d5..67e60bd 100644 (file)
@@ -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))
index 4ec2281..26c2a88 100644 (file)
@@ -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;
index 5320946..0cd4f50 100644 (file)
@@ -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);
index 07de525..8119e6d 100644 (file)
@@ -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 {
index e9b6d64..fc8cd50 100644 (file)
@@ -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);
index 7d3044c..463cdec 100644 (file)
@@ -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);
index 93dbef5..0d99de6 100644 (file)
@@ -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);
index 934dbbf..7019239 100644 (file)
@@ -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);
index df843f2..08af341 100644 (file)
--- 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);
index d5a103e..2f8cb3a 100644 (file)
@@ -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;
 
index bc67d96..a85de1f 100644 (file)
@@ -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;
 
index ea39d29..0979704 100644 (file)
@@ -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;
 
index 3d8618a..2be5f55 100644 (file)
@@ -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);
 }