Print this page
12724 update smatch to 0.6.1-rc1-il-5

*** 30,43 **** static int implied_err_cast_return(struct expression *call, void *unused, struct range_list **rl) { struct expression *arg; arg = get_argument_from_call_expr(call->args, 0); ! if (!get_implied_rl(arg, rl)) { *rl = alloc_rl(err_ptr_min, err_ptr_max); ! *rl = cast_rl(get_type(arg), *rl); ! } return 1; } static void hack_ERR_PTR(struct symbol *sym) { --- 30,43 ---- static int implied_err_cast_return(struct expression *call, void *unused, struct range_list **rl) { struct expression *arg; arg = get_argument_from_call_expr(call->args, 0); ! if (!get_implied_rl(arg, rl)) *rl = alloc_rl(err_ptr_min, err_ptr_max); ! ! *rl = cast_rl(get_type(call), *rl); return 1; } static void hack_ERR_PTR(struct symbol *sym) {
*** 128,143 **** struct smatch_state *pre_state; struct range_list *rl; arg = get_argument_from_call_expr(call_expr->args, 0); pre_state = get_state_expr(SMATCH_EXTRA, arg); ! if (estate_rl(pre_state)) { ! rl = estate_rl(pre_state); ! rl = remove_range(rl, err_ptr_min, err_ptr_max); ! } else { rl = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval); - } rl = cast_rl(get_type(arg), rl); set_extra_expr_nomod(arg, alloc_estate_rl(rl)); } static void match_err(const char *fn, struct expression *call_expr, --- 128,140 ---- struct smatch_state *pre_state; struct range_list *rl; arg = get_argument_from_call_expr(call_expr->args, 0); pre_state = get_state_expr(SMATCH_EXTRA, arg); ! if (pre_state) ! return; rl = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval); rl = cast_rl(get_type(arg), rl); set_extra_expr_nomod(arg, alloc_estate_rl(rl)); } static void match_err(const char *fn, struct expression *call_expr,
*** 152,161 **** --- 149,166 ---- rl = estate_rl(pre_state); if (!rl) rl = alloc_rl(err_ptr_min, err_ptr_max); rl = rl_intersection(rl, alloc_rl(err_ptr_min, err_ptr_max)); rl = cast_rl(get_type(arg), rl); + if (pre_state && rl) { + /* + * Ideally this would all be handled by smatch_implied.c + * but it doesn't work very well for impossible paths. + * + */ + return; + } set_extra_expr_nomod(arg, alloc_estate_rl(rl)); } static void match_container_of_macro(const char *fn, struct expression *expr, void *unused) {
*** 255,266 **** start.value = 1; *rl = alloc_rl(start, end); return 1; } - - static void find_module_init_exit(struct symbol_list *sym_list) { struct symbol *sym; struct symbol *fn; struct statement *stmt; --- 260,269 ----
*** 404,413 **** --- 407,432 ---- __in_fake_assign++; __split_expr(assign); __in_fake_assign--; } + static void match_closure_call(const char *name, struct expression *call, + void *unused) + { + struct expression *cl, *fn, *fake_call; + struct expression_list *args = NULL; + + cl = get_argument_from_call_expr(call->args, 0); + fn = get_argument_from_call_expr(call->args, 1); + if (!fn || !cl) + return; + + add_ptr_list(&args, cl); + fake_call = call_expression(fn, args); + __split_expr(fake_call); + } + bool is_ignored_kernel_data(const char *name) { if (option_project != PROJ_KERNEL) return false;
*** 461,468 **** --- 480,489 ---- add_function_hook("__write_once_size", &match__write_once_size, NULL); add_function_hook("__read_once_size", &match__read_once_size, NULL); add_function_hook("__read_once_size_nocheck", &match__read_once_size, NULL); + add_function_hook("closure_call", &match_closure_call, NULL); + if (option_info) add_hook(match_end_file, END_FILE_HOOK); }