2 * sparse/check_err_ptr.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 * Functions should never return both NULL and ERR_PTR().
15 #include "smatch_slist.h"
19 static int err_ptr
= 0;
20 static int returns_null
= 0;
22 static void match_err_ptr(struct expression
*expr
)
24 expr
= strip_expr(expr
);
27 if (expr
->type
!= EXPR_CALL
)
30 if (expr
->fn
->type
!= EXPR_SYMBOL
|| !expr
->fn
->symbol
)
32 if (!strcmp(expr
->fn
->symbol
->ident
->name
, "ERR_PTR"))
36 extern int check_assigned_expr_id
;
37 static void match_return(struct expression
*ret_value
)
39 struct state_list
*slist
;
43 match_err_ptr(ret_value
);
44 slist
= get_possible_states_expr(check_assigned_expr_id
, ret_value
);
45 FOR_EACH_PTR(slist
, tmp
) {
46 if (tmp
->state
== &undefined
|| tmp
->state
== &merged
)
48 match_err_ptr((struct expression
*)tmp
->state
->data
);
49 } END_FOR_EACH_PTR(tmp
);
51 if (get_implied_value(ret_value
, &val
)) {
57 static void match_end_func(struct symbol
*sym
)
59 if (returns_null
&& err_ptr
)
60 sm_msg("warn: returns both null and ERR_PTR.");
62 sm_msg("info: returns_err_ptr");
67 void check_err_ptr(int id
)
69 if (!option_spammy
|| option_project
!= PROJ_KERNEL
)
73 add_hook(&match_return
, RETURN_HOOK
);
74 add_hook(&match_end_func
, END_FUNC_HOOK
);