Print this page
11972 resync smatch

*** 26,35 **** --- 26,36 ---- #include "smatch_slist.h" #include "smatch_extra.h" static int my_whole_id; static int my_member_id; + static int skb_put_id; STATE(cleared); static void extra_mod_hook(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state) {
*** 122,144 **** if (!sym) return FALSE; return toplevel(sym->scope); } - static int was_initialized(struct expression *expr) - { - struct symbol *sym; - char *name; - - name = expr_to_var_sym(expr, &sym); - if (!name) - return 0; - if (sym->initializer) - return 1; - return 0; - } - static void match_clear(const char *fn, struct expression *expr, void *_arg_no) { struct expression *ptr; int arg_no = PTR_INT(_arg_no); --- 123,132 ----
*** 256,267 **** if (data->type != EXPR_SYMBOL) return; if (has_global_scope(data)) return; ! if (was_initialized(data)) return; if (was_memset(data)) return; if (warn_on_holey_struct(data)) return; check_members_initialized(data); --- 244,268 ---- if (data->type != EXPR_SYMBOL) return; if (has_global_scope(data)) return; ! if (was_memset(data)) return; + if (warn_on_holey_struct(data)) + return; + check_members_initialized(data); + } + + static void check_skb_put(struct expression *data) + { + data = strip_expr(data); + if (!data) + return; + if (data->type == EXPR_PREOP && data->op == '&') + data = strip_expr(data->unop); + if (was_memset(data)) return; if (warn_on_holey_struct(data)) return; check_members_initialized(data);
*** 289,308 **** return; match_clear(NULL, expr, INT_PTR(param)); } ! static void match_assign(struct expression *expr) { struct symbol *type; type = get_type(expr->left); if (!type || type->type != SYM_STRUCT) return; ! set_state_expr(my_whole_id, expr->left, &cleared); } static void register_clears_argument(void) { struct token *token; const char *func; int arg; --- 290,344 ---- return; match_clear(NULL, expr, INT_PTR(param)); } ! static struct smatch_state *alloc_expr_state(struct expression *expr) { + struct smatch_state *state; + char *name; + + name = expr_to_str(expr); + if (!name) + return NULL; + + state = __alloc_smatch_state(0); + expr = strip_expr(expr); + state->name = alloc_sname(name); + free_string(name); + state->data = expr; + return state; + } + + static void match_skb_put(const char *fn, struct expression *expr, void *unused) + { struct symbol *type; + struct smatch_state *state; type = get_type(expr->left); + type = get_real_base_type(type); if (!type || type->type != SYM_STRUCT) return; ! state = alloc_expr_state(expr->left); ! set_state_expr(skb_put_id, expr->left, state); } + static void match_return_skb_put(struct expression *expr) + { + struct sm_state *sm; + struct stree *stree; + + if (is_error_return(expr)) + return; + + stree = __get_cur_stree(); + + FOR_EACH_MY_SM(skb_put_id, stree, sm) { + check_skb_put(sm->state->data); + } END_FOR_EACH_SM(sm); + } + static void register_clears_argument(void) { struct token *token; const char *func; int arg;
*** 367,377 **** add_function_hook("__memcpy", &match_clear, INT_PTR(0)); add_function_hook("__memzero", &match_clear, INT_PTR(0)); add_function_hook("__builtin_memset", &match_clear, INT_PTR(0)); add_function_hook("__builtin_memcpy", &match_clear, INT_PTR(0)); - add_hook(&match_assign, ASSIGNMENT_HOOK); register_clears_argument(); select_return_states_hook(PARAM_CLEARED, &db_param_cleared); register_copy_funcs_from_file(); } --- 403,412 ----
*** 384,388 **** --- 419,434 ---- my_member_id = id; set_dynamic_states(my_member_id); add_extra_mod_hook(&extra_mod_hook); } + void check_rosenberg3(int id) + { + if (option_project != PROJ_KERNEL) + return; + + skb_put_id = id; + set_dynamic_states(skb_put_id); + add_function_assign_hook("skb_put", &match_skb_put, NULL); + add_hook(&match_return_skb_put, RETURN_HOOK); + } +