Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_constraints.c
          +++ new/usr/src/tools/smatch/src/smatch_constraints.c
↓ open down ↓ 188 lines elided ↑ open up ↑
 189  189          else
 190  190                  snprintf(buf, sizeof(buf), "extern %s", sym->ident->name);
 191  191  
 192  192          return alloc_string(buf);
 193  193  }
 194  194  
 195  195  char *get_constraint_str(struct expression *expr)
 196  196  {
 197  197          char *name;
 198  198  
      199 +        expr = strip_expr(expr);
 199  200          if (!expr)
 200  201                  return NULL;
 201  202          if (expr->type == EXPR_CALL)
 202  203                  return get_func_constraint(expr);
 203  204          if (expr->type == EXPR_BINOP)
 204  205                  return expr_to_str(expr);
 205  206          name = get_toplevel_name(expr);
 206  207          if (name)
 207  208                  return name;
 208  209          return get_member_name(expr);
↓ open down ↓ 125 lines elided ↑ open up ↑
 334  335          } END_FOR_EACH_PTR(con);
 335  336  
 336  337  free_data:
 337  338          free_string(data_str);
 338  339          return required;
 339  340  }
 340  341  
 341  342  struct string_list *saved_constraints;
 342  343  static void save_new_constraint(const char *con)
 343  344  {
 344      -        if (list_has_string(saved_constraints, con))
      345 +        if (!insert_string(&saved_constraints, con))
 345  346                  return;
 346      -        insert_string(&saved_constraints, con);
 347  347          sql_save_constraint(con);
 348  348  }
 349  349  
 350  350  static void handle_comparison(struct expression *left, int op, struct expression *right)
 351  351  {
 352  352          struct constraint_list *constraints;
 353  353          struct smatch_state *state;
 354  354          char *constraint;
 355  355          int constraint_id;
 356  356          int orig_op = op;
 357  357          sval_t sval;
 358  358  
 359  359          /* known values are handled in smatch extra */
 360  360          if (get_value(left, &sval) || get_value(right, &sval))
 361  361                  return;
 362  362  
 363      -        if (local_debug)
 364      -                sm_msg("COMPARE: %s %s %s", expr_to_str(left), show_special(op), expr_to_str(right));
 365      -
 366  363          constraint = get_constraint_str(right);
 367  364          if (!constraint)
 368  365                  return;
 369      -        if (local_debug)
 370      -                sm_msg("EXPR: %s CONSTRAINT %s", expr_to_str(right), constraint);
 371  366          constraint_id = constraint_str_to_id(constraint);
 372      -        if (local_debug)
 373      -                sm_msg("CONSTRAINT ID %d", constraint_id);
 374  367          if (constraint_id < 0)
 375  368                  save_new_constraint(constraint);
 376  369          free_string(constraint);
 377  370          if (constraint_id < 0)
 378  371                  return;
 379  372  
 380  373          constraints = get_constraints(left);
 381  374          constraints = clone_constraint_list(constraints);
 382  375          op = negate_gt(orig_op);
 383  376          add_constraint(&constraints, remove_unsigned_from_comparison(op), constraint_id);
 384  377          state = alloc_constraint_state(constraints);
 385  378  
 386      -        if (op == orig_op) {
 387      -                if (local_debug)
 388      -                        sm_msg("SETTING %s true %s", expr_to_str(left), state->name);
      379 +        if (op == orig_op)
 389  380                  set_true_false_states_expr(my_id, left, state, NULL);
 390      -        } else {
 391      -                if (local_debug)
 392      -                        sm_msg("SETTING %s false %s", expr_to_str(left), state->name);
 393      -
      381 +        else
 394  382                  set_true_false_states_expr(my_id, left, NULL, state);
 395      -        }
 396  383  }
 397  384  
 398  385  static void match_condition(struct expression *expr)
 399  386  {
 400  387          if (expr->type != EXPR_COMPARE)
 401  388                  return;
 402  389  
 403  390          if (expr->op == SPECIAL_EQUAL ||
 404  391              expr->op == SPECIAL_NOTEQUAL)
 405  392                  return;
↓ open down ↓ 116 lines elided ↑ open up ↑
 522  509  
 523  510          set_state(my_id, name, sym, constraint_str_to_state(value));
 524  511  free:
 525  512          free_string(name);
 526  513  }
 527  514  
 528  515  void register_constraints(int id)
 529  516  {
 530  517          my_id = id;
 531  518  
      519 +        set_dynamic_states(my_id);
 532  520          add_merge_hook(my_id, &merge_func);
 533  521          add_hook(&match_condition, CONDITION_HOOK);
 534  522  
 535  523          add_hook(&match_caller_info, FUNCTION_CALL_HOOK);
 536  524          add_member_info_callback(my_id, struct_member_callback);
 537  525          select_caller_info_hook(&set_param_constrained, CONSTRAINT);
 538  526  
 539  527          add_split_return_callback(print_return_implies_constrained);
 540  528          select_return_states_hook(CONSTRAINT, &db_returns_constrained);
 541  529  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX