Blame view

scripts/checkpatch.pl 90.9 KB
0a920b5b6   Andy Whitcroft   add a trivial pat...
1
  #!/usr/bin/perl -w
dbf004d78   Dave Jones   remove my email a...
2
  # (c) 2001, Dave Jones. (the file handling bit)
00df344fd   Andy Whitcroft   update checkpatch...
3
  # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
2a5a2c252   Andy Whitcroft   checkpatch: updat...
4
  # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
015830be9   Andy Whitcroft   checkpatch: updat...
5
  # (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
0a920b5b6   Andy Whitcroft   add a trivial pat...
6
7
8
9
10
  # Licensed under the terms of the GNU GPL License version 2
  
  use strict;
  
  my $P = $0;
00df344fd   Andy Whitcroft   update checkpatch...
11
  $P =~ s@.*/@@g;
0a920b5b6   Andy Whitcroft   add a trivial pat...
12

000d1cc18   Joe Perches   checkpatch.pl: ad...
13
  my $V = '0.32';
0a920b5b6   Andy Whitcroft   add a trivial pat...
14
15
16
17
18
19
20
  
  use Getopt::Long qw(:config no_auto_abbrev);
  
  my $quiet = 0;
  my $tree = 1;
  my $chk_signoff = 1;
  my $chk_patch = 1;
773647a09   Andy Whitcroft   update checkpatch...
21
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
22
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
23
  my $terse = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
24
25
  my $file = 0;
  my $check = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
26
27
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
28
  my $summary_file = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
29
  my $show_types = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
30
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
31
  my %debug;
000d1cc18   Joe Perches   checkpatch.pl: ad...
32
33
  my %ignore_type = ();
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
34
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
35
  my $configuration_file = ".checkpatch.conf";
