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);