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

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_states.c
          +++ new/usr/src/tools/smatch/src/smatch_states.c
↓ open down ↓ 66 lines elided ↑ open up ↑
  67   67  
  68   68  static struct ptr_list *backup;
  69   69  
  70   70  int option_debug;
  71   71  
  72   72  void __print_cur_stree(void)
  73   73  {
  74   74          __print_stree(cur_stree);
  75   75  }
  76   76  
       77 +bool __print_states(const char *owner)
       78 +{
       79 +        struct sm_state *sm;
       80 +        bool found = false;
       81 +
       82 +        if (!owner)
       83 +                return false;
       84 +
       85 +        FOR_EACH_SM(__get_cur_stree(), sm) {
       86 +                if (!strstr(check_name(sm->owner), owner))
       87 +                        continue;
       88 +                sm_msg("%s", show_sm(sm));
       89 +                found = true;
       90 +        } END_FOR_EACH_SM(sm);
       91 +
       92 +        return found;
       93 +}
       94 +
  77   95  int unreachable(void)
  78   96  {
  79   97          if (!cur_stree)
  80   98                  return 1;
  81   99          return 0;
  82  100  }
  83  101  
  84  102  void __set_cur_stree_readonly(void)
  85  103  {
  86  104          read_only++;
  87  105  }
  88  106  
  89  107  void __set_cur_stree_writable(void)
  90  108  {
  91  109          read_only--;
  92  110  }
  93  111  
      112 +DECLARE_PTR_LIST(check_tracker_list, check_tracker_hook *);
      113 +static struct check_tracker_list **tracker_hooks;
      114 +
      115 +void add_check_tracker(const char *check_name, check_tracker_hook *fn)
      116 +{
      117 +        check_tracker_hook **p;
      118 +        int owner;
      119 +
      120 +        owner = id_from_name(check_name);
      121 +        if (!owner) {
      122 +                printf("check not found.  '%s'\n", check_name);
      123 +                return;
      124 +        }
      125 +
      126 +        p = malloc(sizeof(check_tracker_hook *));
      127 +        *p = fn;
      128 +        add_ptr_list(&tracker_hooks[owner], p);
      129 +}
      130 +
      131 +static void call_tracker_hooks(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
      132 +{
      133 +        struct check_tracker_list *hooks;
      134 +        check_tracker_hook **fn;
      135 +
      136 +        if ((unsigned short)owner == USHRT_MAX)
      137 +                return;
      138 +
      139 +        hooks = tracker_hooks[owner];
      140 +        FOR_EACH_PTR(hooks, fn) {
      141 +                (*fn)(owner, name, sym, state);
      142 +        } END_FOR_EACH_PTR(fn);
      143 +}
      144 +
      145 +void allocate_tracker_array(int num_checks)
      146 +{
      147 +        tracker_hooks = malloc(num_checks * sizeof(void *));
      148 +        memset(tracker_hooks, 0, num_checks * sizeof(void *));
      149 +}
      150 +
  94  151  struct sm_state *set_state(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
  95  152  {
  96  153          struct sm_state *ret;
  97  154  
  98  155          if (!name || !state)
  99  156                  return NULL;
 100  157  
 101  158          if (read_only)
 102  159                  sm_perror("cur_stree is read only.");
 103  160  
↓ open down ↓ 3 lines elided ↑ open up ↑
 107  164                  s = __get_state(owner, name, sym);
 108  165                  if (!s)
 109  166                          sm_msg("%s new [%s] '%s' %s", __func__,
 110  167                                 check_name(owner), name, show_state(state));
 111  168                  else
 112  169                          sm_msg("%s change [%s] '%s' %s => %s",
 113  170                                  __func__, check_name(owner), name, show_state(s),
 114  171                                  show_state(state));
 115  172          }
 116  173  
      174 +        call_tracker_hooks(owner, name, sym, state);
      175 +
 117  176          if (owner != -1 && unreachable())
 118  177                  return NULL;
 119  178  
 120  179          if (fake_cur_stree_stack)
 121  180                  set_state_stree_stack(&fake_cur_stree_stack, owner, name, sym, state);
 122  181  
 123  182          ret = set_state_stree(&cur_stree, owner, name, sym, state);
 124  183  
 125  184          return ret;
 126  185  }
↓ open down ↓ 1053 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX