Print this page
11506 smatch resync

*** 93,102 **** --- 93,137 ---- right = strip_expr(expr->right); if (right->type == EXPR_PREOP && right->op == '&') set_state_expr(my_id, right->unop, &initialized); } + static void match_negative_comparison(struct expression *expr) + { + struct expression *success; + struct sm_state *sm; + sval_t max; + + /* + * In the kernel, people don't use "if (ret) {" and "if (ret < 0) {" + * consistently. Ideally Smatch would know the return but often it + * doesn't. + * + */ + + if (option_project != PROJ_KERNEL) + return; + + if (expr->type != EXPR_COMPARE || expr->op != '<') + return; + if (!is_zero(expr->right)) + return; + if (get_implied_max(expr->left, &max) && max.value == 0) + return; + + success = compare_expression(expr->left, SPECIAL_EQUAL, expr->right); + if (!assume(success)) + return; + + FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) { + if (sm->state == &initialized) + set_true_false_states(my_id, sm->name, sm->sym, NULL, &initialized); + } END_FOR_EACH_SM(sm); + + end_assume(); + } + static int is_initialized(struct expression *expr) { struct sm_state *sm; expr = strip_expr(expr);
*** 112,122 **** static void match_dereferences(struct expression *expr) { char *name; ! if (parse_error) return; if (expr->type != EXPR_PREOP) return; if (is_impossible_path()) --- 147,157 ---- static void match_dereferences(struct expression *expr) { char *name; ! if (implications_off || parse_error) return; if (expr->type != EXPR_PREOP) return; if (is_impossible_path())
*** 133,143 **** static void match_condition(struct expression *expr) { char *name; ! if (parse_error) return; if (is_impossible_path()) return; --- 168,178 ---- static void match_condition(struct expression *expr) { char *name; ! if (implications_off || parse_error) return; if (is_impossible_path()) return;
*** 263,273 **** static void match_symbol(struct expression *expr) { char *name; ! if (parse_error) return; if (is_impossible_path()) return; --- 298,308 ---- static void match_symbol(struct expression *expr) { char *name; ! if (implications_off || parse_error) return; if (is_impossible_path()) return;
*** 350,359 **** --- 385,395 ---- my_id = id; add_hook(&match_declarations, DECLARATION_HOOK); add_extra_mod_hook(&extra_mod_hook); add_hook(&match_assign, ASSIGNMENT_HOOK); + add_hook(&match_negative_comparison, CONDITION_HOOK); add_untracked_param_hook(&match_untracked); add_pre_merge_hook(my_id, &pre_merge_hook); add_hook(&match_dereferences, DEREF_HOOK); add_hook(&match_condition, CONDITION_HOOK);