diff options
-rwxr-xr-x | source3/script/findstatic.pl | 65 | ||||
-rwxr-xr-x | source3/script/findstatic.sh | 59 |
2 files changed, 65 insertions, 59 deletions
diff --git a/source3/script/findstatic.pl b/source3/script/findstatic.pl new file mode 100755 index 0000000000..d2d1b4d924 --- /dev/null +++ b/source3/script/findstatic.pl @@ -0,0 +1,65 @@ +#!/usr/bin/perl -w +# find a list of fns and variables in the code that could be static +# usually called with something like this: +# findstatic.pl `find . -name "*.o"` +# Andrew Tridgell <tridge@samba.org> + +use strict; + +# use nm to find the symbols +my($saved_delim) = $/; +undef $/; +my($syms) = `nm -o @ARGV`; +$/ = $saved_delim; + +my(@lines) = split(/\n/s, $syms); + +my(%def); +my(%undef); +my(%stype); + +my(%typemap) = ( + "T" => "function", + "C" => "uninitialised variable", + "D" => "initialised variable" + ); + + +# parse the symbols into defined and undefined +for (my($i)=0; $i <= $#{@lines}; $i++) { + my($line) = $lines[$i]; + if ($line =~ /(.*):[a-f0-9]* ([TCD]) (.*)/) { + my($fname) = $1; + my($symbol) = $3; + push(@{$def{$fname}}, $symbol); + $stype{$symbol} = $2; + } + if ($line =~ /(.*):\s* U (.*)/) { + my($fname) = $1; + my($symbol) = $2; + push(@{$undef{$fname}}, $symbol); + } +} + +# look for defined symbols that are never referenced outside the place they +# are defined +foreach my $f (keys %def) { + print "Checking $f\n"; + foreach my $s (@{$def{$f}}) { + my($found) = 0; + foreach my $f2 (keys %undef) { + if ($f2 ne $f) { + foreach my $s2 (@{$undef{$f2}}) { + if ($s2 eq $s) { + $found = 1; + } + } + } + } + if ($found == 0) { + my($t) = $typemap{$stype{$s}}; + print " '$s' is unique to $f ($t)\n"; + } + } +} + diff --git a/source3/script/findstatic.sh b/source3/script/findstatic.sh deleted file mode 100755 index 39c57a46f7..0000000000 --- a/source3/script/findstatic.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh -# find a list of fns and variables in the code that could be static -# Andrew Tridgell <tridge@samba.org> - -# rather linux specific, but that doesn't matter in this case -# also very slow (order is N^2) but fast enough for this project - -declare -a FNS - -for f in $@; do - echo "Checking in $f" - T_FNS=`nm $f | grep ' T ' | cut -d' ' -f3` - C_FNS=`nm $f | egrep ' [DC] ' | cut -d' ' -f3` - if [ "$T_FNS" = "" -a "$C_FNS" = "" ]; then - echo "No public functions or data in $f" - continue - fi - for fn in $T_FNS; do - if [ $fn = "main" ]; then - continue - fi - found=0 - for f2 in $@; do - if [ $f != $f2 ]; then - FNS2=`nm $f2 | egrep ' U ' | awk '{print $2}'` - for fn2 in $FNS2; do - if [ $fn2 = $fn ]; then - found=1 - break - fi - done - fi - done - if [ $found = 0 ]; then - echo "Global function $fn is unique to $f" - fi - done - - for fn in $C_FNS; do - if [ $fn = "main" ]; then - continue - fi - found=0 - for f2 in $@; do - if [ $f != $f2 ]; then - FNS2=`nm $f2 | grep ' U ' | awk '{print $2}'` - for fn2 in $FNS2; do - if [ $fn2 = $fn ]; then - found=1 - break - fi - done - fi - done - if [ $found = 0 ]; then - echo "Global variable $fn is unique to $f" - fi - done -done |