From d5373c36122c10154cf2e5a7ccc99c6e5ab376c7 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Sat, 17 Nov 2012 16:40:12 +0300 Subject: [PATCH] flow: hooks: introduce GLOBAL_ASSIGNMENT_HOOK It lets you know how global variables are initialized. Signed-off-by: Dan Carpenter --- smatch.h | 1 + smatch_flow.c | 25 +++++++++++++++++++++++++ smatch_hooks.c | 3 +++ 3 files changed, 29 insertions(+) diff --git a/smatch.h b/smatch.h index ba9df4dd..f4a94d15 100644 --- a/smatch.h +++ b/smatch.h @@ -78,6 +78,7 @@ enum hook_type { DECLARATION_HOOK, ASSIGNMENT_HOOK, RAW_ASSIGNMENT_HOOK, + GLOBAL_ASSIGNMENT_HOOK, LOGIC_HOOK, CONDITION_HOOK, PRELOOP_HOOK, diff --git a/smatch_flow.c b/smatch_flow.c index c414d4e8..e2d8cfc1 100644 --- a/smatch_flow.c +++ b/smatch_flow.c @@ -772,6 +772,30 @@ static void split_declaration(struct symbol_list *sym_list) } END_FOR_EACH_PTR(sym); } +static void fake_global_assign(struct symbol *sym) +{ + struct expression *assign, *symbol; + + if (!sym->initializer) + return; + if (sym->initializer->type == EXPR_INITIALIZER) { + struct expression *deref, *tmp; + + symbol = symbol_expression(sym); + FOR_EACH_PTR(sym->initializer->expr_list, tmp) { + if (tmp->type != EXPR_IDENTIFIER) /* how to handle arrays?? */ + continue; + deref = deref_expression(symbol, '.', tmp->expr_ident); + assign = assign_expression(deref, tmp->ident_expression); + __pass_to_client(assign, GLOBAL_ASSIGNMENT_HOOK); + } END_FOR_EACH_PTR(tmp); + } else { + symbol = symbol_expression(sym); + assign = assign_expression(symbol, sym->initializer); + __pass_to_client(assign, GLOBAL_ASSIGNMENT_HOOK); + } +} + static void split_function(struct symbol *sym) { struct symbol *base_type = get_base_type(sym); @@ -847,6 +871,7 @@ static void split_functions(struct symbol_list *sym_list) process_inlines(); } else { __pass_to_client(sym, BASE_HOOK); + fake_global_assign(sym); } } END_FOR_EACH_PTR(sym); __pass_to_client_no_data(END_FILE_HOOK); diff --git a/smatch_hooks.c b/smatch_hooks.c index 080d65ad..6817f430 100644 --- a/smatch_hooks.c +++ b/smatch_hooks.c @@ -62,6 +62,9 @@ void add_hook(void *func, enum hook_type type) case RAW_ASSIGNMENT_HOOK: container->data_type = EXPR_PTR; break; + case GLOBAL_ASSIGNMENT_HOOK: + container->data_type = EXPR_PTR; + break; case CALL_ASSIGNMENT_HOOK: container->data_type = EXPR_PTR; break; -- 2.11.4.GIT