118 check_dereference(get_array_base(expr));
119 }
120
121 static void set_param_dereferenced(struct expression *call, struct expression *arg, char *key, char *unused)
122 {
123 struct symbol *sym;
124 char *name;
125
126 name = get_variable_from_key(arg, key, &sym);
127 if (!name || !sym)
128 goto free;
129
130 check_dereference_name_sym(name, sym);
131 free:
132 free_string(name);
133 }
134
135 static void match_condition(struct expression *expr)
136 {
137 struct smatch_state *true_state = NULL;
138
139 if (get_macro_name(expr->pos))
140 return;
141
142 if (!is_pointer(expr))
143 return;
144
145 if (expr->type == EXPR_ASSIGNMENT) {
146 match_condition(expr->right);
147 match_condition(expr->left);
148 }
149
150 if (implied_not_equal(expr, 0))
151 return;
152
153 if (get_state_expr(my_id, expr))
154 true_state = &ok;
155
156 set_true_false_states_expr(my_id, expr, true_state, &null);
157 }
158
159 void check_check_deref(int id)
|
118 check_dereference(get_array_base(expr));
119 }
120
121 static void set_param_dereferenced(struct expression *call, struct expression *arg, char *key, char *unused)
122 {
123 struct symbol *sym;
124 char *name;
125
126 name = get_variable_from_key(arg, key, &sym);
127 if (!name || !sym)
128 goto free;
129
130 check_dereference_name_sym(name, sym);
131 free:
132 free_string(name);
133 }
134
135 static void match_condition(struct expression *expr)
136 {
137 struct smatch_state *true_state = NULL;
138 char *name;
139
140 name = get_macro_name(expr->pos);
141 if (name &&
142 (strcmp(name, "likely") != 0 && strcmp(name, "unlikely") != 0))
143 return;
144
145 if (!is_pointer(expr))
146 return;
147
148 if (expr->type == EXPR_ASSIGNMENT) {
149 match_condition(expr->right);
150 match_condition(expr->left);
151 }
152
153 if (implied_not_equal(expr, 0))
154 return;
155
156 if (get_state_expr(my_id, expr))
157 true_state = &ok;
158
159 set_true_false_states_expr(my_id, expr, true_state, &null);
160 }
161
162 void check_check_deref(int id)
|