find dynamic stack allocations in checkstack.pl

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Friday, July 25, 2008 - 12:00 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=585e93...
Commit:     585e93ae83b80c874bf4eb50a239027cef5db4af
Parent:     545e400619b24b6b17b7f1f1e838e9ff6d036949
Author:     Eric Sandeen <sandeen@redhat.com>
AuthorDate: Fri Jul 25 01:45:27 2008 -0700
Committer:  Linus Torvalds <torvalds@linux-foundation.org>
CommitDate: Fri Jul 25 10:53:26 2008 -0700

    find dynamic stack allocations in checkstack.pl
    
    Currently, checkstack.pl only looks for fixed subtractions from the stack
    pointer.  However, things like this:
    
    void function(int size)
    {
            char stackbuster[size << 2];
    ...
    
    are certainly worth pointing out, I think.
    
    This could perhaps be done more cleanly, and the following patch only
    adds "dynamic" REs for x86 and x86_64, but it works:
    
    0x00b0 crypto_cbc_decrypt_inplace [cbc]:                Dynamic (%rax)
    0x00ad crypto_pcbc_decrypt_inplace [pcbc]:              Dynamic (%rax)
    0x02f6 crypto_pcbc_encrypt_inplace [pcbc]:              Dynamic (%rax)
    0x036c _crypto_xcbc_digest_setkey [xcbc]:               Dynamic (%rax)
    ...
    
    (Inspired by Keith Owens' old stack-check script)
    
    Signed-off-by: Eric Sandeen <sandeen@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
 scripts/checkstack.pl |   24 +++++++++++++++++++++++-
 1 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl
index 340ad69..358f96c 100755
--- a/scripts/checkstack.pl
+++ b/scripts/checkstack.pl
@@ -26,8 +26,12 @@
 # $& (whole re) matches the complete objdump line with the stack growth
 # $1 (first bracket) matches the size of the stack growth
 #
+# $dre is similar, but for dynamic stack redutions:
+# $& (whole re) matches the complete objdump line with the stack growth
+# $1 (first bracket) matches the dynamic amount of the stack growth
+#
 # use anything else and feel the pain ;)
-my (@stack, $re, $x, $xs);
+my (@stack, $re, $dre, $x, $xs);
 {
 	my $arch = shift;
 	if ($arch eq "") {
@@ -46,9 +50,11 @@ my (@stack, $re, $x, $xs);
 	} elsif ($arch =~ /^i[3456]86$/) {
 		#c0105234:       81 ec ac 05 00 00       sub    $0x5ac,%esp
 		$re = qr/^.*[as][du][db]    \$(0x$x{1,8}),\%esp$/o;
+		$dre = qr/^.*[as][du][db]    (%.*),\%esp$/o;
 	} elsif ($arch eq 'x86_64') {
 		#    2f60:	48 81 ec e8 05 00 00 	sub    $0x5e8,%rsp
 		$re = qr/^.*[as][du][db]    \$(0x$x{1,8}),\%rsp$/o;
+		$dre = qr/^.*[as][du][db]    (\%.*),\%rsp$/o;
 	} elsif ($arch eq 'ia64') {
 		#e0000000044011fc:       01 0f fc 8c     adds r12=-384,r12
 		$re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o;
@@ -141,6 +147,22 @@ while (my $line = <STDIN>) {
 		next if ($size < 100);
 		push @stack, "$intro$size\n";
 	}
+	elsif (defined $dre && $line =~ m/$dre/) {
+		my $size = "Dynamic ($1)";
+
+		next if $line !~ m/^($xs*)/;
+		my $addr = $1;
+		$addr =~ s/ /0/g;
+		$addr = "0x$addr";
+
+		my $intro = "$addr $func [$file]:";
+		my $padlen = 56 - length($intro);
+		while ($padlen > 0) {
+			$intro .= '	';
+			$padlen -= 8;
+		}
+		push @stack, "$intro$size\n";
+	}
 }
 
 print sort bysize @stack;
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
find dynamic stack allocations in checkstack.pl, Linux Kernel Mailing ..., (Fri Jul 25, 12:00 pm)