Initial import
[samba] / source / script / findstatic.pl
diff --git a/source/script/findstatic.pl b/source/script/findstatic.pl
new file mode 100755 (executable)
index 0000000..43a4916
--- /dev/null
@@ -0,0 +1,70 @@
+#!/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";
+       my($found_one) = 0;
+       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;
+                                               $found_one = 1;
+                                       }
+                               }
+                       }
+               }
+               if ($found == 0) {
+                       my($t) = $typemap{$stype{$s}};
+                       print "  '$s' is unique to $f  ($t)\n";
+               }
+       }
+       if ($found_one == 0) {
+               print "  all symbols in '$f' are unused (main program?)\n";
+       }
+}
+