Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_nul_terminator.c
          +++ new/usr/src/tools/smatch/src/smatch_nul_terminator.c
↓ open down ↓ 61 lines elided ↑ open up ↑
  62   62  
  63   63          type = get_type(array);
  64   64          if (!type)
  65   65                  return;
  66   66          type = get_real_base_type(type);
  67   67          if (type != &char_ctype)
  68   68                  return;
  69   69          set_terminated(array, &terminated);
  70   70  }
  71   71  
       72 +static struct smatch_state *get_terminated_state_var_sym(const char *name, struct symbol *sym)
       73 +{
       74 +        struct sm_state *sm, *tmp;
       75 +
       76 +        sm = get_sm_state(my_id, name, sym);
       77 +        if (!sm)
       78 +                return NULL;
       79 +        if (sm->state == &terminated || sm->state == &unterminated)
       80 +                return sm->state;
       81 +
       82 +        FOR_EACH_PTR(sm->possible, tmp) {
       83 +                if (tmp->state == &unterminated)
       84 +                        return &unterminated;
       85 +        } END_FOR_EACH_PTR(tmp);
       86 +
       87 +        return NULL;
       88 +}
       89 +
  72   90  static struct smatch_state *get_terminated_state(struct expression *expr)
  73   91  {
  74   92          struct sm_state *sm, *tmp;
  75   93  
  76   94          if (!expr)
  77   95                  return NULL;
  78   96          if (expr->type == EXPR_STRING)
  79   97                  return &terminated;
  80   98          sm = get_sm_state_expr(my_id, expr);
  81   99          if (!sm)
↓ open down ↓ 151 lines elided ↑ open up ↑
 233  251  
 234  252          name = get_variable_from_key(arg, key, &sym);
 235  253          if (!name || !sym)
 236  254                  goto free;
 237  255  
 238  256          set_terminated_var_sym(name, sym, (*value == '1') ? &terminated : &unterminated);
 239  257  free:
 240  258          free_string(name);
 241  259  }
 242  260  
      261 +bool is_nul_terminated_var_sym(const char *name, struct symbol *sym)
      262 +{
      263 +        if (get_terminated_state_var_sym(name, sym) == &terminated)
      264 +                return 1;
      265 +        return 0;
      266 +}
      267 +
 243  268  bool is_nul_terminated(struct expression *expr)
 244  269  {
 245  270          if (get_terminated_state(expr) == &terminated)
 246  271                  return 1;
 247  272          return 0;
 248  273  }
 249  274  
 250  275  static void match_strnlen_test(struct expression *expr)
 251  276  {
 252  277          struct expression *left, *tmp, *arg;
↓ open down ↓ 50 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX