From 4c87725319c0c0a35df833aed222c8faf4fb90ab Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 15 Aug 2013 10:27:08 +0300 Subject: [PATCH] sizeof: complain if code does sizeof(4) People sometimes do sizeof(MY_SIZE) when they just intended to say MY_SIZE. Signed-off-by: Dan Carpenter --- check_sizeof.c | 42 ++++++++++++++++++++++++++ smatch_data/kernel.macro_takes_sizeof_argument | 4 +++ 2 files changed, 46 insertions(+) create mode 100644 smatch_data/kernel.macro_takes_sizeof_argument diff --git a/check_sizeof.c b/check_sizeof.c index 55901267..466b2146 100644 --- a/check_sizeof.c +++ b/check_sizeof.c @@ -86,8 +86,25 @@ static void match_check_params(struct expression *call) } END_FOR_EACH_PTR(arg); } +static struct string_list *macro_takes_sizeof_argument; +static void check_sizeof_number(struct expression *expr) +{ + char *macro, *tmp; + + if (expr->type != EXPR_VALUE) + return; + macro = get_macro_name(expr->pos); + FOR_EACH_PTR(macro_takes_sizeof_argument, tmp) { + if (macro && strcmp(tmp, macro) == 0) + return; + } END_FOR_EACH_PTR(tmp); + + sm_msg("warn: sizeof(NUMBER)?"); +} + static void match_sizeof(struct expression *expr) { + check_sizeof_number(expr); if (expr->type == EXPR_PREOP && expr->op == '&') sm_msg("warn: sizoef(&pointer)?"); if (expr->type == EXPR_SIZEOF) @@ -97,10 +114,35 @@ static void match_sizeof(struct expression *expr) sm_msg("warn: taking sizeof binop"); } +static void register_macro_takes_sizeof_argument(void) +{ + struct token *token; + char *macro; + char name[256]; + + snprintf(name, 256, "%s.macro_takes_sizeof_argument", option_project_str); + + token = get_tokens_file(name); + if (!token) + return; + if (token_type(token) != TOKEN_STREAMBEGIN) + return; + token = token->next; + while (token_type(token) != TOKEN_STREAMEND) { + if (token_type(token) != TOKEN_IDENT) + return; + macro = alloc_string(show_ident(token->ident)); + add_ptr_list(¯o_takes_sizeof_argument, macro); + token = token->next; + } + clear_token_alloc(); +} + void check_sizeof(int id) { my_id = id; + register_macro_takes_sizeof_argument(); add_hook(&match_call_assignment, CALL_ASSIGNMENT_HOOK); add_hook(&match_check_params, FUNCTION_CALL_HOOK); add_hook(&match_sizeof, SIZEOF_HOOK); diff --git a/smatch_data/kernel.macro_takes_sizeof_argument b/smatch_data/kernel.macro_takes_sizeof_argument new file mode 100644 index 00000000..9ad6faf2 --- /dev/null +++ b/smatch_data/kernel.macro_takes_sizeof_argument @@ -0,0 +1,4 @@ +BNX2FC_RQ_BUF_LOG_SZ +BNX2FC_NUM_MAX_SESS_LOG +ilog2 +FP_XSTATE_MAGIC2_SIZE -- 2.11.4.GIT