locking: add some more mutex functions.
[smatch.git] / check_frees_argument.c
blobf87f7af6483f50919fb5800933e9ade37a1e55a3
1 /*
2 * sparse/check_frees_argument.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 /*
11 * This script is for finding functions like hcd_buffer_free() which free
12 * their arguments. After running it, add those functions to check_memory.c
15 #include "smatch.h"
17 static int my_id;
19 static struct symbol *this_func;
21 static void match_function_def(struct symbol *sym)
23 this_func = sym;
26 static void print_if_arg(char *name, struct symbol *sym)
28 struct symbol *arg;
29 const char *arg_name;
30 int i = 0;
32 FOR_EACH_PTR(this_func->ctype.base_type->arguments, arg) {
33 arg_name = (arg->ident?arg->ident->name:"-");
34 if (sym == arg && !strcmp(name, arg_name))
35 smatch_msg("info: frees argument %d", i);
36 i++;
37 } END_FOR_EACH_PTR(arg);
40 static void match_call(struct expression *expr)
42 char *fn_name;
43 struct expression *tmp;
44 struct symbol *sym;
45 char *name;
47 fn_name = get_variable_from_expr(expr->fn, NULL);
48 if (!fn_name || strcmp(fn_name, "kfree"))
49 goto free;
51 FOR_EACH_PTR(expr->args, tmp) {
52 tmp = strip_expr(tmp);
53 name = get_variable_from_expr(tmp, &sym);
54 print_if_arg(name, sym);
55 free_string(name);
56 } END_FOR_EACH_PTR(tmp);
57 free:
58 free_string(fn_name);
61 void register_frees_argument(int id)
63 my_id = id;
64 add_hook(&match_function_def, FUNC_DEF_HOOK);
65 add_hook(&match_call, FUNCTION_CALL_HOOK);