2 * sparse/check_param_mapper.c
4 * Copyright (C) 2009 Your Name.
6 * Licensed under the Open Software License version 1.1
11 * The idea behind this test is that if we have:
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
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
)
42 FOR_EACH_PTR(func_sym
->ctype
.base_type
->arguments
, arg
) {
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
;
55 struct symbol
*this_arg
;
58 expr
= strip_expr(expr
);
59 if (expr
->type
!= EXPR_SYMBOL
)
61 this_arg
= expr
->symbol
;
63 state
= get_state_expr(my_id
, expr
);
64 if (!state
|| state
!= &argument
)
68 FOR_EACH_PTR(func_sym
->ctype
.base_type
->arguments
, arg
) {
72 } END_FOR_EACH_PTR(arg
);
77 static void match_call(struct expression
*expr
)
79 struct expression
*tmp
;
84 if (expr
->fn
->type
!= EXPR_SYMBOL
)
87 func
= expr
->fn
->symbol_name
->name
;
90 FOR_EACH_PTR(expr
->args
, tmp
) {
91 tmp
= strip_expr(tmp
);
92 arg_num
= get_arg_num(tmp
);
94 sm_msg("info: param_mapper %d => %s %d", arg_num
, func
, i
);
96 } END_FOR_EACH_PTR(tmp
);
99 void check_param_mapper(int id
)
101 if (!option_param_mapper
)
104 add_hook(&match_function_def
, FUNC_DEF_HOOK
);
105 add_hook(&match_call
, FUNCTION_CALL_HOOK
);