(perl #131836) avoid a use-after-free after parsing a "sub" keyword
[perl.git] / Porting / checkcfguse.pl
1 #!/usr/bin/perl -w
2
3 #
4 # checkcfguse.pl
5 #
6 # (1) finds all the Configure/config symbols
7 #
8 # (2) greps for their use in the core files and shows which ones.
9 #
10
11 use strict;
12 use warnings;
13
14 my %SYM;
15
16 my @PAT =
17     (
18      [
19       # The format is:
20       # (1) aref of filename glob patterns
21       # (2) aref of qr patterns, the submatch $1 is the symbol name
22       [
23        "config_h.SH",
24       ],
25       [
26        qr/^#\$(\w+)\s+(\w+)/,
27       ],
28      ],
29      [
30       [
31        "NetWare/config_H.??",
32        "Porting/config.sh",
33        "plan9/config_h.sample",
34        "win32/config_H.??",
35       ],
36       qr{^(?:\Q/*\E)?#(?:define|undef)\s+(\w+)},
37      ],
38      [
39       [
40        "configure.com",
41       ],
42       qr{^(\w+)="(?:define|undef)"},
43      ],
44     );
45
46 {
47   print STDERR "$0: Looking for symbols...\n";
48   for my $pat (@PAT) {
49     for my $fn (map { glob($_) } @{ $pat->[0] }) {
50       if (open(my $fh, '<', $fn)) {
51         while (<$fh>) {
52           for my $p (@$pat) {
53             for my $sym (/$p/g) {
54               $SYM{$sym}{$fn}++;
55             }
56           }
57         }
58       }
59     }
60   }
61 }
62
63 printf(STDERR "$0: Found %d symbols\n", scalar keys %SYM);
64
65 print STDERR "$0: Looking for their uses...\n";
66
67 # Much too noisy grepping.
68 delete $SYM{'_'};
69 delete $SYM{'const'};
70
71 my $SYM = join("|", sort { length($b) <=> length($a) || $a cmp $b } keys %SYM);
72
73 open(my $mani, '<', "MANIFEST") or die "$0: Failed to open MANIFEST\n";
74
75 my %found;
76 while (<$mani>) {
77   if (/^(\S+)\s+/) {
78     my $fn = $1;
79     # Skip matches from the config files themselves,
80     # from metaconfig generated files that refer to
81     # the config symbols, and from pods.
82     next if $fn =~ m{^(?:config_h.SH|Configure|configure\.com|Porting/(?:config|Glossary)|(?:NetWare|plan9|win32)/(?:config|(?:GNU)?[Mm]akefile)|uconfig)|\.pod$};
83     open my $fh, '<', $fn or die qq[$0: Failed to open $fn: $!];
84     while (<$fh>) {
85       while (/\b($SYM)\b/go) {
86         $found{$1}{$fn}++;
87       }
88     }
89   }
90 }
91
92 for my $sym (sort keys %SYM) {
93   if (exists $found{$sym}) {
94     my @found = keys %{$found{$sym}};
95     print "$sym\t", join(" ", sort @found), "\n";
96   } else {
97     print "$sym\n";
98   }
99 }