update smatch_scripts/ because of --info format changes
[smatch.git] / check_param_mapper.c
blobe485460e9a5167136c00f479c8363521304ad455
1 /*
2 * sparse/check_param_mapper.c
4 * Copyright (C) 2009 Your Name.
6 * Licensed under the Open Software License version 1.1
8 */
11 * The idea behind this test is that if we have:
12 * void foo(int bar)
13 * {
14 * baz(1, bar);
15 * }
17 * Passing "bar" to foo() really means passing "bar" to baz();
19 * In this case it would print:
20 * info: param_mapper 0 => bar 1
24 #include "smatch.h"
26 static int my_id;
28 STATE(argument);
30 static struct symbol *func_sym;
32 static void delete(const char *name, struct symbol *sym, struct expression *expr, void *unused)
34 delete_state(my_id, name, sym);
37 static void match_function_def(struct symbol *sym)
39 struct symbol *arg;
41 func_sym = sym;
42 FOR_EACH_PTR(func_sym->ctype.base_type->arguments, arg) {
43 if (!arg->ident) {
44 continue;
46 set_state(my_id, arg->ident->name, arg, &argument);
47 add_modification_hook(arg->ident->name, &delete, NULL);
48 } END_FOR_EACH_PTR(arg);
51 static int get_arg_num(struct expression *expr)
53 struct smatch_state *state;
54 struct symbol *arg;
55 struct symbol *this_arg;
56 int i;
58 expr = strip_expr(expr);
59 if (expr->type != EXPR_SYMBOL)
60 return -1;
61 this_arg = expr->symbol;
63 state = get_state_expr(my_id, expr);
64 if (!state || state != &argument)
65 return -1;
67 i = 0;
68 FOR_EACH_PTR(func_sym->ctype.base_type->arguments, arg) {
69 if (arg == this_arg)
70 return i;
71 i++;
72 } END_FOR_EACH_PTR(arg);
74 return -1;
77 static void match_call(struct expression *expr)
79 struct expression *tmp;
80 char *func;
81 int arg_num;
82 int i;
84 if (expr->fn->type != EXPR_SYMBOL)
85 return;
87 func = expr->fn->symbol_name->name;
89 i = 0;
90 FOR_EACH_PTR(expr->args, tmp) {
91 tmp = strip_expr(tmp);
92 arg_num = get_arg_num(tmp);
93 if (arg_num >= 0)
94 sm_msg("info: param_mapper %d => %s %d", arg_num, func, i);
95 i++;
96 } END_FOR_EACH_PTR(tmp);
99 void check_param_mapper(int id)
101 if (!option_param_mapper)
102 return;
103 my_id = id;
104 add_hook(&match_function_def, FUNC_DEF_HOOK);
105 add_hook(&match_call, FUNCTION_CALL_HOOK);