2 * sparse/check_err_ptr_deref.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 #include "smatch_slist.h"
18 static void check_is_err_ptr(struct sm_state
*sm
)
20 if (slist_has_state(sm
->possible
, &err_ptr
)) {
21 smatch_msg("error: '%s' dereferencing possible ERR_PTR()",
23 set_state(sm
->name
, my_id
, sm
->sym
, &checked
);
27 static void match_returns_err_ptr(const char *fn
, struct expression
*expr
,
30 char *left_name
= NULL
;
31 struct symbol
*left_sym
;
33 left_name
= get_variable_from_expr(expr
->left
, &left_sym
);
34 if (!left_name
|| !left_sym
)
36 set_state(left_name
, my_id
, left_sym
, &err_ptr
);
38 free_string(left_name
);
41 static void match_is_err(const char *fn
, struct expression
*expr
,
47 expr
= get_argument_from_call_expr(expr
->args
, 0);
48 if (expr
->type
== EXPR_ASSIGNMENT
)
50 name
= get_variable_from_expr(expr
, &sym
);
53 set_cond_states(name
, my_id
, sym
, &err_ptr
, &checked
);
58 static void match_dereferences(struct expression
*expr
)
61 struct symbol
*sym
= NULL
;
64 deref
= get_variable_from_expr(expr
->deref
->unop
, &sym
);
68 sm
= get_sm_state(deref
, my_id
, sym
);
75 static void register_err_ptr_funcs(void)
80 token
= get_tokens_file("kernel.returns_err_ptr");
83 if (token_type(token
) != TOKEN_STREAMBEGIN
)
86 while (token_type(token
) != TOKEN_STREAMEND
) {
87 if (token_type(token
) != TOKEN_IDENT
)
89 func
= show_ident(token
->ident
);
90 add_function_assign_hook(func
, &match_returns_err_ptr
, NULL
);
96 void check_err_ptr_deref(int id
)
99 add_conditional_hook("IS_ERR", &match_is_err
, NULL
);
100 register_err_ptr_funcs();
101 add_hook(&match_dereferences
, DEREF_HOOK
);