Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_function_ptrs.c
          +++ new/usr/src/tools/smatch/src/smatch_function_ptrs.c
↓ open down ↓ 133 lines elided ↑ open up ↑
 134  134                  return NULL;
 135  135          snprintf(buf, sizeof(buf), "r %s()", name);
 136  136          free_string(name);
 137  137          return alloc_string(buf);
 138  138  }
 139  139  
 140  140  char *get_fnptr_name(struct expression *expr)
 141  141  {
 142  142          char *name;
 143  143  
      144 +        if (is_zero(expr))
      145 +                return NULL;
      146 +
 144  147          expr = strip_expr(expr);
 145  148  
 146  149          /* (*ptrs[0])(a, b, c) is the same as ptrs[0](a, b, c); */
 147  150          if (expr->type == EXPR_PREOP && expr->op == '*')
 148  151                  expr = strip_expr(expr->unop);
 149  152  
 150  153          name = get_from__symbol_get(expr);
 151  154          if (name)
 152  155                  return name;
 153  156  
↓ open down ↓ 184 lines elided ↑ open up ↑
 338  341          if (expr->type == EXPR_PREOP && expr->op == '&')
 339  342                  expr = strip_expr(expr->unop);
 340  343  
 341  344          fn_name = get_fnptr_name(expr);
 342  345          if (!fn_name)
 343  346                  return;
 344  347          snprintf(ptr_name, sizeof(ptr_name), "r %s()", get_function());
 345  348          sql_insert_function_ptr(fn_name, ptr_name);
 346  349  }
 347  350  
      351 +static void print_initializer_list(struct expression_list *expr_list,
      352 +                struct symbol *struct_type)
      353 +{
      354 +        struct expression *expr;
      355 +        struct symbol *base_type;
      356 +        char struct_name[256];
      357 +
      358 +        FOR_EACH_PTR(expr_list, expr) {
      359 +                if (expr->type == EXPR_INDEX && expr->idx_expression && expr->idx_expression->type == EXPR_INITIALIZER) {
      360 +                        print_initializer_list(expr->idx_expression->expr_list, struct_type);
      361 +                        continue;
      362 +                }
      363 +                if (expr->type != EXPR_IDENTIFIER)
      364 +                        continue;
      365 +                if (!expr->expr_ident)
      366 +                        continue;
      367 +                if (!expr->ident_expression ||
      368 +                    expr->ident_expression->type != EXPR_SYMBOL ||
      369 +                    !expr->ident_expression->symbol_name)
      370 +                        continue;
      371 +                base_type = get_type(expr->ident_expression);
      372 +                if (!base_type || base_type->type != SYM_FN)
      373 +                        continue;
      374 +                snprintf(struct_name, sizeof(struct_name), "(struct %s)->%s",
      375 +                         struct_type->ident->name, expr->expr_ident->name);
      376 +                sql_insert_function_ptr(expr->ident_expression->symbol_name->name,
      377 +                                        struct_name);
      378 +        } END_FOR_EACH_PTR(expr);
      379 +}
      380 +
      381 +static void global_variable(struct symbol *sym)
      382 +{
      383 +        struct symbol *struct_type;
      384 +
      385 +        if (!sym->ident)
      386 +                return;
      387 +        if (!sym->initializer || sym->initializer->type != EXPR_INITIALIZER)
      388 +                return;
      389 +        struct_type = get_base_type(sym);
      390 +        if (!struct_type)
      391 +                return;
      392 +        if (struct_type->type == SYM_ARRAY) {
      393 +                struct_type = get_base_type(struct_type);
      394 +                if (!struct_type)
      395 +                        return;
      396 +        }
      397 +        if (struct_type->type != SYM_STRUCT || !struct_type->ident)
      398 +                return;
      399 +        print_initializer_list(sym->initializer->expr_list, struct_type);
      400 +}
      401 +
 348  402  void register_function_ptrs(int id)
 349  403  {
 350  404          my_id = id;
 351  405  
 352  406          if (!option_info)
 353  407                  return;
 354  408  
      409 +        add_hook(&global_variable, BASE_HOOK);
      410 +        add_hook(&global_variable, DECLARATION_HOOK);
 355  411          add_hook(&match_passes_function_pointer, FUNCTION_CALL_HOOK);
 356  412          add_hook(&match_returns_function_pointer, RETURN_HOOK);
 357  413          add_hook(&match_function_assign, ASSIGNMENT_HOOK);
 358  414          add_hook(&match_function_assign, GLOBAL_ASSIGNMENT_HOOK);
 359  415  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX