spelling: memery => memory
[smatch.git] / check_deref_check.c
blob5dbdf67894f21cd88d5c62169a18e97698b009a1
1 /*
2 * sparse/check_deref_check.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
12 static int my_id;
14 STATE(derefed);
15 STATE(oktocheck);
17 static void underef(const char *name, struct symbol *sym, struct expression *expr, void *unused)
19 set_state(my_id, name, sym, &oktocheck);
22 static void match_dereference(struct expression *expr)
24 char *name;
26 if (expr->type == EXPR_PREOP) {
27 expr = strip_expr(expr->unop);
28 } else {
29 if (strcmp(show_special(expr->deref->op), "*"))
30 return;
31 expr = expr->deref->unop;
32 expr = strip_expr(expr);
35 set_state_expr(my_id, expr, &derefed);
37 name = get_variable_from_expr(expr, NULL);
38 if (!name)
39 return;
40 add_modification_hook(name, &underef, NULL);
41 free_string(name);
45 static void match_condition(struct expression *expr)
47 if (get_state_expr(my_id, expr) == &derefed) {
48 char *name;
50 name = get_variable_from_expr(expr, NULL);
51 sm_msg("warn: variable derefenced before check '%s'",
52 name);
53 set_state_expr(my_id, expr, &oktocheck);
54 free_string(name);
59 void check_deref_check(int id)
61 my_id = id;
62 set_default_state(my_id, &oktocheck);
63 add_hook(&match_dereference, DEREF_HOOK);
64 add_hook(&match_condition, CONDITION_HOOK);