From 480839f096285db4bb9206ef42273db312c161a0 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 14 Sep 2012 15:32:11 +0300 Subject: [PATCH] buf_size: record static variables in the database There are sometimes static buffers which get allocated in the init() functions. Record the size of these buffers. Signed-off-by: Dan Carpenter --- smatch_buf_size.c | 20 +++++++++++++++----- smatch_scripts/db/fill_db_type_size.pl | 25 +++++++------------------ 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/smatch_buf_size.c b/smatch_buf_size.c index 48fe19ef..90d764d3 100644 --- a/smatch_buf_size.c +++ b/smatch_buf_size.c @@ -133,12 +133,17 @@ static int db_size_callback(void *unused, int argc, char **argv, char **azColNam static int size_from_db(struct expression *expr) { + int this_file_only = 0; char *name; if (!option_spammy) return 0; name = get_member_name(expr); + if (!name && is_static(expr)) { + name = get_variable_from_expr(expr, NULL); + this_file_only = 1; + } if (!name) return 0; @@ -149,6 +154,8 @@ static int size_from_db(struct expression *expr) return 0; if (db_size != 0) return db_size; + if (this_file_only) + return 0; run_sql(db_size_callback, "select size from type_size where type = '%s'", name); @@ -424,18 +431,21 @@ static void match_array_assignment(struct expression *expr) static void info_record_alloction(struct expression *buffer, struct expression *size) { - char *member; + char *name; long long val; if (!option_info) return; - member = get_member_name(buffer); - if (!member) + + name = get_member_name(buffer); + if (!name && is_static(buffer)) + name = get_variable_from_expr(buffer, NULL); + if (!name) return; if (!get_implied_value(size, &val)) val = -1; - sm_msg("info: '%s' allocated_buf_size %lld", member, val); - free_string(member); + sm_msg("info: '%s' allocated_buf_size %lld", name, val); + free_string(name); } static void match_alloc(const char *fn, struct expression *expr, void *_size_arg) diff --git a/smatch_scripts/db/fill_db_type_size.pl b/smatch_scripts/db/fill_db_type_size.pl index 6b27476f..a3cccabf 100755 --- a/smatch_scripts/db/fill_db_type_size.pl +++ b/smatch_scripts/db/fill_db_type_size.pl @@ -17,7 +17,6 @@ $db->do("PRAGMA journal_mode = OFF"); $db->do("delete from type_size;"); -my $types = {}; my ($file_and_line, $file, $dummy, $struct_bit, $member, $size); open(WARNS, "<$warns"); @@ -31,30 +30,20 @@ while () { s/\n//; s/'//g; - ($file_and_line, $dummy, $dummy, $struct_bit, $member, $dummy, $size) = split(/ /, $_); + if ($_ =~ /\(struct /) { + ($file_and_line, $dummy, $dummy, $struct_bit, $member, $dummy, $size) = split(/ /, $_); + $member = "(struct $member"; + } else { + ($file_and_line, $dummy, $dummy, $member, $dummy, $size) = split(/ /, $_); + } ($file, $dummy) = split(/:/, $file_and_line); if (!defined($size)) { next; } - if (!($struct_bit =~ /^\(struct$/)) { - next; - } - - if (defined($types->{$member}) && $types->{$member} != $size) { - $size = -1; - } - - $types->{$member} = $size; - $db->do("insert into type_size values ('$file', '(struct $member', '$size')\n"); + $db->do("insert into type_size values ('$file', '$member', '$size')\n"); } -#foreach my $key (keys($types)) { -# if ($types->{$key} != -1) { -# $db->do("insert into type_size values ('$file', '(struct $key', '$types->{$key}')\n"); -# } -#} - $db->commit(); $db->disconnect(); -- 2.11.4.GIT