Blame view
scripts/headers_check.pl
2.71 KB
15a2ee74d Fix incompatibili... |
1 |
#!/usr/bin/perl -w |
7712401ae kbuild: optimize ... |
2 3 4 |
# # headers_check.pl execute a number of trivial consistency checks # |
67b7ebe09 kbuild/headers_ch... |
5 |
# Usage: headers_check.pl dir arch [files...] |
7712401ae kbuild: optimize ... |
6 7 8 9 10 11 12 13 14 15 16 |
# dir: dir to look for included files # arch: architecture # files: list of files to check # # The script reads the supplied files line by line and: # # 1) for each include statement it checks if the # included file actually exists. # Only include files located in asm* and linux* are checked. # The rest are assumed to be system include files. # |
46b8af50b headers_check.pl:... |
17 18 |
# 2) It is checked that prototypes does not use "extern" # |
7e557a250 kbuild: check for... |
19 |
# 3) Check for leaked CONFIG_ symbols |
7712401ae kbuild: optimize ... |
20 21 |
use strict; |
7712401ae kbuild: optimize ... |
22 23 24 25 26 27 28 29 30 31 |
my ($dir, $arch, @files) = @ARGV; my $ret = 0; my $line; my $lineno = 0; my $filename; foreach my $file (@files) { $filename = $file; |
dbbe33e99 headers_check: fi... |
32 33 34 35 |
open(my $fh, '<', $filename) or die "$filename: $! "; |
7712401ae kbuild: optimize ... |
36 |
$lineno = 0; |
dbbe33e99 headers_check: fi... |
37 |
while ($line = <$fh>) { |
7712401ae kbuild: optimize ... |
38 |
$lineno++; |
483b41218 kbuild: add check... |
39 40 41 |
&check_include(); &check_asm_types(); &check_sizetypes(); |
67b7ebe09 kbuild/headers_ch... |
42 |
&check_declarations(); |
7e3fa5614 kbuild: drop chec... |
43 |
# Dropped for now. Too much noise &check_config(); |
7712401ae kbuild: optimize ... |
44 |
} |
dbbe33e99 headers_check: fi... |
45 |
close $fh; |
7712401ae kbuild: optimize ... |
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
} exit $ret; sub check_include { if ($line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/) { my $inc = $1; my $found; $found = stat($dir . "/" . $inc); if (!$found) { $inc =~ s#asm/#asm-$arch/#; $found = stat($dir . "/" . $inc); } if (!$found) { printf STDERR "$filename:$lineno: included file '$inc' is not exported "; $ret = 1; } } } |
46b8af50b headers_check.pl:... |
66 |
|
67b7ebe09 kbuild/headers_ch... |
67 |
sub check_declarations |
46b8af50b headers_check.pl:... |
68 |
{ |
de323f22a headers_check: be... |
69 |
if ($line =~m/^(\s*extern|unsigned|char|short|int|long|void)\b/) { |
67b7ebe09 kbuild/headers_ch... |
70 |
printf STDERR "$filename:$lineno: " . |
d52784eb3 headers_check: Fi... |
71 72 73 |
"userspace cannot reference function or " . "variable defined in the kernel "; |
46b8af50b headers_check.pl:... |
74 75 |
} } |
7e557a250 kbuild: check for... |
76 77 78 |
sub check_config { |
1581c1ced scripts/headers_c... |
79 |
if ($line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9_]+)[^a-zA-Z0-9_]/) { |
7e557a250 kbuild: check for... |
80 81 82 83 |
printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid "; } } |
483b41218 kbuild: add check... |
84 |
my $linux_asm_types; |
dbbe33e99 headers_check: fi... |
85 |
sub check_asm_types |
483b41218 kbuild: add check... |
86 |
{ |
b67ff8ce1 kbuild: ignore a ... |
87 88 89 |
if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) { return; } |
483b41218 kbuild: add check... |
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
if ($lineno == 1) { $linux_asm_types = 0; } elsif ($linux_asm_types >= 1) { return; } if ($line =~ m/^\s*#\s*include\s+<asm\/types.h>/) { $linux_asm_types = 1; printf STDERR "$filename:$lineno: " . "include of <linux/types.h> is preferred over <asm/types.h> " # Warn until headers are all fixed #$ret = 1; } } my $linux_types; sub check_sizetypes { |
b67ff8ce1 kbuild: ignore a ... |
108 109 110 |
if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) { return; } |
483b41218 kbuild: add check... |
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
if ($lineno == 1) { $linux_types = 0; } elsif ($linux_types >= 1) { return; } if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) { $linux_types = 1; return; } if ($line =~ m/__[us](8|16|32|64)\b/) { printf STDERR "$filename:$lineno: " . "found __[us]{8,16,32,64} type " . "without #include <linux/types.h> "; $linux_types = 2; # Warn until headers are all fixed #$ret = 1; } } |