Print this page
new smatch


  59         data->tag = tag;
  60         data->offset = offset;
  61 
  62         state = __alloc_smatch_state(0);
  63         state->name = alloc_sname(name);
  64         state->data = data;
  65         return state;
  66 }
  67 
  68 struct smatch_state *merge_tag_info(struct smatch_state *s1, struct smatch_state *s2)
  69 {
  70         /* Basically ignore undefined states */
  71         if (s1 == &undefined)
  72                 return s2;
  73         if (s2 == &undefined)
  74                 return s1;
  75 
  76         return &merged;
  77 }
  78 
  79 static bool is_local_var(struct expression *expr)
  80 {
  81         struct symbol *sym;
  82 
  83         if (!expr || expr->type != EXPR_SYMBOL)
  84                 return false;
  85         sym = expr->symbol;
  86         if (!(sym->ctype.modifiers & MOD_TOPLEVEL))
  87                 return true;
  88         return false;
  89 }
  90 
  91 static void match_assign(struct expression *expr)
  92 {
  93         struct expression *left;
  94         struct symbol *right_sym;
  95         char *name;
  96         mtag_t tag;
  97         int offset;
  98         int param;
  99 
 100         if (expr->op != '=')
 101                 return;
 102         left = strip_expr(expr->left);
 103         if (is_local_var(left))
 104                 return;
 105         right_sym = expr_to_sym(expr->right);
 106         if (!right_sym)
 107                 return;
 108 
 109         param = get_param_num_from_sym(right_sym);
 110         if (param < 0)
 111                 return;
 112         // FIXME:  modify param_has_filter_data() to take a name/sym
 113         if (!expr_to_mtag_offset(left, &tag, &offset))
 114                 return;
 115         name = expr_to_str(left);
 116         if (!name)
 117                 return;
 118         set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
 119         free_string(name);
 120 }
 121 
 122 static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
 123 {




  59         data->tag = tag;
  60         data->offset = offset;
  61 
  62         state = __alloc_smatch_state(0);
  63         state->name = alloc_sname(name);
  64         state->data = data;
  65         return state;
  66 }
  67 
  68 struct smatch_state *merge_tag_info(struct smatch_state *s1, struct smatch_state *s2)
  69 {
  70         /* Basically ignore undefined states */
  71         if (s1 == &undefined)
  72                 return s2;
  73         if (s2 == &undefined)
  74                 return s1;
  75 
  76         return &merged;
  77 }
  78 












  79 static void match_assign(struct expression *expr)
  80 {
  81         struct expression *left;
  82         struct symbol *right_sym;
  83         char *name;
  84         mtag_t tag;
  85         int offset;
  86         int param;
  87 
  88         if (expr->op != '=')
  89                 return;
  90         left = strip_expr(expr->left);
  91         if (is_local_variable(left))
  92                 return;
  93         right_sym = expr_to_sym(expr->right);
  94         if (!right_sym)
  95                 return;
  96 
  97         param = get_param_num_from_sym(right_sym);
  98         if (param < 0)
  99                 return;
 100         // FIXME:  modify param_has_filter_data() to take a name/sym
 101         if (!expr_to_mtag_offset(left, &tag, &offset))
 102                 return;
 103         name = expr_to_str(left);
 104         if (!name)
 105                 return;
 106         set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
 107         free_string(name);
 108 }
 109 
 110 static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
 111 {