274 }
275 return 0;
276 }
277
278 int parent_is_free_strict(struct expression *expr)
279 {
280 struct symbol *sym;
281 char *var;
282 int ret = 0;
283
284 expr = strip_expr(expr);
285 var = expr_to_var_sym(expr, &sym);
286 if (!var || !sym)
287 goto free;
288 ret = parent_is_free_var_sym_strict(var, sym);
289 free:
290 free_string(var);
291 return ret;
292 }
293
294 void check_free_strict(int id)
295 {
296 my_id = id;
297
298 if (option_project != PROJ_KERNEL)
299 return;
300
301 add_function_hook("kfree", &match_free, INT_PTR(0));
302 add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
303
304 if (option_spammy)
305 add_hook(&match_symbol, SYM_HOOK);
306 add_hook(&match_dereferences, DEREF_HOOK);
307 add_hook(&match_call, FUNCTION_CALL_HOOK);
308 add_hook(&match_return, RETURN_HOOK);
309
310 add_modification_hook_late(my_id, &ok_to_use);
311 add_pre_merge_hook(my_id, &pre_merge_hook);
312
313 select_return_states_hook(PARAM_FREED, &set_param_freed);
314 }
|
274 }
275 return 0;
276 }
277
278 int parent_is_free_strict(struct expression *expr)
279 {
280 struct symbol *sym;
281 char *var;
282 int ret = 0;
283
284 expr = strip_expr(expr);
285 var = expr_to_var_sym(expr, &sym);
286 if (!var || !sym)
287 goto free;
288 ret = parent_is_free_var_sym_strict(var, sym);
289 free:
290 free_string(var);
291 return ret;
292 }
293
294 static void match_untracked(struct expression *call, int param)
295 {
296 struct state_list *slist = NULL;
297 struct expression *arg;
298 struct sm_state *sm;
299 char *name;
300 char buf[64];
301 int len;
302
303 arg = get_argument_from_call_expr(call->args, param);
304 if (!arg)
305 return;
306
307 name = expr_to_var(arg);
308 if (!name)
309 return;
310 snprintf(buf, sizeof(buf), "%s->", name);
311 free_string(name);
312 len = strlen(buf);
313
314 FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
315 if (strncmp(sm->name, buf, len) == 0)
316 add_ptr_list(&slist, sm);
317 } END_FOR_EACH_SM(sm);
318
319 FOR_EACH_PTR(slist, sm) {
320 set_state(sm->owner, sm->name, sm->sym, &ok);
321 } END_FOR_EACH_PTR(sm);
322
323 free_slist(&slist);
324 }
325
326 void check_free_strict(int id)
327 {
328 my_id = id;
329
330 if (option_project != PROJ_KERNEL)
331 return;
332
333 add_function_hook("kfree", &match_free, INT_PTR(0));
334 add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
335
336 if (option_spammy)
337 add_hook(&match_symbol, SYM_HOOK);
338 add_hook(&match_dereferences, DEREF_HOOK);
339 add_hook(&match_call, FUNCTION_CALL_HOOK);
340 add_hook(&match_return, RETURN_HOOK);
341
342 add_modification_hook_late(my_id, &ok_to_use);
343 add_pre_merge_hook(my_id, &pre_merge_hook);
344
345 select_return_states_hook(PARAM_FREED, &set_param_freed);
346 add_untracked_param_hook(&match_untracked);
347 }
|