Blame view

scripts/headers_check.pl 3.6 KB
15a2ee74d   Jeremy Huntwork   Fix incompatibili...
1
  #!/usr/bin/perl -w
7712401ae   Sam Ravnborg   kbuild: optimize ...
2
3
4
  #
  # headers_check.pl execute a number of trivial consistency checks
  #
67b7ebe09   Amerigo Wang   kbuild/headers_ch...
5
  # Usage: headers_check.pl dir arch [files...]
7712401ae   Sam Ravnborg   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   Mike Frysinger   headers_check.pl:...
17
18
  # 2) It is checked that prototypes does not use "extern"
  #
7e557a250   Sam Ravnborg   kbuild: check for...
19
  # 3) Check for leaked CONFIG_ symbols
7712401ae   Sam Ravnborg   kbuild: optimize ...
20
21
  
  use strict;
f75a8df3b   Bobby Powers   headers_check: re...
22
  use File::Basename;
7712401ae   Sam Ravnborg   kbuild: optimize ...
23
24
25
26
27
28
29
30
31
32
  
  my ($dir, $arch, @files) = @ARGV;
  
  my $ret = 0;
  my $line;
  my $lineno = 0;
  my $filename;
  
  foreach my $file (@files) {
  	$filename = $file;
dbbe33e99   Stephen Hemminger   headers_check: fi...
33
34
35
36
  
  	open(my $fh, '<', $filename)
  		or die "$filename: $!
  ";
7712401ae   Sam Ravnborg   kbuild: optimize ...
37
  	$lineno = 0;
dbbe33e99   Stephen Hemminger   headers_check: fi...
38
  	while ($line = <$fh>) {
7712401ae   Sam Ravnborg   kbuild: optimize ...
39
  		$lineno++;
483b41218   Sam Ravnborg   kbuild: add check...
40
41
42
  		&check_include();
  		&check_asm_types();
  		&check_sizetypes();
67b7ebe09   Amerigo Wang   kbuild/headers_ch...
43
  		&check_declarations();
7e3fa5614   Sam Ravnborg   kbuild: drop chec...
44
  		# Dropped for now. Too much noise &check_config();
7712401ae   Sam Ravnborg   kbuild: optimize ...
45
  	}
dbbe33e99   Stephen Hemminger   headers_check: fi...
46
  	close $fh;
7712401ae   Sam Ravnborg   kbuild: optimize ...
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  }
  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   Mike Frysinger   headers_check.pl:...
67

67b7ebe09   Amerigo Wang   kbuild/headers_ch...
68
  sub check_declarations
46b8af50b   Mike Frysinger   headers_check.pl:...
69
  {
a7e1d98f3   Paul Bolle   headers_check: sp...
70
71
72
73
74
  	# soundcard.h is what it is
  	if ($line =~ m/^void seqbuf_dump\(void\);/) {
  		return;
  	}
  	if ($line =~ m/^(\s*extern|unsigned|char|short|int|long|void)\b/) {
67b7ebe09   Amerigo Wang   kbuild/headers_ch...
75
  		printf STDERR "$filename:$lineno: " .
d52784eb3   akpm@linux-foundation.org   headers_check: Fi...
76
77
78
  			      "userspace cannot reference function or " .
  			      "variable defined in the kernel
  ";
46b8af50b   Mike Frysinger   headers_check.pl:...
79
80
  	}
  }
7e557a250   Sam Ravnborg   kbuild: check for...
81
82
83
  
  sub check_config
  {
1581c1ced   Robert P. J. Day   scripts/headers_c...
84
  	if ($line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9_]+)[^a-zA-Z0-9_]/) {
7e557a250   Sam Ravnborg   kbuild: check for...
85
86
87
88
  		printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid
  ";
  	}
  }
483b41218   Sam Ravnborg   kbuild: add check...
89
  my $linux_asm_types;
dbbe33e99   Stephen Hemminger   headers_check: fi...
90
  sub check_asm_types
483b41218   Sam Ravnborg   kbuild: add check...
91
  {
b67ff8ce1   Sam Ravnborg   kbuild: ignore a ...
92
93
94
  	if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  		return;
  	}
483b41218   Sam Ravnborg   kbuild: add check...
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  	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;
f75a8df3b   Bobby Powers   headers_check: re...
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  my %import_stack = ();
  sub check_include_typesh
  {
  	my $path = $_[0];
  	my $import_path;
  
  	my $fh;
  	my @file_paths = ($path, $dir . "/" .  $path, dirname($filename) . "/" . $path);
  	for my $possible ( @file_paths ) {
  	    if (not $import_stack{$possible} and open($fh, '<', $possible)) {
  		$import_path = $possible;
  		$import_stack{$import_path} = 1;
  		last;
  	    }
  	}
  	if (eof $fh) {
  	    return;
  	}
  
  	my $line;
  	while ($line = <$fh>) {
  		if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) {
  			$linux_types = 1;
  			last;
  		}
  		if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) {
  			check_include_typesh($included);
  		}
  	}
  	close $fh;
  	delete $import_stack{$import_path};
  }
483b41218   Sam Ravnborg   kbuild: add check...
143
144
  sub check_sizetypes
  {
b67ff8ce1   Sam Ravnborg   kbuild: ignore a ...
145
146
147
  	if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  		return;
  	}
483b41218   Sam Ravnborg   kbuild: add check...
148
149
150
151
152
153
154
155
156
  	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;
  	}
f75a8df3b   Bobby Powers   headers_check: re...
157
158
159
  	if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) {
  		check_include_typesh($included);
  	}
483b41218   Sam Ravnborg   kbuild: add check...
160
161
162
163
164
165
166
167
168
169
  	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;
  	}
  }