Blame view

scripts/headers_check.pl 2.71 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;
7712401ae   Sam Ravnborg   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   Stephen Hemminger   headers_check: fi...
32
33
34
35
  
  	open(my $fh, '<', $filename)
  		or die "$filename: $!
  ";
7712401ae   Sam Ravnborg   kbuild: optimize ...
36
  	$lineno = 0;
dbbe33e99   Stephen Hemminger   headers_check: fi...
37
  	while ($line = <$fh>) {
7712401ae   Sam Ravnborg   kbuild: optimize ...
38
  		$lineno++;
483b41218   Sam Ravnborg   kbuild: add check...
39
40
41
  		&check_include();
  		&check_asm_types();
  		&check_sizetypes();
67b7ebe09   Amerigo Wang   kbuild/headers_ch...
42
  		&check_declarations();
7e3fa5614   Sam Ravnborg   kbuild: drop chec...
43
  		# Dropped for now. Too much noise &check_config();
7712401ae   Sam Ravnborg   kbuild: optimize ...
44
  	}
dbbe33e99   Stephen Hemminger   headers_check: fi...
45
  	close $fh;
7712401ae   Sam Ravnborg   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   Mike Frysinger   headers_check.pl:...
66

67b7ebe09   Amerigo Wang   kbuild/headers_ch...
67
  sub check_declarations
46b8af50b   Mike Frysinger   headers_check.pl:...
68
  {
de323f22a   akpm@linux-foundation.org   headers_check: be...
69
  	if ($line =~m/^(\s*extern|unsigned|char|short|int|long|void)\b/) {
67b7ebe09   Amerigo Wang   kbuild/headers_ch...
70
  		printf STDERR "$filename:$lineno: " .
d52784eb3   akpm@linux-foundation.org   headers_check: Fi...
71
72
73
  			      "userspace cannot reference function or " .
  			      "variable defined in the kernel
  ";
46b8af50b   Mike Frysinger   headers_check.pl:...
74
75
  	}
  }
7e557a250   Sam Ravnborg   kbuild: check for...
76
77
78
  
  sub check_config
  {
1581c1ced   Robert P. J. Day   scripts/headers_c...
79
  	if ($line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9_]+)[^a-zA-Z0-9_]/) {
7e557a250   Sam Ravnborg   kbuild: check for...
80
81
82
83
  		printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid
  ";
  	}
  }
483b41218   Sam Ravnborg   kbuild: add check...
84
  my $linux_asm_types;
dbbe33e99   Stephen Hemminger   headers_check: fi...
85
  sub check_asm_types
483b41218   Sam Ravnborg   kbuild: add check...
86
  {
b67ff8ce1   Sam Ravnborg   kbuild: ignore a ...
87
88
89
  	if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  		return;
  	}
483b41218   Sam Ravnborg   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   Sam Ravnborg   kbuild: ignore a ...
108
109
110
  	if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  		return;
  	}
483b41218   Sam Ravnborg   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;
  	}
  }