77f5b10a8   Hannes Eder   checkpatch: make ...
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  
  sub help {
  	my ($exitcode) = @_;
  
  	print << "EOM";
  Usage: $P [OPTION]... [FILE]...
  Version: $V
  
  Options:
    -q, --quiet                quiet
    --no-tree                  run without a kernel tree
    --no-signoff               do not check for 'Signed-off-by' line
    --patch                    treat FILE as patchfile (default)
    --emacs                    emacs compile window format
    --terse                    one line per report
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
000d1cc18   Joe Perches   checkpatch.pl: ad...
53
54
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
    --show-types               show the message "types" in the output
77f5b10a8   Hannes Eder   checkpatch: make ...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    --root=PATH                PATH to the kernel tree root
    --no-summary               suppress the per-file summary
    --mailback                 only produce a report in case of warnings/errors
    --summary-file             include the filename in summary
    --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
                               'values', 'possible', 'type', and 'attr' (default
                               is all off)
    --test-only=WORD           report only warnings/errors containing WORD
                               literally
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  my $conf = which_conf($configuration_file);
  if (-f $conf) {
  	my @conf_args;
  	open(my $conffile, '<', "$conf")
  	    or warn "$P: Can't find a readable $configuration_file file $!
  ";
  
  	while (<$conffile>) {
  		my $line = $_;
  
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
  		$line =~ s/\s+/ /g;
  
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my @words = split(" ", $line);
  		foreach my $word (@words) {
  			last if ($word =~ m/^#/);
  			push (@conf_args, $word);
  		}
  	}
  	close($conffile);
  	unshift(@ARGV, @conf_args) if @conf_args;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
98
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
99
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
100
101
102
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
103
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
104
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
105
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
106
107
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
108
109
  	'ignore=s'	=> \@ignore,
  	'show-types!'	=> \$show_types,
6c72ffaab   Andy Whitcroft   update checkpatch...
110
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
111
112
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
113
  	'summary-file!'	=> \$summary_file,
c2fdda0df   Andy Whitcroft   update checkpatch...
114
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
115
  	'test-only=s'	=> \$tst_only,
77f5b10a8   Hannes Eder   checkpatch: make ...
116
117
118
119
120
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
121
122
123
124
  
  my $exit = 0;
  
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
125
126
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
127
128
  	exit(1);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
129
130
131
132
133
134
135
136
137
138
139
140
141
  @ignore = split(/,/, join(',',@ignore));
  foreach my $word (@ignore) {
  	$word =~ s/\s*
  ?$//g;
  	$word =~ s/^\s*//g;
  	$word =~ s/\s+/ /g;
  	$word =~ tr/[a-z]/[A-Z]/;
  
  	next if ($word =~ m/^\s*#/);
  	next if ($word =~ m/^\s*$/);
  
  	$ignore_type{$word}++;
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
142
143
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
144
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
145
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
146
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
147
148
149
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
150
  }
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
151
  my $rpt_cleaners = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
152
153
154
155
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  if ($tree) {
  	if (defined $root) {
  		if (!top_of_kernel_tree($root)) {
  			die "$P: $root: --root does not point at a valid tree
  ";
  		}
  	} else {
  		if (top_of_kernel_tree('.')) {
  			$root = '.';
  		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
  						top_of_kernel_tree($1)) {
  			$root = $1;
  		}
  	}
  
  	if (!defined $root) {
  		print "Must be run from the top-level dir. of a kernel tree
  ";
  		exit(2);
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
176
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
177
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
178
179
180
181
  our $Ident	= qr{
  			[A-Za-z_][A-Za-z\d_]*
  			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
  		}x;
6c72ffaab   Andy Whitcroft   update checkpatch...
182
183
184
185
186
187
188
189
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
190
  			__kprobes|
165e72a6c   Sven Eckelmann   checkpatch: add _...
191
192
  			__ref|
  			__rcu
6c72ffaab   Andy Whitcroft   update checkpatch...
193
  		}x;
52131292c   Wolfram Sang   checkpatch: fix f...
194
195
196
  
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
197
198
  our $Attribute	= qr{
  			const|
03f1df7da   Joe Perches   checkpatch: Add a...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  			__percpu|
  			__nocast|
  			__safe|
  			__bitwise__|
  			__packed__|
  			__packed2__|
  			__naked|
  			__maybe_unused|
  			__always_unused|
  			__noreturn|
  			__used|
  			__cold|
  			__noclone|
  			__deprecated|
6c72ffaab   Andy Whitcroft   update checkpatch...
213
214
  			__read_mostly|
  			__kprobes|
52131292c   Wolfram Sang   checkpatch: fix f...
215
  			__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
216
217
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
218
219
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
220
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
221
  our $Modifier;
6c72ffaab   Andy Whitcroft   update checkpatch...
222
  our $Inline	= qr{inline|__always_inline|noinline};
6c72ffaab   Andy Whitcroft   update checkpatch...
223
224
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
d7c76ba7e   Joe Perches   checkpatch: impro...
225
  our $Constant	= qr{(?i:(?:[0-9]+|0x[0-9a-f]+)[ul]*)};
6c72ffaab   Andy Whitcroft   update checkpatch...
226
  our $Assignment	= qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
86f9d059c   Andy Whitcroft   checkpatch: allow...
227
  our $Compare    = qr{<=|>=|==|!=|<|>};
6c72ffaab   Andy Whitcroft   update checkpatch...
228
229
230
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
c2fdda0df   Andy Whitcroft   update checkpatch...
231
  			&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
6c72ffaab   Andy Whitcroft   update checkpatch...
232
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
233
234
235
  our $NonptrType;
  our $Type;
  our $Declare;
15662b3e8   Joe Perches   checkpatch: add a...
236
237
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
238
239
240
241
242
243
244
  	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
  	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
  	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
  	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
  	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
  	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  }x;
15662b3e8   Joe Perches   checkpatch: add a...
245
246
247
248
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
249
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
250
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
251
252
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
253
  our $logFunctions = qr{(?x:
6e60c02e9   Joe Perches   checkpatch.pl: up...
254
255
256
  	printk(?:_ratelimited|_once|)|
  	[a-z0-9]+_(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
257
258
  	panic|
  	MODULE_[A-Z_]+
691e669ba   Joe Perches   checkpatch.pl: al...
259
  )};
201124755   Joe Perches   checkpatch: valid...
260
261
262
263
264
265
266
267
268
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
  	To:|
  	Cc:
  )};
8905a67c6   Andy Whitcroft   update checkpatch...
269
270
  our @typeList = (
  	qr{void},
c45dcabd2   Andy Whitcroft   update checkpatch...
271
272
273
274
275
276
277
  	qr{(?:unsigned\s+)?char},
  	qr{(?:unsigned\s+)?short},
  	qr{(?:unsigned\s+)?int},
  	qr{(?:unsigned\s+)?long},
  	qr{(?:unsigned\s+)?long\s+int},
  	qr{(?:unsigned\s+)?long\s+long},
  	qr{(?:unsigned\s+)?long\s+long\s+int},
8905a67c6   Andy Whitcroft   update checkpatch...
278
279
280
281
  	qr{unsigned},
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
282
283
284
285
286
287
288
  	qr{struct\s+$Ident},
  	qr{union\s+$Ident},
  	qr{enum\s+$Ident},
  	qr{${Ident}_t},
  	qr{${Ident}_handler},
  	qr{${Ident}_handler_fn},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
289
290
291
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
292

7840a94cd   Wolfram Sang   checkpatch: refac...
293
294
295
296
297
  our $allowed_asm_includes = qr{(?x:
  	irq|
  	memory
  )};
  # memory.h: ARM has a custom one
8905a67c6   Andy Whitcroft   update checkpatch...
298
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
299
300
301
302
303
304
305
306
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
307
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
308
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
309
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
310
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
311
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
312
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
313
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
314
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
315
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
316
317
  		  }x;
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
318
  			$NonptrType
65863862b   Andy Whitcroft   checkpatch: dissa...
319
  			(?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
320
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
321
322
323
324
  		  }x;
  	$Declare	= qr{(?:$Storage\s+)?$Type};
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
325

7d2367af0   Joe Perches   checkpatch: sugge...
326
327
328
329
  our $match_balanced_parentheses = qr/(\((?:[^\(\)]+|(-1))*\))/;
  
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
  our $LvalOrFunc	= qr{($Lval)\s*($match_balanced_parentheses{0,1})\s*};
d7c76ba7e   Joe Perches   checkpatch: impro...
330
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
7d2367af0   Joe Perches   checkpatch: sugge...
331
332
333
334
335
336
337
338
339
  
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
  	$string =~ s@^\s*\(\s*@@g;
  	$string =~ s@\s*\)\s*$@@g;
  	$string =~ s@\s+@ @g;
  	return $string;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
340
  $chk_signoff = 0 if ($file);
4a0df2ef4   Andy Whitcroft   update checkpatch...
341
342
  my @dep_includes = ();
  my @dep_functions = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
343
344
  my $removal = "Documentation/feature-removal-schedule.txt";
  if ($tree && -f "$root/$removal") {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
345
  	open(my $REMOVE, '<', "$root/$removal") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
346
347
  				die "$P: $removal: open failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
348
  	while (<$REMOVE>) {
f0a594c1c   Andy Whitcroft   update checkpatch...
349
350
351
  		if (/^Check:\s+(.*\S)/) {
  			for my $entry (split(/[, ]+/, $1)) {
  				if ($entry =~ m@include/(.*)@) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
352
  					push(@dep_includes, $1);
4a0df2ef4   Andy Whitcroft   update checkpatch...
353

f0a594c1c   Andy Whitcroft   update checkpatch...
354
355
356
  				} elsif ($entry !~ m@/@) {
  					push(@dep_functions, $entry);
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
357
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
358
359
  		}
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
360
  	close($REMOVE);
0a920b5b6   Andy Whitcroft   add a trivial pat...
361
  }
00df344fd   Andy Whitcroft   update checkpatch...
362
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
363
364
  my @lines = ();
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
365
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
366
  	my $FILE;
6c72ffaab   Andy Whitcroft   update checkpatch...
367
  	if ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
368
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
369
370
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
371
372
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
373
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
374
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
375
376
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
377
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
378
379
380
381
382
  	if ($filename eq '-') {
  		$vname = 'Your patch';
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
383
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
384
385
386
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
387
  	close($FILE);
c2fdda0df   Andy Whitcroft   update checkpatch...
388
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
389
390
391
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
392
  	@lines = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
393
394
395
396
397
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
398
399
400
401
402
403
404
405
406
407
408
409
  	my ($root) = @_;
  
  	my @tree_check = (
  		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
  		"README", "Documentation", "arch", "include", "drivers",
  		"fs", "init", "ipc", "kernel", "lib", "scripts",
  	);
  
  	foreach my $check (@tree_check) {
  		if (! -e $root . '/' . $check) {
  			return 0;
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
410
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
411
  	return 1;
000d1cc18   Joe Perches   checkpatch.pl: ad...
412
      }
0a920b5b6   Andy Whitcroft   add a trivial pat...
413

201124755   Joe Perches   checkpatch: valid...
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
  sub parse_email {
  	my ($formatted_email) = @_;
  
  	my $name = "";
  	my $address = "";
  	my $comment = "";
  
  	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
  		$name = $1;
  		$address = $2;
  		$comment = $3 if defined $3;
  	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  		$formatted_email =~ s/$address.*$//;
  		$name = $formatted_email;
  		$name =~ s/^\s+|\s+$//g;
  		$name =~ s/^\"|\"$//g;
  		# If there's a name left after stripping spaces and
  		# leading quotes, and the address doesn't have both
  		# leading and trailing angle brackets, the address
  		# is invalid. ie:
  		#   "joe smith joe@smith.com" bad
  		#   "joe smith <joe@smith.com" bad
  		if ($name ne "" && $address !~ /^<[^>]+>$/) {
  			$name = "";
  			$address = "";
  			$comment = "";
  		}
  	}
  
  	$name =~ s/^\s+|\s+$//g;
  	$name =~ s/^\"|\"$//g;
  	$address =~ s/^\s+|\s+$//g;
  	$address =~ s/^\<|\>$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	return ($name, $address, $comment);
  }
  
  sub format_email {
  	my ($name, $address) = @_;
  
  	my $formatted_email;
  
  	$name =~ s/^\s+|\s+$//g;
  	$name =~ s/^\"|\"$//g;
  	$address =~ s/^\s+|\s+$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	if ("$name" eq "") {
  		$formatted_email = "$address";
  	} else {
  		$formatted_email = "$name <$address>";
  	}
  
  	return $formatted_email;
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
483
484
485
486
487
488
489
490
491
492
493
  sub which_conf {
  	my ($conf) = @_;
  
  	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
  		if (-e "$path/$conf") {
  			return "$path/$conf";
  		}
  	}
  
  	return "";
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
  sub expand_tabs {
  	my ($str) = @_;
  
  	my $res = '';
  	my $n = 0;
  	for my $c (split(//, $str)) {
  		if ($c eq "\t") {
  			$res .= ' ';
  			$n++;
  			for (; ($n % 8) != 0; $n++) {
  				$res .= ' ';
  			}
  			next;
  		}
  		$res .= $c;
  		$n++;
  	}
  
  	return $res;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
514
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
515
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
516
517
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
518

4a0df2ef4   Andy Whitcroft   update checkpatch...
519
520
521
522
523
524
525
526
527
528
529
530
  sub line_stats {
  	my ($line) = @_;
  
  	# Drop the diff line leader and expand tabs
  	$line =~ s/^.//;
  	$line = expand_tabs($line);
  
  	# Pick the indent from the front of the line.
  	my ($white) = ($line =~ /^(\s*)/);
  
  	return (length($line), length($white));
  }
773647a09   Andy Whitcroft   update checkpatch...
531
532
533
534
535
536
537
538
539
540
541
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
542
543
544
545
546
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
547
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
548
549
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
550

773647a09   Andy Whitcroft   update checkpatch...
551
552
553
554
555
556
557
558
559
560
561
562
563
564
  	# Always copy over the diff marker.
  	$res = substr($line, 0, 1);
  
  	for ($off = 1; $off < length($line); $off++) {
  		$c = substr($line, $off, 1);
  
  		# Comments we are wacking completly including the begin
  		# and end, all to $;.
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
  			$sanitise_quote = '*/';
  
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
00df344fd   Andy Whitcroft   update checkpatch...
565
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
566
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
567
568
569
570
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
571
  		}
113f04a83   Daniel Walker   checkpatch: handl...
572
573
574
575
576
577
578
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
579
580
581
582
583
584
585
  
  		# A \ in a string means ignore the next character.
  		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
  		    $c eq "\\") {
  			substr($res, $off, 2, 'XX');
  			$off++;
  			next;
00df344fd   Andy Whitcroft   update checkpatch...
586
  		}
773647a09   Andy Whitcroft   update checkpatch...
587
588
589
590
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
591

773647a09   Andy Whitcroft   update checkpatch...
592
593
594
595
596
597
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
598

fae17daed   Andy Whitcroft   checkpatch: comme...
599
600
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
601
602
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
603
604
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
605
606
607
608
609
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
610
  	}
113f04a83   Daniel Walker   checkpatch: handl...
611
612
613
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
614
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
615
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
616
617
618
619
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
620
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
621
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
622
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
623
  	}
00df344fd   Andy Whitcroft   update checkpatch...
624
625
  	return $res;
  }
8905a67c6   Andy Whitcroft   update checkpatch...
626
627
628
629
630
631
  sub ctx_statement_block {
  	my ($linenr, $remain, $off) = @_;
  	my $line = $linenr - 1;
  	my $blk = '';
  	my $soff = $off;
  	my $coff = $off - 1;
773647a09   Andy Whitcroft   update checkpatch...
632
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
633

13214adf7   Andy Whitcroft   update checkpatch...
634
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
635
636
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
637
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
638
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
639
640
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
641
642
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
643
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
644
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
645
646
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
647
648
649
650
  		# If we are about to drop off the end, pull in more
  		# context.
  		if ($off >= $len) {
  			for (; $remain > 0; $line++) {
dea33496d   Andy Whitcroft   checkpatch: suppr...
651
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
652
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
653
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
654
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
655
656
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
657
658
659
660
661
662
663
  				$len = length($blk);
  				$line++;
  				last;
  			}
  			# Bail if there is no further context.
  			#warn "CSB: blk<$blk> off<$off> len<$len>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
664
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
665
666
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
667
668
669
670
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
671
  		}
cf655043d   Andy Whitcroft   update checkpatch...
672
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
673
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
674
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
675

773647a09   Andy Whitcroft   update checkpatch...
676
677
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
678
679
680
681
682
683
684
685
686
  
  		# Handle nested #if/#else.
  		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
  			push(@stack, [ $type, $level ]);
  		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
  			($type, $level) = @{$stack[$#stack - 1]};
  		} elsif ($remainder =~ /^#\s*endif\b/) {
  			($type, $level) = @{pop(@stack)};
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
687
688
689
690
691
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
692
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
693
694
695
696
697
698
699
700
701
702
  		if ($level == 0 && $coff_set == 0 &&
  				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
  				$remainder =~ /^(else)(?:\s|{)/ &&
  				$remainder !~ /^else\s+if\b/) {
  			$coff = $off + length($1) - 1;
  			$coff_set = 1;
  			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>
  ";
  			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]
  ";
13214adf7   Andy Whitcroft   update checkpatch...
703
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
704
705
706
707
708
709
710
711
712
713
  		if (($type eq '' || $type eq '(') && $c eq '(') {
  			$level++;
  			$type = '(';
  		}
  		if ($type eq '(' && $c eq ')') {
  			$level--;
  			$type = ($level != 0)? '(' : '';
  
  			if ($level == 0 && $coff < $soff) {
  				$coff = $off;
773647a09   Andy Whitcroft   update checkpatch...
714
715
716
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
717
718
719
720
721
722
723
724
725
726
727
  			}
  		}
  		if (($type eq '' || $type eq '{') && $c eq '{') {
  			$level++;
  			$type = '{';
  		}
  		if ($type eq '{' && $c eq '}') {
  			$level--;
  			$type = ($level != 0)? '{' : '';
  
  			if ($level == 0) {
b998e001e   Patrick Pannuto   checkpatch: fix e...
728
729
730
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
731
732
733
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
734
735
736
737
738
739
740
741
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
742
743
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
744
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
745
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
746
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
747
748
749
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
750
751
752
753
754
755
756
757
  
  	my $statement = substr($blk, $soff, $off - $soff + 1);
  	my $condition = substr($blk, $soff, $coff - $soff + 1);
  
  	#warn "STATEMENT<$statement>
  ";
  	#warn "CONDITION<$condition>
  ";
773647a09   Andy Whitcroft   update checkpatch...
758
759
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
760
761
762
763
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
  sub statement_lines {
  	my ($stmt) = @_;
  
  	# Strip the diff line prefixes and rip blank lines at start and end.
  	$stmt =~ s/(^|
  )./$1/g;
  	$stmt =~ s/^\s*//;
  	$stmt =~ s/\s*$//;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  
  	return $#stmt_lines + 2;
  }
  
  sub statement_rawlines {
  	my ($stmt) = @_;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  
  	return $#stmt_lines + 2;
  }
  
  sub statement_block_size {
  	my ($stmt) = @_;
  
  	$stmt =~ s/(^|
  )./$1/g;
  	$stmt =~ s/^\s*{//;
  	$stmt =~ s/}\s*$//;
  	$stmt =~ s/^\s*//;
  	$stmt =~ s/\s*$//;
  
  	my @stmt_lines = ($stmt =~ /
  /g);
  	my @stmt_statements = ($stmt =~ /;/g);
  
  	my $stmt_lines = $#stmt_lines + 2;
  	my $stmt_statements = $#stmt_statements + 1;
  
  	if ($stmt_lines > $stmt_statements) {
  		return $stmt_lines;
  	} else {
  		return $stmt_statements;
  	}
  }
13214adf7   Andy Whitcroft   update checkpatch...
811
812
813
814
815
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
816
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
817
818
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
819
820
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
821
822
823
824
825
826
827
828
  	push(@chunks, [ $condition, $statement ]);
  	if (!($remain > 0 && $condition =~ /^\s*(?:
  [+-])?\s*(?:if|else|do)\b/s)) {
  		return ($level, $linenr, @chunks);
  	}
  
  	# Pull in the following conditional/block pairs and see if they
  	# could continue the statement.
13214adf7   Andy Whitcroft   update checkpatch...
829
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
830
831
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
832
833
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
834
835
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
836
837
838
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
839
840
841
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
842
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
843
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
844
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
845
846
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
847
848
849
850
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
851
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
852
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
853
854
855
856
857
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
858
859
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
860
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
861
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
862
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
863
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
864
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
865
866
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
867
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
868
869
870
871
872
873
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
874

f0a594c1c   Andy Whitcroft   update checkpatch...
875
876
877
878
879
880
881
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
882

f0a594c1c   Andy Whitcroft   update checkpatch...
883
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
884
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
885
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
886
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
887
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
888
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
889
890
891
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
892
893
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
894
895
896
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
897
898
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
899
900
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
901
902
903
904
905
906
  	my ($linenr, $remain, $off) = @_;
  
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  	return @r;
  }
  sub ctx_block_level {
653d4876b   Andy Whitcroft   update checkpatch...
907
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
908
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
909
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
910
911
912
913
914
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
915
916
917
918
919
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
920
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
921
922
923
924
925
926
927
  	return $current_comment if (defined $current_comment);
  
  	# Look through the context and try and figure out if there is a
  	# comment.
  	my $in_comment = 0;
  	$current_comment = '';
  	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
00df344fd   Andy Whitcroft   update checkpatch...
928
929
930
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
  		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
  			$in_comment = 1;
  		}
  		if ($line =~ m@/\*@) {
  			$in_comment = 1;
  		}
  		if (!$in_comment && $current_comment ne '') {
  			$current_comment = '';
  		}
  		$current_comment .= $line . "
  " if ($in_comment);
  		if ($line =~ m@\*/@) {
  			$in_comment = 0;
  		}
  	}
  
  	chomp($current_comment);
  	return($current_comment);
  }
  sub ctx_has_comment {
  	my ($first_line, $end_line) = @_;
  	my $cmt = ctx_locate_comment($first_line, $end_line);
00df344fd   Andy Whitcroft   update checkpatch...
953
954
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
955
956
957
958
959
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
  sub raw_line {
  	my ($linenr, $cnt) = @_;
  
  	my $offset = $linenr - 1;
  	$cnt++;
  
  	my $line;
  	while ($cnt) {
  		$line = $rawlines[$offset++];
  		next if (defined($line) && $line =~ /^-/);
  		$cnt--;
  	}
  
  	return $line;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
975
976
977
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
978

6c72ffaab   Andy Whitcroft   update checkpatch...
979
980
981
982
983
984
  	$res = '';
  	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
  		$res .= $1;
  		if ($2 ne '') {
  			$coded = sprintf("^%c", unpack('C', $2) + 64);
  			$res .= $coded;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
985
986
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
987
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
988

6c72ffaab   Andy Whitcroft   update checkpatch...
989
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
990
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
991
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
992
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
993
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
994
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
995
996
997
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
998
999
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1000
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1001
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1002
1003
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1004

6c72ffaab   Andy Whitcroft   update checkpatch...
1005
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1006
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1007
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1008
1009
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1010

6c72ffaab   Andy Whitcroft   update checkpatch...
1011
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1012
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1013
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1014
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1015
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1016
1017
1018
1019
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1020
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1021
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1022
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1023
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1024
1025
1026
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1027
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1028

e91b6e263   Andy Whitcroft   checkpatch: types...
1029
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1030
1031
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1032
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1033
1034
1035
1036
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1037
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1038
1039
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1040
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1041
1042
1043
1044
1045
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1046
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1047
1048
1049
1050
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1051

c45dcabd2   Andy Whitcroft   update checkpatch...
1052
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1053
1054
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1055
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1056
1057
1058
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1059
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1060

c45dcabd2   Andy Whitcroft   update checkpatch...
1061
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1062
1063
1064
1065
1066
  			print "PRE_RESTART($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  
  			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
171ae1a49   Andy Whitcroft   update checkpatch...
1067
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1068

c45dcabd2   Andy Whitcroft   update checkpatch...
1069
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1070
1071
1072
1073
1074
1075
1076
1077
1078
  			print "PRE_END($1)
  " if ($dbg_values > 1);
  
  			$av_preprocessor = 1;
  
  			# Assume all arms of the conditional end as this
  			# one does, and continue as if the #endif was not here.
  			pop(@av_paren_type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1079
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1080
1081
1082
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1083
1084
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1085

171ae1a49   Andy Whitcroft   update checkpatch...
1086
1087
1088
1089
1090
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1091
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1092
1093
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1094
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1095
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1096
1097
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1098
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1099
1100
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1101
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1102
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1103
1104
1105
1106
1107
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1108
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1109
1110
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1111
1112
1113
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1114
1115
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1116
1117
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1118
1119
1120
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1121
1122
1123
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1124
1125
1126
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1127
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1128
1129
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1130
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1131
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1132
1133
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1134
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1135
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1136

8e761b04a   Andy Whitcroft   checkpatch: detec...
1137
1138
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1139
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1140
1141
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1142
1143
1144
1145
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1146
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1147
1148
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1149
1150
1151
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1152
1153
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1154
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1155
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1156
1157
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1158
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1159
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1160
1161
1162
1163
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  		} elsif ($cur =~ /^(\?)/o) {
  			print "QUESTION($1)
  " if ($dbg_values > 1);
  			$type = 'N';
  
  		} elsif ($cur =~ /^(:)/o) {
  			print "COLON($1,$av_pend_colon)
  " if ($dbg_values > 1);
  
  			substr($var, length($res), 1, $av_pend_colon);
  			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
  				$type = 'E';
  			} else {
  				$type = 'N';
  			}
  			$av_pend_colon = 'O';
13214adf7   Andy Whitcroft   update checkpatch...
1180

8e761b04a   Andy Whitcroft   checkpatch: detec...
1181
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1182
1183
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1184
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1185
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
  			my $variant;
  
  			print "OPV($1)
  " if ($dbg_values > 1);
  			if ($type eq 'V') {
  				$variant = 'B';
  			} else {
  				$variant = 'U';
  			}
  
  			substr($var, length($res), 1, $variant);
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1198
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1199
1200
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1201
1202
1203
1204
1205
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1206
1207
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1208
1209
1210
1211
1212
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1213
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1214

1f65f947a   Andy Whitcroft   checkpatch: add c...
1215
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1216
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1217
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1218
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1219
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1220
1221
1222
1223
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1224
1225
1226
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1227
1228
1229
1230
1231
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1232
1233
1234
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1235
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1236
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1237
1238
1239
1240
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1241
1242
1243
1244
1245
1246
1247
  		# Check for modifiers.
  		$possible =~ s/\s*$Storage\s*//g;
  		$possible =~ s/\s*$Sparse\s*//g;
  		if ($possible =~ /^\s*$/) {
  
  		} elsif ($possible =~ /\s/) {
  			$possible =~ s/\s*$Type\s*//g;
d25065865   Andy Whitcroft   checkpatch: possi...
1248
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1249
1250
1251
1252
1253
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1254
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1255
1256
1257
1258
1259
1260
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1261
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1262
1263
1264
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1265
1266
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1267
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1268
1269
1270
  sub show_type {
         return !defined $ignore_type{$_[0]};
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
1271
  sub report {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1272
1273
  	if (!show_type($_[1]) ||
  	    (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
1274
1275
  		return 0;
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1276
1277
1278
1279
1280
1281
1282
1283
  	my $line;
  	if ($show_types) {
  		$line = "$prefix$_[0]:$_[1]: $_[2]
  ";
  	} else {
  		$line = "$prefix$_[0]: $_[2]
  ";
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1284
1285
1286
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1287
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1288
1289
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1290
1291
  }
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1292
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1293
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1294

de7d4f0e1   Andy Whitcroft   update checkpatch...
1295
  sub ERROR {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1296
  	if (report("ERROR", $_[0], $_[1])) {
773647a09   Andy Whitcroft   update checkpatch...
1297
1298
1299
  		our $clean = 0;
  		our $cnt_error++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1300
1301
  }
  sub WARN {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1302
  	if (report("WARNING", $_[0], $_[1])) {
773647a09   Andy Whitcroft   update checkpatch...
1303
1304
1305
  		our $clean = 0;
  		our $cnt_warn++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1306
1307
  }
  sub CHK {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1308
  	if ($check && report("CHECK", $_[0], $_[1])) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1309
1310
1311
  		our $clean = 0;
  		our $cnt_chk++;
  	}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1312
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
  sub check_absolute_file {
  	my ($absolute, $herecurr) = @_;
  	my $file = $absolute;
  
  	##print "absolute<$absolute>
  ";
  
  	# See if any suffix of this path is a path within the tree.
  	while ($file =~ s@^[^/]*/@@) {
  		if (-f "$root/$file") {
  			##print "file<$file>
  ";
  			last;
  		}
  	}
  	if (! -f _)  {
  		return 0;
  	}
  
  	# It is, so see if the prefix is acceptable.
  	my $prefix = $absolute;
  	substr($prefix, -length($file)) = '';
  
  	##print "prefix<$prefix>
  ";
  	if ($prefix ne ".../") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1339
1340
1341
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
1342
1343
  	}
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1344
1345
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1346
1347
1348
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1349
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1350
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1351
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1352

4a0df2ef4   Andy Whitcroft   update checkpatch...
1353
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1354
1355
1356
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1357
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1358
1359
  	my $signoff = 0;
  	my $is_patch = 0;
15662b3e8   Joe Perches   checkpatch: add a...
1360
1361
  	my $in_header_lines = 1;
  	my $in_commit_log = 0;		#Scanning lines before patch
13214adf7   Andy Whitcroft   update checkpatch...
1362
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1363
1364
1365
1366
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1367
1368
1369
1370
1371
1372
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
1373
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1374
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1375
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1376

13214adf7   Andy Whitcroft   update checkpatch...
1377
1378
1379
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1380
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1381
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1382
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1383
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
1384

c2fdda0df   Andy Whitcroft   update checkpatch...
1385
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1386
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1387
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1388
1389
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1390
1391
  
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1392
1393
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1394
1395
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1396

773647a09   Andy Whitcroft   update checkpatch...
1397
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1398
1399
1400
1401
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1402
1403
1404
1405
1406
1407
1408
1409
1410
  			#next;
  		}
  		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1411
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1412
1413
1414
1415
1416
1417
  
  			# Guestimate if this is a continuing comment.  Run
  			# the context looking for a comment "edge".  If this
  			# edge is a close comment then we must be in a comment
  			# at context start.
  			my $edge;
01fa91471   Andy Whitcroft   checkpatch: fix u...
1418
1419
1420
1421
1422
1423
1424
  			my $cnt = $realcnt;
  			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
  				next if (defined $rawlines[$ln - 1] &&
  					 $rawlines[$ln - 1] =~ /^-/);
  				$cnt--;
  				#print "RAW<$rawlines[$ln - 1]>
  ";
721c1cb60   Andy Whitcroft   checkpatch: comme...
1425
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1426
1427
1428
1429
1430
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1431
1432
1433
1434
1435
1436
1437
1438
1439
  			}
  			if (defined $edge && $edge eq '*/') {
  				$in_comment = 1;
  			}
  
  			# Guestimate if this is a continuing comment.  If this
  			# is the start of a diff block and this line starts
  			# ' *' then it is very likely a comment.
  			if (!defined $edge &&
83242e0c2   Andy Whitcroft   checkpatch: widen...
1440
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1441
1442
1443
1444
1445
1446
1447
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1448
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1449
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1450
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
1451
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1452
  		}
773647a09   Andy Whitcroft   update checkpatch...
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1465
1466
1467
1468
1469
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1470
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
1471
1472
  	$realcnt = 0;
  	$linenr = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1473
1474
  	foreach my $line (@lines) {
  		$linenr++;
c2fdda0df   Andy Whitcroft   update checkpatch...
1475
  		my $rawline = $rawlines[$linenr - 1];
6c72ffaab   Andy Whitcroft   update checkpatch...
1476

0a920b5b6   Andy Whitcroft   add a trivial pat...
1477
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
1478
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1479
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1480
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1481
1482
1483
1484
1485
1486
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
1487
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
1488
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
1489
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
1490
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1491
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1492
  			$suppress_statement = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1493
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1494

4a0df2ef4   Andy Whitcroft   update checkpatch...
1495
1496
1497
  # track the line number as we move through the hunk, note that
  # new versions of GNU diff omit the leading space on completely
  # blank context lines so we need to count that too.
773647a09   Andy Whitcroft   update checkpatch...
1498
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1499
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1500
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1501

4a0df2ef4   Andy Whitcroft   update checkpatch...
1502
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1503
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1504
1505
1506
1507
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
1508
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
1509
1510
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
1511

d8aaf1214   Andy Whitcroft   update checkpatch...
1512
1513
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1514
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
1515
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1516
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
1517
1518
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
1519
1520
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
1521
1522
  
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
1523
1524
1525
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
  			$realfile =~ s@^([^/]*)/@@;
270c49a08   Joe Perches   checkpatch: updat...
1526
  			$in_commit_log = 0;
3bf9a009f   Rabin Vincent   checkpatch: check...
1527
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
1528
  			$realfile = $1;
1e8557269   Wolfram Sang   checkpatch: Add w...
1529
  			$realfile =~ s@^([^/]*)/@@;
270c49a08   Joe Perches   checkpatch: updat...
1530
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1531
1532
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
1533
1534
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1535
1536
1537
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
1538
  			}
773647a09   Andy Whitcroft   update checkpatch...
1539

c1ab33269   Andy Whitcroft   checkpatch: inclu...
1540
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1541
1542
1543
1544
  				ERROR("MODIFIED_INCLUDE_ASM",
  				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>
  " . "$here$rawline
  ");
773647a09   Andy Whitcroft   update checkpatch...
1545
1546
1547
  			}
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
1548
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1549

c2fdda0df   Andy Whitcroft   update checkpatch...
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1560

6c72ffaab   Andy Whitcroft   update checkpatch...
1561
  		$cnt_lines++ if ($realcnt != 0);
3bf9a009f   Rabin Vincent   checkpatch: check...
1562
1563
1564
1565
1566
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
  			if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1567
1568
1569
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
1570
1571
  			}
  		}
201124755   Joe Perches   checkpatch: valid...
1572
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
1573
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
1574
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
1575
  			$in_commit_log = 0;
201124755   Joe Perches   checkpatch: valid...
1576
1577
1578
  		}
  
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
1579
1580
  		if (!$in_header_lines &&
  		    $line =~ /^(\s*)($signature_tags)(\s*)(.*)/) {
201124755   Joe Perches   checkpatch: valid...
1581
1582
1583
1584
1585
1586
1587
  			my $space_before = $1;
  			my $sign_off = $2;
  			my $space_after = $3;
  			my $email = $4;
  			my $ucfirst_sign_off = ucfirst(lc($sign_off));
  
  			if (defined $space_before && $space_before ne "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1588
1589
1590
  				WARN("BAD_SIGN_OFF",
  				     "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1591
1592
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1593
1594
1595
  				WARN("BAD_SIGN_OFF",
  				     "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1596
1597
  			}
  			if (!defined $space_after || $space_after ne " ") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1598
1599
1600
  				WARN("BAD_SIGN_OFF",
  				     "Use a single space after $ucfirst_sign_off
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1601
  			}
201124755   Joe Perches   checkpatch: valid...
1602
1603
1604
1605
  
  			my ($email_name, $email_address, $comment) = parse_email($email);
  			my $suggested_email = format_email(($email_name, $email_address));
  			if ($suggested_email eq "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1606
1607
1608
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1609
1610
1611
1612
1613
1614
1615
1616
1617
  			} else {
  				my $dequoted = $suggested_email;
  				$dequoted =~ s/^"//;
  				$dequoted =~ s/" </ </;
  				# Don't force email to have quotes
  				# Allow just an angle bracketed address
  				if ("$dequoted$comment" ne $email &&
  				    "<$email_address>$comment" ne $email &&
  				    "$suggested_email$comment" ne $email) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1618
1619
1620
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
1621
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1622
1623
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1624
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
1625
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1626
1627
1628
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
1629
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1630
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
  # Check for absolute kernel paths.
  		if ($tree) {
  			while ($line =~ m{(?:^|\s)(/\S*)}g) {
  				my $file = $1;
  
  				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
  				    check_absolute_file($1, $herecurr)) {
  					#
  				} else {
  					check_absolute_file($file, $herecurr);
  				}
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
1644
1645
  # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
  		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
171ae1a49   Andy Whitcroft   update checkpatch...
1646
1647
1648
1649
1650
1651
1652
  		    $rawline !~ m/^$UTF8*$/) {
  			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
  
  			my $blank = copy_spacing($rawline);
  			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
  			my $hereptr = "$hereline$ptr
  ";
34d992197   Joe Perches   checkpatch: make ...
1653
1654
1655
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
1656
  		}
15662b3e8   Joe Perches   checkpatch: add a...
1657
1658
1659
  # Check if it's the start of a commit log
  # (not a header line and we haven't seen the patch filename)
  		if ($in_header_lines && $realfile =~ /^$/ &&
270c49a08   Joe Perches   checkpatch: updat...
1660
  		    $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
15662b3e8   Joe Perches   checkpatch: add a...
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
  			$in_header_lines = 0;
  			$in_commit_log = 1;
  		}
  
  # Still not yet in a patch, check for any UTF-8
  		if ($in_commit_log && $realfile =~ /^$/ &&
  		    $rawline =~ /$NON_ASCII_UTF8/) {
  			CHK("UTF8_BEFORE_PATCH",
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
1672
1673
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1674

0a920b5b6   Andy Whitcroft   add a trivial pat...
1675
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1676
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1677
1678
1679
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1680
1681
1682
  			ERROR("DOS_LINE_ENDINGS",
  			      "DOS line endings
  " . $herevet);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1683

c2fdda0df   Andy Whitcroft   update checkpatch...
1684
1685
1686
1687
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1688
1689
1690
  			ERROR("TRAILING_WHITESPACE",
  			      "trailing whitespace
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1691
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1692
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1693

3354957a4   Andi Kleen   checkpatch: add c...
1694
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1695
1696
  # Only applies when adding the entry originally, after that we do not have
  # sufficient context to determine whether it is indeed long enough.
3354957a4   Andi Kleen   checkpatch: add c...
1697
  		if ($realfile =~ /Kconfig/ &&
a13858033   Andy Whitcroft   checkpatch: only ...
1698
  		    $line =~ /.\s*config\s+/) {
3354957a4   Andi Kleen   checkpatch: add c...
1699
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1700
1701
1702
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
1703
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1704
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
1705
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1706
1707
1708
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1709
1710
  
  				next if ($f =~ /^-/);
a13858033   Andy Whitcroft   checkpatch: only ...
1711
1712
1713
1714
1715
1716
  
  				if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
  					$is_start = 1;
  				} elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1717
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
1718
1719
1720
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
9fe287d79   Andy Whitcroft   checkpatch: ensur...
1721
1722
1723
1724
  				if ($f =~ /^\s*config\s/) {
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
1725
1726
  				$length++;
  			}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1727
  			WARN("CONFIG_DESCRIPTION",
a13858033   Andy Whitcroft   checkpatch: only ...
1728
1729
1730
1731
  			     "please write a paragraph that describes the config symbol fully
  " . $herecurr) if ($is_start && $is_end && $length < 4);
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
1732
  		}
c68e58783   Arnaud Lacombe   script/checkpatch...
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
  		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
  		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
  			my $flag = $1;
  			my $replacement = {
  				'EXTRA_AFLAGS' =>   'asflags-y',
  				'EXTRA_CFLAGS' =>   'ccflags-y',
  				'EXTRA_CPPFLAGS' => 'cppflags-y',
  				'EXTRA_LDFLAGS' =>  'ldflags-y',
  			};
  
  			WARN("DEPRECATED_VARIABLE",
  			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.
  " . $herecurr) if ($replacement->{$flag});
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
1747
1748
  # check we are in a valid source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1749
  #80 column limit
c45dcabd2   Andy Whitcroft   update checkpatch...
1750
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1751
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
0fccc6221   Joe Perches   checkpatch: fix d...
1752
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
8bbea968f   Joe Perches   checkpatch: add m...
1753
  		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
1754
  		    $length > 80)
c45dcabd2   Andy Whitcroft   update checkpatch...
1755
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
1756
1757
1758
  			WARN("LONG_LINE",
  			     "line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1759
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
1760
1761
1762
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1763
1764
1765
  			WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
  			     "unnecessary whitespace before a quoted newline
  " . $herecurr);
5e79d96ee   Joe Perches   checkpatch: warn ...
1766
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1767
1768
  # check for adding lines without a newline.
  		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1769
1770
1771
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
1772
  		}
42e41c54d   Mike Frysinger   checkpatch: add s...
1773
1774
1775
1776
1777
1778
  # Blackfin: use hi/lo macros
  		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
  			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1779
1780
1781
  				ERROR("LO_MACRO",
  				      "use the LO() macro, not (... & 0xFFFF)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1782
1783
1784
1785
1786
  			}
  			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1787
1788
1789
  				ERROR("HI_MACRO",
  				      "use the HI() macro, not (... >> 16)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1790
1791
  			}
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1792
1793
  # check we are in a valid source file C or perl if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c|pl)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1794
1795
1796
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
1797
1798
1799
1800
1801
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1802
1803
1804
  			ERROR("CODE_INDENT",
  			      "code indent should use tabs where possible
  " . $herevet);
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
1805
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1806
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1807
1808
1809
1810
1811
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1812
1813
1814
  			WARN("SPACE_BEFORE_TAB",
  			     "please, no space before tabs
  " . $herevet);
08e443656   Alberto Panizzo   checkpatch.pl: wa...
1815
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1816
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
1817
1818
1819
1820
1821
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
  		if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1822
1823
1824
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1825
1826
1827
  			WARN("LEADING_SPACE",
  			     "please, no spaces at the start of a line
  " . $herevet);
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
1828
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
1829
1830
  # check we are in a valid C source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c)$/);
c2fdda0df   Andy Whitcroft   update checkpatch...
1831
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
1832
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1833
1834
1835
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
1836
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1837

42e41c54d   Mike Frysinger   checkpatch: add s...
1838
1839
1840
1841
1842
  # Blackfin: don't use __builtin_bfin_[cs]sync
  		if ($line =~ /__builtin_bfin_csync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1843
1844
1845
  			ERROR("CSYNC",
  			      "use the CSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1846
1847
1848
1849
1850
  		}
  		if ($line =~ /__builtin_bfin_ssync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1851
1852
1853
  			ERROR("SSYNC",
  			      "use the SSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
1854
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1855
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1856
1857
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1858
1859
1860
1861
  #print "LINE<$line>
  ";
  		if ($linenr >= $suppress_statement &&
  		    $realcnt && $line =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
1862
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
1863
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
1864
1865
1866
1867
1868
1869
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
  #print "linenr<$linenr> <$stat>
  ";
  			# If this statement has no statement boundaries within
  			# it there is no point in retrying a statement scan
  			# until we hit end of it.
  			my $frag = $stat; $frag =~ s/;+\s*$//;
  			if ($frag !~ /(?:{|;)/) {
  #print "skip<$line_nr_next>
  ";
  				$suppress_statement = $line_nr_next;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1881

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1882
1883
1884
1885
1886
1887
1888
  			# Find the real next line.
  			$realline_next = $line_nr_next;
  			if (defined $realline_next &&
  			    (!defined $lines[$realline_next - 1] ||
  			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
  				$realline_next++;
  			}
171ae1a49   Andy Whitcroft   update checkpatch...
1889
1890
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
1891

c2fdda0df   Andy Whitcroft   update checkpatch...
1892
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
1893
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1894
1895
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
1896
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1897

463f28648   Andy Whitcroft   checkpatch: possi...
1898
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1899
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
1900
  			} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1901
1902
1903
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1904
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
1905
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1906
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
1907
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1908
1909
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
1910
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1911
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1912
1913
1914
1915
1916
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
1917
  			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
8905a67c6   Andy Whitcroft   update checkpatch...
1918
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
1919

cf655043d   Andy Whitcroft   update checkpatch...
1920
  				my $ctx = $s;
773647a09   Andy Whitcroft   update checkpatch...
1921
  				substr($ctx, 0, $name_len + 1, '');
8905a67c6   Andy Whitcroft   update checkpatch...
1922
  				$ctx =~ s/\)[^\)]*$//;
cf655043d   Andy Whitcroft   update checkpatch...
1923

8905a67c6   Andy Whitcroft   update checkpatch...
1924
  				for my $arg (split(/\s*,\s*/, $ctx)) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1925
  					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
8905a67c6   Andy Whitcroft   update checkpatch...
1926

c45dcabd2   Andy Whitcroft   update checkpatch...
1927
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
1928
1929
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1930
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1931

9c0ca6f9a   Andy Whitcroft   update checkpatch...
1932
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1933
1934
1935
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
1936

653d4876b   Andy Whitcroft   update checkpatch...
1937
1938
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
  		if ($line=~/\bswitch\s*\(.*\)/) {
  			my $err = '';
  			my $sep = '';
  			my @ctx = ctx_block_outer($linenr, $realcnt);
  			shift(@ctx);
  			for my $ctx (@ctx) {
  				my ($clen, $cindent) = line_stats($ctx);
  				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
  							$indent != $cindent) {
  					$err .= "$sep$ctx
  ";
  					$sep = '';
  				} else {
  					$sep = "[...]
  ";
  				}
  			}
  			if ($err ne '') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1957
1958
1959
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
1960
1961
1962
1963
1964
  			}
  		}
  
  # if/while/etc brace do not go on next line, unless defining a do while loop,
  # or if that brace on the next line is for something else
c45dcabd2   Andy Whitcroft   update checkpatch...
1965
  		if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
1966
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1967
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1968
1969
1970
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
1971
1972
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
1973

548596d52   Andy Whitcroft   checkpatch: trail...
1974
1975
1976
1977
1978
1979
  			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
  					defined $lines[$ctx_ln - 1] &&
  					$lines[$ctx_ln - 1] =~ /^-/)) {
  				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>
  ";
  				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1980
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1981
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
1982

53210168f   Andy Whitcroft   checkpatch: tough...
1983
1984
1985
1986
1987
1988
1989
  			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>
  ";
  			#print "pre<$pre_ctx>
  line<$line>
  ctx<$ctx>
  next<$lines[$ctx_ln - 1]>
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1990

773647a09   Andy Whitcroft   update checkpatch...
1991
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
1992
1993
1994
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
1995
1996
1997
1998
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
1999
  			}
773647a09   Andy Whitcroft   update checkpatch...
2000
2001
2002
2003
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2004
2005
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2006
2007
2008
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2009
2010
2011
2012
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2013
2014
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
2015
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2016
2017
  # Check relative indent for conditionals and blocks.
  		if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2018
2019
2020
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
  
  			# Make sure we remove the line prefixes as we have
  			# none on the first line, and are going to readd them
  			# where necessary.
  			$s =~ s/
  ./
  /gs;
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
2033
2034
2035
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
  
  			# We want to check the first line inside the block
  			# starting at the end of the conditional, so remove:
  			#  1) any blank line termination
  			#  2) any opening brace { on end of the line
  			#  3) any do (...) {
  			my $continuation = 0;
  			my $check = 0;
  			$s =~ s/^.*\bdo\b//;
  			$s =~ s/^\s*{//;
  			if ($s =~ s/^\s*\\//) {
  				$continuation = 1;
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2049
2050
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
  				$check = 1;
  				$cond_lines++;
  			}
  
  			# Also ignore a loop construct at the end of a
  			# preprocessor statement.
  			if (($prevline =~ /^.\s*#\s*define\s/ ||
  			    $prevline =~ /\\\s*$/) && $continuation == 0) {
  				$check = 0;
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2061
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
2062
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2063
2064
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
2065
2066
2067
2068
2069
  				# If we see an #else/#elif then the code
  				# is not linear.
  				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
  					$check = 0;
  				}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2070
2071
2072
2073
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
2074
2075
2076
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2077
2078
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
2079
2080
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
2081
2082
2083
2084
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2085
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
  			}
  
  			my (undef, $sindent) = line_stats("+" . $s);
  			my $stat_real = raw_line($linenr, $cond_lines);
  
  			# Check if either of these lines are modified, else
  			# this is not this patch's fault.
  			if (!defined($stat_real) ||
  			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
  				$check = 0;
  			}
  			if (defined($stat_real) && $cond_lines > 1) {
  				$stat_real = "[...]
  $stat_real";
  			}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2101
2102
  			#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>
  ";
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2103
2104
2105
  
  			if ($check && (($sindent % 8) != 0 ||
  			    ($sindent <= $indent && $s ne ''))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2106
2107
2108
2109
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2110
2111
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
2112
2113
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
2114
2115
2116
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
2117
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
2118
2119
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
2120
2121
2122
2123
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
2124
2125
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
2126
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
2127
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
2128
2129
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
2130
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
2131
2132
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2133
2134
2135
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
2136
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2137
2138
2139
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
2140
  			}
653d4876b   Andy Whitcroft   update checkpatch...
2141
2142
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
2143
2144
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
2145
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2146
2147
2148
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
2149
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2150
2151
2152
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
2153
2154
2155
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2156

f0a594c1c   Andy Whitcroft   update checkpatch...
2157
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
2158
2159
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2160
2161
2162
  			ERROR("OPEN_BRACE",
  			      "that open brace { should be on the previous line
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
2163
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2164
2165
2166
2167
2168
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2169
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
2170
2171
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2172
2173
2174
  				ERROR("MALFORMED_INCLUDE",
  				      "malformed #include filename
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
2175
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
2176
  			}
653d4876b   Andy Whitcroft   update checkpatch...
2177
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2178

0a920b5b6   Andy Whitcroft   add a trivial pat...
2179
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
2180
  		if ($line =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2181
2182
2183
  			ERROR("C99_COMMENTS",
  			      "do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2184
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2185
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2186
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
2187
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2188

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2189
2190
2191
2192
2193
2194
2195
2196
2197
  # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
  # the whole statement.
  #print "APW <$lines[$realline_next - 1]>
  ";
  		if (defined $realline_next &&
  		    exists $lines[$realline_next - 1] &&
  		    !defined $suppress_export{$realline_next} &&
  		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df3   Andy Whitcroft   checkpatch: handl...
2198
2199
2200
2201
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
2202
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
2203
2204
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
2205
2206
2207
2208
2209
2210
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2211
2212
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
2213
2214
2215
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2216
2217
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
2218
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2219
2220
2221
2222
2223
  #print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>
  ";
  				$suppress_export{$realline_next} = 2;
  			} else {
  				$suppress_export{$realline_next} = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2224
2225
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
  		if (!defined $suppress_export{$linenr} &&
  		    $prevline =~ /^.\s*$/ &&
  		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
  		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
  #print "FOO B <$lines[$linenr - 1]>
  ";
  			$suppress_export{$linenr} = 2;
  		}
  		if (defined $suppress_export{$linenr} &&
  		    $suppress_export{$linenr} == 2) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2236
2237
2238
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2239
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2240

5150bda43   Joe Eloff   checkpatch: chang...
2241
  # check for global initialisers.
c45dcabd2   Andy Whitcroft   update checkpatch...
2242
  		if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2243
2244
2245
  			ERROR("GLOBAL_INITIALISERS",
  			      "do not initialise globals to 0 or NULL
  " .
f0a594c1c   Andy Whitcroft   update checkpatch...
2246
2247
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2248
  # check for static initialisers.
2d1bafd79   Andy Whitcroft   checkpatch: do no...
2249
  		if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2250
2251
2252
  			ERROR("INITIALISED_STATIC",
  			      "do not initialise statics to 0 or NULL
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
2253
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2254
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
2255
2256
  # check for static const char * arrays.
  		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2257
2258
2259
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
2260
2261
2262
2263
2264
  				$herecurr);
                 }
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2265
2266
2267
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
2268
2269
  				$herecurr);
                 }
93ed0e2d0   Joe Perches   scripts/checkpatc...
2270
2271
  # check for declarations of struct pci_device_id
  		if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2272
2273
2274
  			WARN("DEFINE_PCI_DEVICE_TABLE",
  			     "Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id
  " . $herecurr);
93ed0e2d0   Joe Perches   scripts/checkpatc...
2275
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2276
2277
2278
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
2279
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2280
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
2281
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
2282
  		    $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2283
2284
2285
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2286
2287
2288
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
2289
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
2290
2291
2292
2293
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
  			my ($from, $to) = ($2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
2294
2295
2296
2297
2298
2299
  
  			# Should start with a space.
  			$to =~ s/^(\S)/ $1/;
  			# Should not end with a space.
  			$to =~ s/\s+$//;
  			# '*'s should not have spaces between.
f9a0b3d17   Andy Whitcroft   checkpatch: type/...
2300
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2301
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2302

65863862b   Andy Whitcroft   checkpatch: dissa...
2303
2304
2305
  			#print "from<$from> to<$to>
  ";
  			if ($from ne $to) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2306
2307
2308
  				ERROR("POINTER_LOCATION",
  				      "\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr);
65863862b   Andy Whitcroft   checkpatch: dissa...
2309
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
2310
2311
2312
2313
2314
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
  			my ($from, $to, $ident) = ($2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
2315
2316
2317
2318
2319
2320
  
  			# Should start with a space.
  			$to =~ s/^(\S)/ $1/;
  			# Should not end with a space.
  			$to =~ s/\s+$//;
  			# '*'s should not have spaces between.
f9a0b3d17   Andy Whitcroft   checkpatch: type/...
2321
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
2322
2323
2324
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
2325

667026e7b   Andy Whitcroft   checkpatch: a mod...
2326
2327
2328
  			#print "from<$from> to<$to> ident<$ident>
  ";
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2329
2330
2331
  				ERROR("POINTER_LOCATION",
  				      "\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr);
65863862b   Andy Whitcroft   checkpatch: dissa...
2332
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2333
2334
2335
2336
2337
2338
2339
2340
2341
  		}
  
  # # no BUG() or BUG_ON()
  # 		if ($line =~ /\b(BUG|BUG_ON)\b/) {
  # 			print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()
  ";
  # 			print "$herecurr";
  # 			$clean = 0;
  # 		}
8905a67c6   Andy Whitcroft   update checkpatch...
2342
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2343
2344
2345
  			WARN("LINUX_VERSION_CODE",
  			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2346
  		}
17441227f   Joe Perches   checkpatch: add w...
2347
2348
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2349
2350
2351
  			WARN("PRINTK_RATELIMITED",
  "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
2352
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2353
2354
2355
  # printk should use KERN_* levels.  Note that follow on printk's on the
  # same line do not need a level, so we use the current block context
  # to try and find and validate the current printk.  In summary the current
25985edce   Lucas De Marchi   Fix common misspe...
2356
  # printk includes all preceding printk's which have no newline on the end.
00df344fd   Andy Whitcroft   update checkpatch...
2357
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
2358
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
2359
2360
2361
2362
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
25985edce   Lucas De Marchi   Fix common misspe...
2363
  				# we have a preceding printk if it ends
00df344fd   Andy Whitcroft   update checkpatch...
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
  				# with "
  " ignore it, else it is to blame
  				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
  					if ($rawlines[$ln - 1] !~ m{\
  "}) {
  						$ok = 1;
  					}
  					last;
  				}
  			}
  			if ($ok == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2375
2376
2377
  				WARN("PRINTK_WITHOUT_KERN_LEVEL",
  				     "printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
2378
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2379
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2380
2381
  # function brace can't be on same line, except for #defines of do while,
  # or if closed on same line
c45dcabd2   Andy Whitcroft   update checkpatch...
2382
2383
  		if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2384
2385
2386
  			ERROR("OPEN_BRACE",
  			      "open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2387
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2388

8905a67c6   Andy Whitcroft   update checkpatch...
2389
2390
2391
  # open braces for enum, union and struct go on the same line.
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2392
2393
2394
  			ERROR("OPEN_BRACE",
  			      "open brace '{' following $1 go on the same line
  " . $hereprev);
8905a67c6   Andy Whitcroft   update checkpatch...
2395
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
2396
2397
  # missing space after union, struct or enum definition
  		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2398
2399
2400
  		    WARN("SPACING",
  			 "missing space after $1 definition
  " . $herecurr);
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
2401
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
2402
2403
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2404
2405
  #  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
  #  3. inside a curly brace -- = { [0...10] = 5 }
8d31cfcec   Andy Whitcroft   checkpatch: check...
2406
2407
2408
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
2409
2410
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
  			    $prefix !~ /{\s+$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2411
2412
2413
  				ERROR("BRACKET_SPACE",
  				      "space prohibited before open square bracket '['
  " . $herecurr);
8d31cfcec   Andy Whitcroft   checkpatch: check...
2414
2415
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2416
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
2417
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2418
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
2419
2420
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
2421
2422
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
2423
2424
2425
2426
2427
2428
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
2429
2430
2431
2432
  
  			# cpp #define statements have non-optional spaces, ie
  			# if there is a space between the name and the open
  			# parenthesis it is simply not a parameter group.
c45dcabd2   Andy Whitcroft   update checkpatch...
2433
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
2434
2435
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
2436
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2437
2438
2439
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
2440
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2441
2442
  
  			} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2443
2444
2445
  				WARN("SPACING",
  				     "space prohibited between function name and open parenthesis '('
  " . $herecurr);
6c72ffaab   Andy Whitcroft   update checkpatch...
2446
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
2447
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2448
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
2449
  		if (!($line=~/\#\s*include/)) {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2450
2451
2452
2453
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
2454
2455
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
  				\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2456
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
2457
  			my @elements = split(/($ops|;)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
2458
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
2459
2460
  
  			my $blank = copy_spacing($opline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2461
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2462
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
2463
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
2464
2465
2466
2467
2468
2469
  				my $ca = substr($opline, 0, $off);
  				my $cc = '';
  				if (length($opline) >= ($off + length($elements[$n + 1]))) {
  					$cc = substr($opline, $off + length($elements[$n + 1]));
  				}
  				my $cb = "$ca$;$cc";
4a0df2ef4   Andy Whitcroft   update checkpatch...
2470
2471
2472
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
2473
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2474
2475
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
2476
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2477

0a920b5b6   Andy Whitcroft   add a trivial pat...
2478
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
2479
2480
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2481
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2482
2483
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
2484
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2485
2486
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
2487
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
2488
2489
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2490
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2491
2492
2493
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
2494
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2495
2496
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2497

74048ed81   Andy Whitcroft   checkpatch: varia...
2498
  				# Pull out the value of this operator.
6c72ffaab   Andy Whitcroft   update checkpatch...
2499
  				my $op_type = substr($curr_values, $off + 1, 1);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2500

1f65f947a   Andy Whitcroft   checkpatch: add c...
2501
2502
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
2503
2504
2505
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
2506
2507
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
2508

d8aaf1214   Andy Whitcroft   update checkpatch...
2509
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
2510
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
2511
2512
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2513
2514
2515
  						ERROR("SPACING",
  						      "space required after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
2516
2517
2518
2519
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2520

1f65f947a   Andy Whitcroft   checkpatch: add c...
2521
2522
2523
2524
  				# No spaces for:
  				#   ->
  				#   :   when part of a bitfield
  				} elsif ($op eq '->' || $opv eq ':B') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2525
  					if ($ctx =~ /Wx.|.xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2526
2527
2528
  						ERROR("SPACING",
  						      "spaces prohibited around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2529
2530
2531
2532
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
2533
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2534
2535
2536
  						ERROR("SPACING",
  						      "space required after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2537
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2538
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
2539
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2540
2541
2542
2543
2544
2545
2546
  					#warn "'*' is part of type
  ";
  
  				# unary operators should have a space before and
  				# none after.  May be left adjacent to another
  				# unary operator, or a cast
  				} elsif ($op eq '!' || $op eq '~' ||
74048ed81   Andy Whitcroft   checkpatch: varia...
2547
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
2548
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
2549
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2550
2551
2552
  						ERROR("SPACING",
  						      "space required before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2553
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
2554
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2555
2556
2557
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2558
2559
2560
  						ERROR("SPACING",
  						      "space prohibited after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2561
2562
2563
2564
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
2565
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2566
2567
2568
  						ERROR("SPACING",
  						      "space required one side of that '$op' $at
  " . $hereptr);
773647a09   Andy Whitcroft   update checkpatch...
2569
2570
2571
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2572
2573
2574
  						ERROR("SPACING",
  						      "space prohibited before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2575
  					}
773647a09   Andy Whitcroft   update checkpatch...
2576
  					if ($ctx =~ /ExW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2577
2578
2579
  						ERROR("SPACING",
  						      "space prohibited after that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
2580
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2581

773647a09   Andy Whitcroft   update checkpatch...
2582

0a920b5b6   Andy Whitcroft   add a trivial pat...
2583
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2584
2585
2586
  				} elsif ($op eq '<<' or $op eq '>>' or
  					 $op eq '&' or $op eq '^' or $op eq '|' or
  					 $op eq '+' or $op eq '-' or
c2fdda0df   Andy Whitcroft   update checkpatch...
2587
2588
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
2589
  				{
773647a09   Andy Whitcroft   update checkpatch...
2590
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2591
2592
2593
  						ERROR("SPACING",
  						      "need consistent spacing around '$op' $at
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
2594
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2595
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
2596
2597
2598
2599
  				# A colon needs no spaces before when it is
  				# terminating a case value or a label.
  				} elsif ($opv eq ':C' || $opv eq ':L') {
  					if ($ctx =~ /Wx./) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2600
2601
2602
  						ERROR("SPACING",
  						      "space prohibited before that '$op' $at
  " . $hereptr);
1f65f947a   Andy Whitcroft   checkpatch: add c...
2603
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2604
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
2605
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
2606
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
2607
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
  
  					# Ignore ?:
  					if (($opv eq ':O' && $ca =~ /\?$/) ||
  					    ($op eq '?' && $cc =~ /^:/)) {
  					    	$ok = 1;
  					}
  
  					if ($ok == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2623
2624
2625
  						ERROR("SPACING",
  						      "spaces required around that '$op' $at
  " . $hereptr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2626
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2627
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
2628
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2629
2630
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2631
2632
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2633
2634
2635
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
2636
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
  ## # check for multiple declarations, allowing for a function declaration
  ## # continuation.
  ## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
  ## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
  ##
  ## 			# Remove any bracketed sections to ensure we do not
  ## 			# falsly report the parameters of functions.
  ## 			my $ln = $line;
  ## 			while ($ln =~ s/\([^\(\)]*\)//g) {
  ## 			}
  ## 			if ($ln =~ /,/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2648
2649
2650
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2651
2652
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2653

0a920b5b6   Andy Whitcroft   add a trivial pat...
2654
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
2655
2656
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2657
2658
2659
  			ERROR("SPACING",
  			      "space required before the open brace '{'
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2660
2661
2662
2663
2664
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2665
2666
2667
  			ERROR("SPACING",
  			      "space required after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2668
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2669
2670
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2671
2672
2673
  			ERROR("SPACING",
  			      "space prohibited after that open square bracket '['
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2674
2675
  		}
  		if ($line =~ /\s\]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2676
2677
2678
  			ERROR("SPACING",
  			      "space prohibited before that close square bracket ']'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2679
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2680
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2681
2682
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2683
2684
2685
  			ERROR("SPACING",
  			      "space prohibited after that open parenthesis '('
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2686
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2687
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
2688
2689
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2690
2691
2692
  			ERROR("SPACING",
  			      "space prohibited before that close parenthesis ')'
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
2693
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2694
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
2695
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
2696
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2697
2698
2699
  			WARN("INDENTED_LABEL",
  			     "labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2700
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2701
2702
2703
2704
  # Return is not a function.
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
  			my $spacing = $1;
  			my $value = $2;
86f9d059c   Andy Whitcroft   checkpatch: allow...
2705
  			# Flatten any parentheses
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2706
2707
  			$value =~ s/\(/ \(/g;
  			$value =~ s/\)/\) /g;
e01886ada   Andy Whitcroft   checkpatch: fix '...
2708
  			while ($value =~ s/\[[^\[\]]*\]/1/ ||
63f17f897   Andy Whitcroft   checkpatch: allow...
2709
2710
2711
2712
  			       $value !~ /(?:$Ident|-?$Constant)\s*
  					     $Compare\s*
  					     (?:$Ident|-?$Constant)/x &&
  			       $value =~ s/\([^\(\)]*\)/1/) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2713
  			}
fb2d2c1b5   Andy Whitcroft   checkpatch: ensur...
2714
2715
2716
  #print "value<$value>
  ";
  			if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2717
2718
2719
  				ERROR("RETURN_PARENTHESES",
  				      "return is not a function, parentheses are not required
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
2720
2721
  
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2722
2723
2724
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
2725
2726
  			}
  		}
53a3c4487   Andy Whitcroft   checkpatch: retur...
2727
2728
2729
2730
  # Return of what appears to be an errno should normally be -'ve
  		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2731
2732
2733
  				WARN("USE_NEGATIVE_ERRNO",
  				     "return of an errno should typically be -ve (return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
2734
2735
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
2736

0a920b5b6   Andy Whitcroft   add a trivial pat...
2737
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
2738
  		if ($line=~/\b(if|while|for|switch)\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2739
2740
  			ERROR("SPACING", "space required before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2741
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2742
2743
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
2744
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2745
2746
2747
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
  			my ($stat_next) = ctx_statement_block($line_nr_next,
  						$remain_next, $off_next);
  			$stat_next =~ s/
  ./
   /g;
  			##print "stat<$stat> stat_next<$stat_next>
  ";
  
  			if ($stat_next =~ /^\s*while\b/) {
  				# If the statement carries leading newlines,
  				# then count those as offsets.
  				my ($whitespace) =
  					($stat_next =~ /^((?:\s*
  [+-])*\s*)/s);
  				my $offset =
  					statement_rawlines($whitespace) - 1;
  
  				$suppress_whiletrailers{$line_nr_next +
  								$offset} = 1;
  			}
  		}
  		if (!defined $suppress_whiletrailers{$linenr} &&
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
2771
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
2772

b53c8e104   Andy Whitcroft   checkpatch: ensur...
2773
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2774
2775
2776
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2777
2778
2779
2780
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2781
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
2782
2783
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
2784
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
2785
2786
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
2787
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2788
2789
2790
2791
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2792
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2793

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
2794
2795
2796
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
2797
2798
2799
2800
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
2801
2802
2803
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
2804
2805
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
  # Check for bitwise tests written as boolean
  		if ($line =~ /
  			(?:
  				(?:\[|\(|\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\|)
  			|
  				(?:\&\&|\|\|)
  				\s*0[xX][0-9]+\s*
  				(?:\&\&|\|\||\)|\])
  			)/x)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
2818
2819
2820
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
2821
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2822
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
2823
2824
2825
2826
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
  			my $s = $1;
  			$s =~ s/$;//g; 	# Remove any comments
  			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2827
2828
2829
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
2830
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2831
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
2832
2833
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2834
2835
2836
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
2837
2838
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
2839
2840
2841
  # case and default should not have general statements after them
  		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
  		    $line !~ /\G(?:
3fef12d6c   Andy Whitcroft   checkpatch: allow...
2842
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
2843
2844
2845
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
2846
2847
2848
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
2849
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2850
2851
2852
2853
2854
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
  						$previndent == $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2855
2856
2857
  			ERROR("ELSE_AFTER_BRACE",
  			      "else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2858
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2859
2860
2861
2862
2863
2864
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
  						$previndent == $indent) {
  			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
2865
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
2866
2867
2868
2869
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2870
2871
2872
  				ERROR("WHILE_AFTER_BRACE",
  				      "while should follow close brace '}'
  " . $hereprev);
c2fdda0df   Andy Whitcroft   update checkpatch...
2873
2874
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2875
2876
2877
2878
2879
2880
2881
2882
2883
  #studly caps, commented out until figure out how to distinguish between use of existing and adding new
  #		if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
  #		    print "No studly caps, use _
  ";
  #		    print "$herecurr";
  #		    $clean = 0;
  #		}
  
  #no spaces allowed after \ in define
c45dcabd2   Andy Whitcroft   update checkpatch...
2884
  		if ($line=~/\#\s*define.*\\\s$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2885
2886
2887
  			WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
  			     "Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2888
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2889
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
2890
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
2891
2892
2893
2894
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
2895
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
2896
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
2897
  				if ($realfile =~ m{^arch/}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2898
2899
2900
  					CHK("ARCH_INCLUDE_LINUX",
  					    "Consider using #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
2901
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2902
2903
2904
  					WARN("INCLUDE_LINUX",
  					     "Use #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
2905
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2906
2907
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2908
2909
  # multi-statement macros should be enclosed in a do while loop, grab the
  # first statement and ensure its the whole macro if its not enclosed
cf655043d   Andy Whitcroft   update checkpatch...
2910
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
2911
2912
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
2913
2914
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
2915
2916
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
c45dcabd2   Andy Whitcroft   update checkpatch...
2917
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
2918
2919
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
2920
2921
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
2922
2923
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2924

f74bd1942   Andy Whitcroft   checkpatch: corre...
2925
  			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b3   Andy Whitcroft   checkpatch: compl...
2926
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
2927
2928
2929
2930
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2931

c45dcabd2   Andy Whitcroft   update checkpatch...
2932
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2933
2934
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
c81769fdc   Andy Whitcroft   checkpatch: fix c...
2935
  			       $dstat =~ s/\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
2936
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
2937
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
2938

c45dcabd2   Andy Whitcroft   update checkpatch...
2939
2940
2941
2942
2943
2944
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
  				MODULE_PARAM_DESC|
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
2945
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
2946
2947
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
2948
2949
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
2950
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
2951
2952
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f74bd1942   Andy Whitcroft   checkpatch: corre...
2953
2954
2955
2956
2957
2958
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
  			    $dstat !~ /^(?:$Ident|-?$Constant)$/ &&			# 10 // foo()
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
72f115f94   Andy Whitcroft   checkpatch: compl...
2959
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
  			    $dstat !~ /^\({/)						# ({...
  			{
  				$ctx =~ s/
  *$//;
  				my $herectx = $here . "
  ";
  				my $cnt = statement_rawlines($ctx);
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
2974
  				}
f74bd1942   Andy Whitcroft   checkpatch: corre...
2975
2976
2977
2978
2979
  				if ($dstat =~ /;/) {
  					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
  					      "Macros with multiple statements should be enclosed in a do - while loop
  " . "$herectx");
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2980
  					ERROR("COMPLEX_MACRO",
f74bd1942   Andy Whitcroft   checkpatch: corre...
2981
2982
  					      "Macros with complex values should be enclosed in parenthesis
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
2983
  				}
653d4876b   Andy Whitcroft   update checkpatch...
2984
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2985
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
2986
2987
2988
2989
2990
2991
  # make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
  # all assignments may have only one of the following with an assignment:
  #	.
  #	ALIGN(...)
  #	VMLINUX_SYMBOL(...)
  		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2992
2993
2994
  			WARN("MISSING_VMLINUX_SYMBOL",
  			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols
  " . $herecurr);
080ba9296   Mike Frysinger   checkpatch: try t...
2995
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
2996
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
2997
2998
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
2999
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
3000
3001
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3002
3003
3004
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
13214adf7   Andy Whitcroft   update checkpatch...
3005
3006
  				my $allowed = 0;
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
3007
3008
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3009
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
3010
3011
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
  					# If the condition carries leading newlines, then count those as offsets.
  					my ($whitespace) = ($cond =~ /^((?:\s*
  [+-])*\s*)/s);
  					my $offset = statement_rawlines($whitespace) - 1;
  
  					#print "COND<$cond> whitespace<$whitespace> offset<$offset>
  ";
  
  					# We have looked at and allowed this specific line.
  					$suppress_ifbraces{$ln + $offset} = 1;
  
  					$herectx .= "$rawlines[$ln + $offset]
  [...]
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3026
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
3027
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
3028
3029
  
  					$seen++ if ($block =~ /^\s*{/);
cf655043d   Andy Whitcroft   update checkpatch...
3030
3031
3032
3033
3034
  					#print "cond<$cond> block<$block> allowed<$allowed>
  ";
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
3035
3036
3037
  						$allowed = 1;
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
3038
3039
  						#print "APW: ALLOWED: block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
3040
3041
  						$allowed = 1;
  					}
cf655043d   Andy Whitcroft   update checkpatch...
3042
3043
3044
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
3045
3046
3047
3048
  						$allowed = 1;
  					}
  				}
  				if ($seen && !$allowed) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3049
3050
3051
  					WARN("BRACES",
  					     "braces {} are not necessary for any arm of this statement
  " . $herectx);
13214adf7   Andy Whitcroft   update checkpatch...
3052
3053
3054
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
3055
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
3056
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
3057
3058
3059
3060
3061
3062
3063
3064
  			my $allowed = 0;
  
  			# Check the pre-context.
  			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
  				#print "APW: ALLOWED: pre<$1>
  ";
  				$allowed = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
3065
3066
3067
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
3068
3069
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
3070
3071
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
3072
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
3073
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
  			}
  			if (statement_lines($cond) > 1) {
  				#print "APW: ALLOWED: cond<$cond>
  ";
  				$allowed = 1;
  			}
  			if ($block =~/\b(?:if|for|while)\b/) {
  				#print "APW: ALLOWED: block<$block>
  ";
  				$allowed = 1;
  			}
  			if (statement_block_size($block) > 1) {
  				#print "APW: ALLOWED: lines block<$block>
  ";
  				$allowed = 1;
  			}
  			# Check the post-context.
  			if (defined $chunks[1]) {
  				my ($cond, $block) = @{$chunks[1]};
  				if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
3094
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
3095
3096
3097
3098
3099
3100
3101
3102
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
699324871   Justin P. Mattock   treewide: remove ...
3103
3104
  				my $herectx = $here . "
  ";
f055663c5   Andy Whitcroft   checkpatch: repor...
3105
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
3106

f055663c5   Andy Whitcroft   checkpatch: repor...
3107
  				for (my $n = 0; $n < $cnt; $n++) {
699324871   Justin P. Mattock   treewide: remove ...
3108
3109
  					$herectx .= raw_line($linenr, $n) . "
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
3110
  				}
cf655043d   Andy Whitcroft   update checkpatch...
3111

000d1cc18   Joe Perches   checkpatch.pl: ad...
3112
3113
3114
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
3115
3116
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3117
  # don't include deprecated include files (uses RAW line)
4a0df2ef4   Andy Whitcroft   update checkpatch...
3118
  		for my $inc (@dep_includes) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3119
  			if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3120
3121
3122
  				ERROR("DEPRECATED_INCLUDE",
  				      "Don't use <$inc>: see Documentation/feature-removal-schedule.txt
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3123
3124
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3125
3126
  # don't use deprecated functions
  		for my $func (@dep_functions) {
00df344fd   Andy Whitcroft   update checkpatch...
3127
  			if ($line =~ /\b$func\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3128
3129
3130
  				ERROR("DEPRECATED_FUNCTION",
  				      "Don't use $func(): see Documentation/feature-removal-schedule.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3131
3132
3133
3134
  			}
  		}
  
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
3135
3136
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3137
3138
3139
  			WARN("VOLATILE",
  			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3140
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3141
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
3142
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3143
3144
3145
  			CHK("REDUNDANT_CODE",
  			    "if this code is redundant consider removing it
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
3146
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3147
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3148
3149
3150
3151
  # check for needless kfree() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3152
3153
3154
  				WARN("NEEDLESS_KFREE",
  				     "kfree(NULL) is safe this check is probably not required
  " . $hereprev);
f0a594c1c   Andy Whitcroft   update checkpatch...
3155
3156
  			}
  		}
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
3157
3158
3159
3160
  # check for needless usb_free_urb() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3161
3162
3163
  				WARN("NEEDLESS_USB_FREE_URB",
  				     "usb_free_urb(NULL) is safe this check is probably not required
  " . $hereprev);
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
3164
3165
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3166

1a15a2508   Patrick Pannuto   checkpatch: prefe...
3167
3168
3169
3170
  # prefer usleep_range over udelay
  		if ($line =~ /\budelay\s*\(\s*(\w+)\s*\)/) {
  			# ignore udelay's < 10, however
  			if (! (($1 =~ /(\d+)/) && ($1 < 10)) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3171
3172
3173
  				CHK("USLEEP_RANGE",
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt
  " . $line);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
3174
3175
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
3176
3177
3178
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3179
3180
3181
  				WARN("MSLEEP",
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $line);
09ef87255   Patrick Pannuto   checkpatch: warn ...
3182
3183
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3184
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
3185
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
3186
3187
3188
3189
3190
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3191
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
3192
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3193
3194
3195
  			ERROR("SPACING",
  			      "exactly one space required after that #$1
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
3196
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3197
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
3198
3199
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3200
3201
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3202
3203
3204
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3205
3206
3207
3208
3209
  			}
  		}
  # check for memory barriers without a comment.
  		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3210
3211
3212
  				CHK("MEMORY_BARRIER",
  				    "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3213
3214
3215
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
3216
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3217
3218
3219
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3220
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3221

d4977c78e   Tobias Klauser   checkpatch: warn ...
3222
3223
  # Check that the storage class is at the beginning of a declaration
  		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3224
3225
3226
  			WARN("STORAGE_CLASS",
  			     "storage class should be at the beginning of the declaration
  " . $herecurr)
d4977c78e   Tobias Klauser   checkpatch: warn ...
3227
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3228
3229
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3230
3231
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3232
3233
3234
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3235
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
3236
3237
  # Check for __inline__ and __inline, prefer inline
  		if ($line =~ /\b(__inline__|__inline)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3238
3239
3240
  			WARN("INLINE",
  			     "plain inline is preferred over $1
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
3241
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
3242
3243
  # Check for __attribute__ packed, prefer __packed
  		if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3244
3245
3246
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
3247
  		}
39b7e2878   Joe Perches   checkpatch: add a...
3248
3249
  # Check for __attribute__ aligned, prefer __aligned
  		if ($line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3250
3251
3252
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
3253
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
3254
3255
3256
3257
3258
3259
  # Check for __attribute__ format(printf, prefer __printf
  		if ($line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
  			WARN("PREFER_PRINTF",
  			     "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))
  " . $herecurr);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
3260
3261
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3262
3263
3264
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
3265
  		}
428e2fdc4   Joe Perches   checkpatch: add c...
3266
3267
  # check for line continuations in quoted strings with odd counts of "
  		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3268
3269
3270
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
428e2fdc4   Joe Perches   checkpatch: add c...
3271
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
3272
  # Check for misused memsets
d7c76ba7e   Joe Perches   checkpatch: impro...
3273
3274
3275
3276
3277
3278
  		if (defined $stat &&
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
  
  			my $ms_addr = $2;
  			my $ms_val = $8;
  			my $ms_size = $14;
554e165cf   Andy Whitcroft   checkpatch: check...
3279

554e165cf   Andy Whitcroft   checkpatch: check...
3280
3281
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
3282
3283
3284
3285
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
3286
3287
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
  
  # typecasts on min/max could be min_t/max_t
  		if (defined $stat &&
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
  			if (defined $2 || defined $8) {
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
  				my $cast2 = deparenthesize($8);
  				my $arg2 = $9;
  				my $cast;
  
  				if ($cast1 ne "" && $cast2 ne "") {
  					$cast = "$cast1 or $cast2";
  				} elsif ($cast1 ne "") {
  					$cast = $cast1;
  				} else {
  					$cast = $cast2;
  				}
  				WARN("MINMAX",
  				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
3318
3319
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3320
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
3321
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3322
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
3323
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
3324
3325
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
3326
3327
3328
3329
3330
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
3331
3332
3333
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3334
3335
3336
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
3337
3338
3339
3340
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3341
3342
3343
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
3344
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
3345
3346
3347
3348
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3349
3350
3351
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3352
3353
3354
3355
3356
3357
3358
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3359
3360
3361
  				CHK("UNDOCUMENTED_SETUP",
  				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
3362
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3363
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3364
3365
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
3366
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3367
3368
3369
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3370
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3371

caf2a54f1   Joe Perches   scripts/checkpatc...
3372
3373
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3374
3375
3376
  		    WARN("ONE_SEMICOLON",
  			 "Statements terminations use 1 semicolon
  " . $herecurr);
caf2a54f1   Joe Perches   scripts/checkpatc...
3377
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3378
3379
  # check for gcc specific __FUNCTION__
  		if ($line =~ /__FUNCTION__/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3380
3381
3382
  			WARN("USE_FUNC",
  			     "__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
3383
  		}
773647a09   Andy Whitcroft   update checkpatch...
3384

4882720b2   Thomas Gleixner   semaphore: Remove...
3385
3386
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3387
3388
3389
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3390

773647a09   Andy Whitcroft   update checkpatch...
3391
  		}
67d0a0754   Joe Perches   kernel.h/checkpat...
3392
3393
  # recommend kstrto* over simple_strto* and strict_strto*
  		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3394
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
3395
3396
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
3397
  		}
f3db6639f   Michael Ellerman   checkpatch: add a...
3398
3399
  # check for __initcall(), use device_initcall() explicitly please
  		if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3400
3401
3402
  			WARN("USE_DEVICE_INITCALL",
  			     "please use device_initcall() instead of __initcall()
  " . $herecurr);
f3db6639f   Michael Ellerman   checkpatch: add a...
3403
  		}
79404849e   Emese Revfy   checkpatch.pl: ex...
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
  # check for various ops structs, ensure they are const.
  		my $struct_ops = qr{acpi_dock_ops|
  				address_space_operations|
  				backlight_ops|
  				block_device_operations|
  				dentry_operations|
  				dev_pm_ops|
  				dma_map_ops|
  				extent_io_ops|
  				file_lock_operations|
  				file_operations|
  				hv_ops|
  				ide_dma_ops|
  				intel_dvo_dev_ops|
  				item_operations|
  				iwl_ops|
  				kgdb_arch|
  				kgdb_io|
  				kset_uevent_ops|
  				lock_manager_operations|
  				microcode_ops|
  				mtrr_ops|
  				neigh_ops|
  				nlmsvc_binding|
  				pci_raw_ops|
  				pipe_buf_operations|
  				platform_hibernation_ops|
  				platform_suspend_ops|
  				proto_ops|
  				rpc_pipe_ops|
  				seq_operations|
  				snd_ac97_build_ops|
  				soc_pcmcia_socket_ops|
  				stacktrace_ops|
  				sysfs_ops|
  				tty_operations|
  				usb_mon_operations|
  				wd_ops}x;
6903ffb22   Andy Whitcroft   checkpatch: struc...
3442
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
3443
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3444
3445
3446
  			WARN("CONST_STRUCT",
  			     "struct $1 should normally be const
  " .
6903ffb22   Andy Whitcroft   checkpatch: struc...
3447
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
3448
  		}
773647a09   Andy Whitcroft   update checkpatch...
3449
3450
3451
3452
  
  # use of NR_CPUS is usually wrong
  # ignore definitions of NR_CPUS and usage to define arrays as likely right
  		if ($line =~ /\bNR_CPUS\b/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3453
3454
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
3455
3456
3457
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
3458
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
3459
3460
3461
  			WARN("NR_CPUS",
  			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
3462
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
3463
3464
3465
3466
3467
  
  # check for %L{u,d,i} in strings
  		my $string;
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
  			$string = substr($rawline, $-[1], $+[1] - $-[1]);
2a1bc5d5c   Andy Whitcroft   checkpatch: %Lx t...
3468
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
3469
  			if ($string =~ /(?<!%)%L[udi]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3470
3471
3472
  				WARN("PRINTF_L",
  				     "\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
9c9ba34ee   Andy Whitcroft   update checkpatch...
3473
3474
3475
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
3476
3477
3478
3479
  
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3480
3481
3482
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
3483
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3484
3485
3486
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
3487
3488
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3489
3490
3491
3492
3493
3494
3495
  
  # check for lockdep_set_novalidate_class
  		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
  		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
  			if ($realfile !~ m@^kernel/lockdep@ &&
  			    $realfile !~ m@^include/linux/lockdep@ &&
  			    $realfile !~ m@^drivers/base/core@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3496
3497
3498
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
3499
3500
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
3501
3502
3503
  
  		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
  		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3504
3505
3506
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
3507
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3508
3509
3510
3511
3512
3513
  	}
  
  	# If we have no input at all, then there is nothing to report on
  	# so just keep quiet.
  	if ($#rawlines == -1) {
  		exit(0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3514
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
  	# In mailback mode only produce a report in the negative, for
  	# things that appear to be patches.
  	if ($mailback && ($clean == 1 || !$is_patch)) {
  		exit(0);
  	}
  
  	# This is not a patch, and we are are in 'no-patch' mode so
  	# just keep quiet.
  	if (!$chk_patch && !$is_patch) {
  		exit(0);
  	}
  
  	if (!$is_patch) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3528
3529
3530
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3531
3532
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3533
3534
3535
  		ERROR("MISSING_SIGN_OFF",
  		      "Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
3536
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3537
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
3538
3539
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
3540
3541
3542
3543
3544
3545
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
  		print "
  " if ($quiet == 0);
f0a594c1c   Andy Whitcroft   update checkpatch...
3546
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
3547

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3548
3549
3550
3551
3552
3553
3554
3555
3556
  	if ($quiet == 0) {
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
  			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
  ";
  			print "      scripts/cleanfile
  
  ";
b0781216e   Mike Frysinger   scripts/checkpatc...
3557
  			$rpt_cleaners = 0;
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3558
3559
  		}
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
  	if (keys %ignore_type) {
  	    print "NOTE: Ignored message types:";
  	    foreach my $ignore (sort keys %ignore_type) {
  		print " $ignore";
  	    }
  	    print "
  ";
  	    print "
  " if ($quiet == 0);
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3570
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3571
3572
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
3573
3574
  	}
  	if ($clean == 0 && $quiet == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3575
3576
3577
3578
3579
3580
  		print << "EOM";
  $vname has style problems, please review.
  
  If any of these errors are false positives, please report
  them to the maintainer, see CHECKPATCH in MAINTAINERS.
  EOM
0a920b5b6   Andy Whitcroft   add a trivial pat...
3581
  	}
13214adf7   Andy Whitcroft   update checkpatch...
3582

0a920b5b6   Andy Whitcroft   add a trivial pat...
3583
3584
  	return $clean;
  }