added demo of AIO/setresuid race
[tridge/junkcode.git] / findstatic.pl
1 #!/usr/bin/perl -w
2 # find a list of fns and variables in the code that could be static
3 # usually called with something like this:
4 #    findstatic.pl `find . -name "*.o"`
5 # Andrew Tridgell <tridge@samba.org>
6
7 use strict;
8
9 # use nm to find the symbols
10 my($saved_delim) = $/;
11 undef $/;
12 my($syms) = `nm -o @ARGV`;
13 $/ = $saved_delim;
14
15 my(@lines) = split(/\n/s, $syms);
16
17 my(%def);
18 my(%undef);
19 my(%stype);
20
21 my(%typemap) = (
22                "T" => "function",
23                "C" => "uninitialised variable",
24                "D" => "initialised variable"
25                 );
26
27
28 # parse the symbols into defined and undefined 
29 for (my($i)=0; $i <= $#{@lines}; $i++) {
30         my($line) = $lines[$i];
31         if ($line =~ /(.*):[a-f0-9]* ([TCD]) (.*)/) {
32                 my($fname) = $1;
33                 my($symbol) = $3;
34                 push(@{$def{$fname}}, $symbol);
35                 $stype{$symbol} = $2;
36         }
37         if ($line =~ /(.*):\s* U (.*)/) {
38                 my($fname) = $1;
39                 my($symbol) = $2;
40                 push(@{$undef{$fname}}, $symbol);
41         }
42 }
43
44 # look for defined symbols that are never referenced outside the place they 
45 # are defined
46 foreach my $f (keys %def) {
47         print "Checking $f\n";
48         my($found_one) = 0;
49         foreach my $s (@{$def{$f}}) {
50                 my($found) = 0;
51                 foreach my $f2 (keys %undef) {
52                         if ($f2 ne $f) {
53                                 foreach my $s2 (@{$undef{$f2}}) {
54                                         if ($s2 eq $s) {
55                                                 $found = 1;
56                                                 $found_one = 1;
57                                         }
58                                 }
59                         }
60                 }
61                 if ($found == 0) {
62                         my($t) = $typemap{$stype{$s}};
63                         print "  '$s' is unique to $f  ($t)\n";
64                 }
65         }
66         if ($found_one == 0) {
67                 print "  all symbols in '$f' are unused (main program?)\n";
68         }
69 }
70