Print this page
new smatch


  59         if (!can_overflow(size_expr))
  60                 return;
  61 
  62         name = expr_to_str(size_expr);
  63         sm_warning("math in access_ok() is dangerous '%s'", name);
  64 
  65         free_string(name);
  66 }
  67 
  68 static void match_access_ok(const char *fn, struct expression *expr, void *data)
  69 {
  70         struct expression *size_expr;
  71 
  72         size_expr = get_argument_from_call_expr(expr->args, 1);
  73         match_size(size_expr);
  74 }
  75 
  76 static void split_asm_constraints(struct expression_list *expr_list)
  77 {
  78         struct expression *expr;
  79         int state = 0;
  80         int i;
  81 
  82         i = 0;
  83         FOR_EACH_PTR(expr_list, expr) {
  84 
  85                 switch (state) {
  86                 case 0: /* identifier */
  87                 case 1: /* constraint */
  88                         state++;
  89                         continue;
  90                 case 2: /* expression */
  91                         state = 0;
  92                         if (i == 1)
  93                                 match_size(expr);
  94                         i++;

  95                         continue;
  96                 }

  97         } END_FOR_EACH_PTR(expr);
  98 }
  99 
 100 static void match_asm_stmt(struct statement *stmt)
 101 {
 102         char *name;
 103 
 104         name = get_macro_name(stmt->pos);
 105         if (!name || strcmp(name, "access_ok") != 0)
 106                 return;
 107         split_asm_constraints(stmt->asm_inputs);
 108 }
 109 
 110 void check_access_ok_math(int id)
 111 {
 112         my_id = id;
 113         if (option_project != PROJ_KERNEL)
 114                 return;
 115         if (!option_spammy)
 116                 return;


  59         if (!can_overflow(size_expr))
  60                 return;
  61 
  62         name = expr_to_str(size_expr);
  63         sm_warning("math in access_ok() is dangerous '%s'", name);
  64 
  65         free_string(name);
  66 }
  67 
  68 static void match_access_ok(const char *fn, struct expression *expr, void *data)
  69 {
  70         struct expression *size_expr;
  71 
  72         size_expr = get_argument_from_call_expr(expr->args, 1);
  73         match_size(size_expr);
  74 }
  75 
  76 static void split_asm_constraints(struct expression_list *expr_list)
  77 {
  78         struct expression *expr;

  79         int i;
  80 
  81         i = 0;
  82         FOR_EACH_PTR(expr_list, expr) {










  83                 i++;
  84                 if (expr->type != EXPR_ASM_OPERAND)
  85                         continue;
  86                 if (i == 1)
  87                         match_size(expr->expr);
  88         } END_FOR_EACH_PTR(expr);
  89 }
  90 
  91 static void match_asm_stmt(struct statement *stmt)
  92 {
  93         char *name;
  94 
  95         name = get_macro_name(stmt->pos);
  96         if (!name || strcmp(name, "access_ok") != 0)
  97                 return;
  98         split_asm_constraints(stmt->asm_inputs);
  99 }
 100 
 101 void check_access_ok_math(int id)
 102 {
 103         my_id = id;
 104         if (option_project != PROJ_KERNEL)
 105                 return;
 106         if (!option_spammy)
 107                 return;