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;
|