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