Blame view

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

22f2a2ef9   Andy Whitcroft   update checkpatch...
12
  my $V = '0.09';
0a920b5b6   Andy Whitcroft   add a trivial pat...
13
14
15
16
17
18
19
  
  use Getopt::Long qw(:config no_auto_abbrev);
  
  my $quiet = 0;
  my $tree = 1;
  my $chk_signoff = 1;
  my $chk_patch = 1;
653d4876b   Andy Whitcroft   update checkpatch...
20
  my $tst_type = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
21
22
23
24
25
  GetOptions(
  	'q|quiet'	=> \$quiet,
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
653d4876b   Andy Whitcroft   update checkpatch...
26
  	'test-type!'	=> \$tst_type,
0a920b5b6   Andy Whitcroft   add a trivial pat...
27
28
29
30
31
  ) or exit;
  
  my $exit = 0;
  
  if ($#ARGV < 0) {
00df344fd   Andy Whitcroft   update checkpatch...
32
33
  	print "usage: $P [options] patchfile
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  	print "version: $V
  ";
  	print "options: -q           => quiet
  ";
  	print "         --no-tree    => run without a kernel tree
  ";
  	exit(1);
  }
  
  if ($tree && !top_of_kernel_tree()) {
  	print "Must be run from the top-level dir. of a kernel tree
  ";
  	exit(2);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
48
49
  my @dep_includes = ();
  my @dep_functions = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
50
51
52
53
54
  my $removal = 'Documentation/feature-removal-schedule.txt';
  if ($tree && -f $removal) {
  	open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!
  ";
  	while (<REMOVE>) {
f0a594c1c   Andy Whitcroft   update checkpatch...
55
56
57
  		if (/^Check:\s+(.*\S)/) {
  			for my $entry (split(/[, ]+/, $1)) {
  				if ($entry =~ m@include/(.*)@) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
58
  					push(@dep_includes, $1);
4a0df2ef4   Andy Whitcroft   update checkpatch...
59

f0a594c1c   Andy Whitcroft   update checkpatch...
60
61
62
  				} elsif ($entry !~ m@/@) {
  					push(@dep_functions, $entry);
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
63
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
64
65
66
  		}
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
67
  my @rawlines = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
68
69
  while (<>) {
  	chomp;
00df344fd   Andy Whitcroft   update checkpatch...
70
  	push(@rawlines, $_);
0a920b5b6   Andy Whitcroft   add a trivial pat...
71
  	if (eof(ARGV)) {
00df344fd   Andy Whitcroft   update checkpatch...
72
  		if (!process($ARGV, @rawlines)) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
73
74
  			$exit = 1;
  		}
00df344fd   Andy Whitcroft   update checkpatch...
75
  		@rawlines = ();
0a920b5b6   Andy Whitcroft   add a trivial pat...
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  	}
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
  	if ((-f "COPYING") && (-f "CREDITS") && (-f "Kbuild") &&
  	    (-f "MAINTAINERS") && (-f "Makefile") && (-f "README") &&
  	    (-d "Documentation") && (-d "arch") && (-d "include") &&
  	    (-d "drivers") && (-d "fs") && (-d "init") && (-d "ipc") &&
  	    (-d "kernel") && (-d "lib") && (-d "scripts")) {
  		return 1;
  	}
  	return 0;
  }
  
  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;
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
112
113
114
115
116
117
118
119
120
121
122
123
  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));
  }
00df344fd   Andy Whitcroft   update checkpatch...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
  
  	my $quote = '';
  
  	foreach my $c (split(//, $line)) {
  		if ($l ne "\\" && ($c eq "'" || $c eq '"')) {
  			if ($quote eq '') {
  				$quote = $c;
  				$res .= $c;
  				$l = $c;
  				next;
  			} elsif ($quote eq $c) {
  				$quote = '';
  			}
  		}
  		if ($quote && $c ne "\t") {
  			$res .= "X";
  		} else {
  			$res .= $c;
  		}
  
  		$l = $c;
  	}
  
  	return $res;
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
154
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
155
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
156
157
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
158
159
160
161
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
162
  	my $level = 0;
00df344fd   Andy Whitcroft   update checkpatch...
163
164
165
166
167
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
f0a594c1c   Andy Whitcroft   update checkpatch...
168
169
170
171
172
173
174
  		foreach my $c (split(//, $rawlines[$line])) {
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
175

f0a594c1c   Andy Whitcroft   update checkpatch...
176
177
178
179
180
181
182
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
183

f0a594c1c   Andy Whitcroft   update checkpatch...
184
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
185
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
186
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
187
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
188
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
189
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
190
191
192
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
193
194
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
195
196
197
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
198
199
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
200
201
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
202
203
204
205
206
207
  	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...
208
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
209
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
210
211
212
213
214
215
  }
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
00df344fd   Andy Whitcroft   update checkpatch...
216
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
217
218
219
220
221
222
223
  	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...
224
225
226
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  		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...
249
250
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
251
252
253
254
255
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
256
257
258
259
260
261
262
263
  sub cat_vet {
  	my ($vet) = @_;
  
  	$vet =~ s/\t/^I/;
  	$vet =~ s/$/\$/;
  
  	return $vet;
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
264
265
266
267
268
269
270
  my @report = ();
  sub report {
  	push(@report, $_[0]);
  }
  sub report_dump {
  	@report;
  }
de7d4f0e1   Andy Whitcroft   update checkpatch...
271
  sub ERROR {
f0a594c1c   Andy Whitcroft   update checkpatch...
272
273
  	report("ERROR: $_[0]
  ");
de7d4f0e1   Andy Whitcroft   update checkpatch...
274
275
276
  	our $clean = 0;
  }
  sub WARN {
f0a594c1c   Andy Whitcroft   update checkpatch...
277
278
  	report("WARNING: $_[0]
  ");
de7d4f0e1   Andy Whitcroft   update checkpatch...
279
280
281
  	our $clean = 0;
  }
  sub CHK {
f0a594c1c   Andy Whitcroft   update checkpatch...
282
283
  	report("CHECK: $_[0]
  ");
de7d4f0e1   Andy Whitcroft   update checkpatch...
284
285
  	our $clean = 0;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
286
287
288
289
290
291
292
  sub process {
  	my $filename = shift;
  	my @lines = @_;
  
  	my $linenr=0;
  	my $prevline="";
  	my $stashline="";
4a0df2ef4   Andy Whitcroft   update checkpatch...
293
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
294
295
296
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
297
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
298
299
300
301
302
303
304
305
306
307
  	my $signoff = 0;
  	my $is_patch = 0;
  
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
  	my $in_comment = 0;
  	my $first_line = 0;
d8aaf1214   Andy Whitcroft   update checkpatch...
308
309
  	my $Ident	= qr{[A-Za-z\d_]+};
  	my $Storage	= qr{extern|static};
22f2a2ef9   Andy Whitcroft   update checkpatch...
310
  	my $Sparse	= qr{__user|__kernel|__force|__iomem|__must_check|__init_refok};
d8aaf1214   Andy Whitcroft   update checkpatch...
311
312
313
314
315
316
317
318
319
320
321
322
323
  	my $NonptrType	= qr{
  				\b
  				(?:const\s+)?
  				(?:unsigned\s+)?
  				(?:
  					void|
  					char|
  					short|
  					int|
  					long|
  					unsigned|
  					float|
  					double|
22f2a2ef9   Andy Whitcroft   update checkpatch...
324
  					bool|
d8aaf1214   Andy Whitcroft   update checkpatch...
325
326
327
  					long\s+int|
  					long\s+long|
  					long\s+long\s+int|
de7d4f0e1   Andy Whitcroft   update checkpatch...
328
329
  					u8|u16|u32|u64|
  					s8|s16|s32|s64|
d8aaf1214   Andy Whitcroft   update checkpatch...
330
331
  					struct\s+$Ident|
  					union\s+$Ident|
de7d4f0e1   Andy Whitcroft   update checkpatch...
332
  					enum\s+$Ident|
d8aaf1214   Andy Whitcroft   update checkpatch...
333
334
335
336
337
338
339
  					${Ident}_t
  				)
  				(?:\s+$Sparse)*
  				\b
  			  }x;
  	my $Type	= qr{
  				\b$NonptrType\b
22f2a2ef9   Andy Whitcroft   update checkpatch...
340
341
  				(?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)?
  				(?:\s+$Sparse)*
d8aaf1214   Andy Whitcroft   update checkpatch...
342
343
  			  }x;
  	my $Declare	= qr{(?:$Storage\s+)?$Type};
f0a594c1c   Andy Whitcroft   update checkpatch...
344
345
346
347
  	my $Attribute	= qr{const|__read_mostly|__init|__initdata|__meminit};
  
  	my $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  	my $Lval	= qr{$Ident(?:$Member)*};
653d4876b   Andy Whitcroft   update checkpatch...
348

de7d4f0e1   Andy Whitcroft   update checkpatch...
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
  	# Pre-scan the patch looking for any __setup documentation.
  	my @setup_docs = ();
  	my $setup_docs = 0;
  	foreach my $line (@lines) {
  		if ($line=~/^\+\+\+\s+(\S+)/) {
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
  			next;
  		}
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
365
366
  	foreach my $line (@lines) {
  		$linenr++;
653d4876b   Andy Whitcroft   update checkpatch...
367
  		my $rawline = $line;
0a920b5b6   Andy Whitcroft   add a trivial pat...
368
369
370
  #extract the filename as it passes
  		if ($line=~/^\+\+\+\s+(\S+)/) {
  			$realfile=$1;
00df344fd   Andy Whitcroft   update checkpatch...
371
  			$realfile =~ s@^[^/]*/@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
372
373
374
375
376
377
  			$in_comment = 0;
  			next;
  		}
  #extract the line range in the file after the patch is applied
  		if ($line=~/^\@\@ -\d+,\d+ \+(\d+)(,(\d+))? \@\@/) {
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
378
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
379
380
381
382
383
384
385
386
387
  			$in_comment = 0;
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
  			next;
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
388
389
390
391
  # 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.
  		if ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
392
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
393
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
394
395
396
397
398
399
400
401
  
  			# track any sort of multi-line comment.  Obviously if
  			# the added text or context do not include the whole
  			# comment we will not see it. Such is life.
  			#
  			# 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.
4a0df2ef4   Andy Whitcroft   update checkpatch...
402
  			if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
403
404
405
406
407
408
409
410
  				$in_comment = 1;
  			}
  			if ($line =~ m@/\*@) {
  				$in_comment = 1;
  			}
  			if ($line =~ m@\*/@) {
  				$in_comment = 0;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
411
412
  			# Measure the line length and indent.
  			($length, $indent) = line_stats($line);
0a920b5b6   Andy Whitcroft   add a trivial pat...
413
414
415
416
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
d8aaf1214   Andy Whitcroft   update checkpatch...
417
418
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
419
420
421
  		}
  
  #make up the handle for any error we report on this line
389834b68   Randy Dunlap   checkpatch: produ...
422
423
  		$here = "#$linenr: ";
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
424

00df344fd   Andy Whitcroft   update checkpatch...
425
426
427
  		my $hereline = "$here
  $line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
428
429
430
431
432
433
434
  		my $herecurr = "$here
  $line
  ";
  		my $hereprev = "$here
  $prevline
  $line
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
435
436
  
  #check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
437
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
438
439
  			# This is a signoff, if ugly, so do not double report.
  			$signoff++;
0a920b5b6   Andy Whitcroft   add a trivial pat...
440
  			if (!($line =~ /^\s*Signed-off-by:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
441
442
443
  				WARN("Signed-off-by: is the preferred form
  " .
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
444
445
  			}
  			if ($line =~ /^\s*signed-off-by:\S/i) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
446
447
448
  				WARN("need space after Signed-off-by:
  " .
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
449
450
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
451
452
  # Check for wrappage within a valid hunk of the file
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
  			ERROR("patch seems to be corrupt (line wrapped?)
  " .
  				$herecurr);
  		}
  
  # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
  		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
  		     !($line =~ m/^(
  				[\x09\x0A\x0D\x20-\x7E]              # ASCII
  				| [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
  				|  \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 )) {
  			ERROR("Invalid UTF-8
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
472
473
474
475
  		}
  
  #ignore lines being removed
  		if ($line=~/^-/) {next;}
0a920b5b6   Andy Whitcroft   add a trivial pat...
476

00df344fd   Andy Whitcroft   update checkpatch...
477
478
  # 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...
479
480
  
  #trailing whitespace
d8aaf1214   Andy Whitcroft   update checkpatch...
481
  		if ($line =~ /^\+.*\S\s+$/ || $line =~ /^\+\s+$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
482
483
484
485
486
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
  			ERROR("trailing whitespace
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
487
488
  		}
  #80 column limit
00df344fd   Andy Whitcroft   update checkpatch...
489
  		if ($line =~ /^\+/ && !($prevline=~/\/\*\*/) && $length > 80) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
490
491
  			WARN("line over 80 characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
492
493
494
495
496
497
498
499
  		}
  
  # check we are in a valid source file *.[hc] if not then ignore this hunk
  		next if ($realfile !~ /\.[hc]$/);
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
  		if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s*        \s*/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
500
501
502
503
504
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
  			ERROR("use tabs not spaces
  " . $herevet);
0a920b5b6   Andy Whitcroft   add a trivial pat...
505
  		}
653d4876b   Andy Whitcroft   update checkpatch...
506
  # Remove comments from the line before processing.
22f2a2ef9   Andy Whitcroft   update checkpatch...
507
508
509
510
511
512
513
514
  		my $comment_edge = ($line =~ s@/\*.*\*/@@g) +
  				   ($line =~ s@/\*.*@@) +
  				   ($line =~ s@^(.).*\*/@$1@);
  
  # The rest of our checks refer specifically to C style
  # only apply those _outside_ comments.  Only skip
  # lines in the middle of comments.
  		next if (!$comment_edge && $in_comment);
00df344fd   Andy Whitcroft   update checkpatch...
515

653d4876b   Andy Whitcroft   update checkpatch...
516
517
518
519
520
521
  # Standardise the strings and chars within the input to simplify matching.
  		$line = sanitise_line($line);
  
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
522

653d4876b   Andy Whitcroft   update checkpatch...
523
524
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
  		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 '') {
de7d4f0e1   Andy Whitcroft   update checkpatch...
543
544
545
546
547
548
549
550
551
552
  				ERROR("switch and case should be at the same indent
  $hereline
  $err
  ");
  			}
  		}
  
  # 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
  		if ($line =~ /\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) {
f0a594c1c   Andy Whitcroft   update checkpatch...
553
  			my @ctx = ctx_statement($linenr, $realcnt, 0);
de7d4f0e1   Andy Whitcroft   update checkpatch...
554
555
556
557
558
559
560
561
562
563
564
565
566
567
  			my $ctx_ln = $linenr + $#ctx + 1;
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
  
  			while ($ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^-/) {
  				$ctx_ln++;
  				$ctx_cnt--;
  			}
  			##warn "line<$line>
  ctx<$ctx>
  next<$lines[$ctx_ln - 1]>";
  
  			if ($ctx !~ /{\s*/ && $ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
f0a594c1c   Andy Whitcroft   update checkpatch...
568
569
  				ERROR("That open brace { should be on the previous line
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
570
571
572
  					"$here
  $ctx
  $lines[$ctx_ln - 1]");
00df344fd   Andy Whitcroft   update checkpatch...
573
574
575
576
577
  			}
  		}
  
  #ignore lines not being added
  		if ($line=~/^[^\+]/) {next;}
653d4876b   Andy Whitcroft   update checkpatch...
578
579
  # TEST: allow direct testing of the type matcher.
  		if ($tst_type && $line =~ /^.$Declare$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
580
581
  			ERROR("TEST: is type $Declare
  " . $herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
582
583
  			next;
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
584
585
586
587
588
589
  # check for initialisation to aggregates open brace on the next line
  		if ($prevline =~ /$Declare\s*$Ident\s*=\s*$/ &&
  		    $line =~ /^.\s*{/) {
  			ERROR("That open brace { should be on the previous line
  " . $hereprev);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
590
591
592
593
594
595
596
597
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
  		if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) {
  			my $path = $1;
  			if ($path =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
598
599
600
  				ERROR("malformed #include filename
  " .
  					$herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
601
602
603
604
605
  			}
  			# Sanitise this special form of string.
  			$path = 'X' x length($path);
  			$line =~ s{\<.*\>}{<$path>};
  		}
00df344fd   Andy Whitcroft   update checkpatch...
606

0a920b5b6   Andy Whitcroft   add a trivial pat...
607
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
608
  		if ($line =~ m{//}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
609
610
  			ERROR("do not use C99 // comments
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
611
  		}
00df344fd   Andy Whitcroft   update checkpatch...
612
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
613
614
615
  		$line =~ s@//.*@@;
  
  #EXPORT_SYMBOL should immediately follow its function closing }.
653d4876b   Andy Whitcroft   update checkpatch...
616
617
618
  		if (($line =~ /EXPORT_SYMBOL.*\((.*)\)/) ||
  		    ($line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
  			my $name = $1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
619
620
  			if (($prevline !~ /^}/) &&
  			   ($prevline !~ /^\+}/) &&
653d4876b   Andy Whitcroft   update checkpatch...
621
  			   ($prevline !~ /^ }/) &&
22f2a2ef9   Andy Whitcroft   update checkpatch...
622
  			   ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=)/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
623
624
  				WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
625
626
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
627
628
629
630
631
632
  # check for external initialisers.
  		if ($line =~ /^.$Type\s*$Ident\s*=\s*(0|NULL);/) {
  			ERROR("do not initialise externals to 0 or NULL
  " .
  				$herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
633
  # check for static initialisers.
f0a594c1c   Andy Whitcroft   update checkpatch...
634
  		if ($line =~ /\s*static\s.*=\s*(0|NULL);/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
635
636
637
  			ERROR("do not initialise statics to 0 or NULL
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
638
  		}
653d4876b   Andy Whitcroft   update checkpatch...
639
640
641
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
de7d4f0e1   Andy Whitcroft   update checkpatch...
642
  		    $line !~ /\btypedef\s+$Type\s+\(\s*\*$Ident\s*\)\s*\(/ &&
653d4876b   Andy Whitcroft   update checkpatch...
643
  		    $line !~ /\b__bitwise(?:__|)\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
644
645
  			WARN("do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
646
647
648
  		}
  
  # * goes on variable not on type
d8aaf1214   Andy Whitcroft   update checkpatch...
649
  		if ($line =~ m{\($NonptrType(\*+)(?:\s+const)?\)}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
650
651
652
  			ERROR("\"(foo$1)\" should be \"(foo $1)\"
  " .
  				$herecurr);
d8aaf1214   Andy Whitcroft   update checkpatch...
653
654
  
  		} elsif ($line =~ m{\($NonptrType\s+(\*+)(?!\s+const)\s+\)}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
655
656
657
  			ERROR("\"(foo $1 )\" should be \"(foo $1)\"
  " .
  				$herecurr);
d8aaf1214   Andy Whitcroft   update checkpatch...
658

f0a594c1c   Andy Whitcroft   update checkpatch...
659
  		} elsif ($line =~ m{$NonptrType(\*+)(?:\s+$Attribute)?\s+[A-Za-z\d_]+}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
660
661
662
  			ERROR("\"foo$1 bar\" should be \"foo $1bar\"
  " .
  				$herecurr);
d8aaf1214   Andy Whitcroft   update checkpatch...
663

f0a594c1c   Andy Whitcroft   update checkpatch...
664
  		} elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+$Attribute)\s+[A-Za-z\d_]+}) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
665
666
667
  			ERROR("\"foo $1 bar\" should be \"foo $1bar\"
  " .
  				$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
668
669
670
671
672
673
674
675
676
  		}
  
  # # 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;
  # 		}
00df344fd   Andy Whitcroft   update checkpatch...
677
678
679
680
681
  # 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
  # printk includes all preceeding printk's which have no newline on the end.
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
682
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
  				# we have a preceeding printk if it ends
  				# 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) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
699
700
  				WARN("printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
701
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
702
  		}
653d4876b   Andy Whitcroft   update checkpatch...
703
704
  # function brace can't be on same line, except for #defines of do while,
  # or if closed on same line
d8aaf1214   Andy Whitcroft   update checkpatch...
705
  		if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).* {/) and
0a920b5b6   Andy Whitcroft   add a trivial pat...
706
  		    !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
707
708
  			ERROR("open brace '{' following function declarations go on the next line
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
709
  		}
653d4876b   Andy Whitcroft   update checkpatch...
710

f0a594c1c   Andy Whitcroft   update checkpatch...
711
712
  # check for spaces between functions and their parentheses.
  		if ($line =~ /($Ident)\s+\(/ &&
22f2a2ef9   Andy Whitcroft   update checkpatch...
713
  		    $1 !~ /^(?:if|for|while|switch|return|volatile|__volatile__|__attribute__|format|__extension__|Copyright)$/ &&
f0a594c1c   Andy Whitcroft   update checkpatch...
714
  		    $line !~ /$Type\s+\(/ && $line !~ /^.\#\s*define\b/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
715
716
  			WARN("no space between function name and open parenthesis '('
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
717
  		}
653d4876b   Andy Whitcroft   update checkpatch...
718
  # Check operator spacing.
4a0df2ef4   Andy Whitcroft   update checkpatch...
719
720
721
  		# Note we expand the line with the leading + as the real
  		# line will be displayed with the leading + and the tabs
  		# will therefore also expand that way.
0a920b5b6   Andy Whitcroft   add a trivial pat...
722
  		my $opline = $line;
4a0df2ef4   Andy Whitcroft   update checkpatch...
723
  		$opline = expand_tabs($opline);
00df344fd   Andy Whitcroft   update checkpatch...
724
  		$opline =~ s/^./ /;
0a920b5b6   Andy Whitcroft   add a trivial pat...
725
  		if (!($line=~/\#\s*include/)) {
f0a594c1c   Andy Whitcroft   update checkpatch...
726
  			my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|=>|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline);
00df344fd   Andy Whitcroft   update checkpatch...
727
  			my $off = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
728
  			for (my $n = 0; $n < $#elements; $n += 2) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
729
730
731
732
733
734
735
736
  				$off += length($elements[$n]);
  
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
  				$a = 'E' if ($elements[$n] eq '' && $n == 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
737
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
738
739
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
740
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
741
742
743
744
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
22f2a2ef9   Andy Whitcroft   update checkpatch...
745
  					$c = 'E' if ($elements[$n + 2] =~ /\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
746
747
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
748
  				}
00df344fd   Andy Whitcroft   update checkpatch...
749
  				# Pick up the preceeding and succeeding characters.
de7d4f0e1   Andy Whitcroft   update checkpatch...
750
  				my $ca = substr($opline, 0, $off);
00df344fd   Andy Whitcroft   update checkpatch...
751
  				my $cc = '';
653d4876b   Andy Whitcroft   update checkpatch...
752
  				if (length($opline) >= ($off + length($elements[$n + 1]))) {
d8aaf1214   Andy Whitcroft   update checkpatch...
753
  					$cc = substr($opline, $off + length($elements[$n + 1]));
00df344fd   Andy Whitcroft   update checkpatch...
754
  				}
de7d4f0e1   Andy Whitcroft   update checkpatch...
755
  				my $cb = "$ca$;$cc";
00df344fd   Andy Whitcroft   update checkpatch...
756

4a0df2ef4   Andy Whitcroft   update checkpatch...
757
758
759
760
761
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
  
  				my $ptr = (" " x $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
762
763
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
764
765
766
  
  				##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
767

d8aaf1214   Andy Whitcroft   update checkpatch...
768
769
  				# ; should have either the end of line or a space or \ after it
  				if ($op eq ';') {
de7d4f0e1   Andy Whitcroft   update checkpatch...
770
771
772
773
  					if ($ctx !~ /.x[WEB]/ && $cc !~ /^\\/ &&
  					    $cc !~ /^;/) {
  						ERROR("need space after that '$op' $at
  " . $hereptr);
d8aaf1214   Andy Whitcroft   update checkpatch...
774
775
776
777
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
778
779
780
  
  				# -> should have no spaces
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
781
  					if ($ctx =~ /Wx.|.xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
782
783
  						ERROR("no spaces around that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
784
785
786
787
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
d8aaf1214   Andy Whitcroft   update checkpatch...
788
  					if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
789
790
  						ERROR("need space after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
791
792
793
794
  					}
  
  				# unary ! and unary ~ are allowed no space on the right
  				} elsif ($op eq '!' or $op eq '~') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
795
  					if ($ctx !~ /[WOEB]x./) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
796
797
  						ERROR("need space before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
798
  					}
4a0df2ef4   Andy Whitcroft   update checkpatch...
799
  					if ($ctx =~ /.xW/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
800
801
  						ERROR("no space after that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
802
803
804
805
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
d8aaf1214   Andy Whitcroft   update checkpatch...
806
  					if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
807
808
  						ERROR("need space one side of that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
809
  					}
d8aaf1214   Andy Whitcroft   update checkpatch...
810
  					if ($ctx =~ /Wx./ && $cc =~ /^;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
811
812
  						ERROR("no space before that '$op' $at
  " . $hereptr);
653d4876b   Andy Whitcroft   update checkpatch...
813
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
814
815
816
817
818
819
820
821
822
823
824
825
826
  
  				# & is both unary and binary
  				# unary:
  				# 	a &b
  				# binary (consistent spacing):
  				#	a&b		OK
  				#	a & b		OK
  				#
  				# boiling down to: if there is a space on the right then there
  				# should be one on the left.
  				#
  				# - is the same
  				#
4a0df2ef4   Andy Whitcroft   update checkpatch...
827
  				} elsif ($op eq '&' or $op eq '-') {
00df344fd   Andy Whitcroft   update checkpatch...
828
  					if ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
829
830
  						ERROR("need space before that '$op' $at
  " . $hereptr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
831
  					}
00df344fd   Andy Whitcroft   update checkpatch...
832
833
834
835
836
  				# * is the same as & only adding:
  				# type:
  				# 	(foo *)
  				#	(foo **)
  				#
4a0df2ef4   Andy Whitcroft   update checkpatch...
837
  				} elsif ($op eq '*') {
de7d4f0e1   Andy Whitcroft   update checkpatch...
838
839
840
841
  					if ($ca !~ /$Type$/ && $cb !~ /(\*$;|$;\*)/ &&
  					    $ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
  						ERROR("need space before that '$op' $at
  " . $hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
842
843
844
845
846
847
  					}
  
  				# << and >> may either have or not have spaces both sides
  				} elsif ($op eq '<<' or $op eq '>>' or $op eq '+' or $op eq '/' or
  					 $op eq '^' or $op eq '|')
  				{
4a0df2ef4   Andy Whitcroft   update checkpatch...
848
  					if ($ctx !~ /VxV|WxW|VxE|WxE/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
849
850
851
  						ERROR("need consistent spacing around '$op' $at
  " .
  							$hereptr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
852
853
854
  					}
  
  				# All the others need spaces both sides.
4a0df2ef4   Andy Whitcroft   update checkpatch...
855
  				} elsif ($ctx !~ /[EW]x[WE]/) {
22f2a2ef9   Andy Whitcroft   update checkpatch...
856
857
858
859
860
861
  					# Ignore email addresses <foo@bar>
  					if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) &&
  					    !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) {
  						ERROR("need spaces around that '$op' $at
  " . $hereptr);
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
862
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
863
  				$off += length($elements[$n + 1]);
0a920b5b6   Andy Whitcroft   add a trivial pat...
864
865
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
866
867
868
869
870
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
  			WARN("multiple assignments should be avoided
  " . $herecurr);
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
  ## # 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 =~ /,/) {
  ## 				WARN("declaring multiple variables together should be avoided
  " . $herecurr);
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
886

0a920b5b6   Andy Whitcroft   add a trivial pat...
887
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
888
889
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
890
891
892
893
894
895
896
897
898
  			ERROR("need a space before the open brace '{'
  " . $herecurr);
  		}
  
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
  			ERROR("need a space after that close brace '}'
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
899
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
  			ERROR("no space after that open square bracket '['
  " . $herecurr);
  		}
  		if ($line =~ /\s\]/) {
  			ERROR("no space before that close square bracket ']'
  " . $herecurr);
  		}
  
  # check spacing on paretheses
  		if ($line =~ /\(\s/ && $line !~ /\(\s*$/) {
  			ERROR("no space after that open parenthesis '('
  " . $herecurr);
  		}
  		if ($line =~ /\s\)/) {
  			ERROR("no space before that close parenthesis ')'
  " . $herecurr);
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
919
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
920
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
921
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
922
923
  			WARN("labels should not be indented
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
924
925
926
  		}
  
  # Need a space before open parenthesis after if, while etc
4a0df2ef4   Andy Whitcroft   update checkpatch...
927
  		if ($line=~/\b(if|while|for|switch)\(/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
928
929
  			ERROR("need a space before the open parenthesis '('
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
930
931
932
  		}
  
  # Check for illegal assignment in if conditional.
653d4876b   Andy Whitcroft   update checkpatch...
933
  		if ($line=~/\bif\s*\(.*[^<>!=]=[^=].*\)/) {
00df344fd   Andy Whitcroft   update checkpatch...
934
  			#next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/);
de7d4f0e1   Andy Whitcroft   update checkpatch...
935
936
  			ERROR("do not use assignment in if condition
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
937
938
939
940
941
942
  		}
  
  		# 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) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
943
944
  			ERROR("else should follow close brace '}'
  " . $hereprev);
0a920b5b6   Andy Whitcroft   add a trivial pat...
945
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
946
947
948
949
950
951
952
953
954
955
  #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
  		if ($line=~/\#define.*\\\s$/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
956
957
  			WARN("Whitepspace after \\ makes next lines useless
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
958
  		}
653d4876b   Andy Whitcroft   update checkpatch...
959
960
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
  		if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
961
962
  			my $checkfile = "include/linux/$1.h";
  			if (-f $checkfile) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
963
964
965
  				CHK("Use #include <linux/$1.h> instead of <asm/$1.h>
  " .
  					$herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
966
967
  			}
  		}
d8aaf1214   Andy Whitcroft   update checkpatch...
968
969
  # if and else should not have general statements after it
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ &&
de7d4f0e1   Andy Whitcroft   update checkpatch...
970
971
972
  		    $1 !~ /^\s*(?:\sif|{|\\|$)/) {
  			ERROR("trailing statements should be on next line
  " . $herecurr);
d8aaf1214   Andy Whitcroft   update checkpatch...
973
  		}
653d4876b   Andy Whitcroft   update checkpatch...
974
975
976
977
978
979
980
981
982
983
  # 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
  # in a known goot container
  		if (($prevline=~/\#define.*\\/) and
  		   !($prevline=~/do\s+{/) and !($prevline=~/\(\{/) and
  		   !($line=~/do.*{/) and !($line=~/\(\{/) and
  		   !($line=~/^.\s*$Declare\s/)) {
  			# Grab the first statement, if that is the entire macro
  			# its ok.  This may start either on the #define line
  			# or the one below.
d8aaf1214   Andy Whitcroft   update checkpatch...
984
985
  			my $ln = $linenr;
  			my $cnt = $realcnt;
f0a594c1c   Andy Whitcroft   update checkpatch...
986
  			my $off = 0;
653d4876b   Andy Whitcroft   update checkpatch...
987

f0a594c1c   Andy Whitcroft   update checkpatch...
988
989
990
991
992
  			# If the macro starts on the define line start
  			# grabbing the statement after the identifier
  			$prevline =~ m{^(.#\s*define\s*$Ident(?:\([^\)]*\))?\s*)(.*)\\\s*$};
  			##print "1<$1> 2<$2>
  ";
22f2a2ef9   Andy Whitcroft   update checkpatch...
993
  			if (defined $2 && $2 ne '') {
f0a594c1c   Andy Whitcroft   update checkpatch...
994
  				$off = length($1);
d8aaf1214   Andy Whitcroft   update checkpatch...
995
996
997
  				$ln--;
  				$cnt++;
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
998
  			my @ctx = ctx_statement($ln, $cnt, $off);
de7d4f0e1   Andy Whitcroft   update checkpatch...
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
  			my $ctx_ln = $ln + $#ctx + 1;
  			my $ctx = join("
  ", @ctx);
  
  			# Pull in any empty extension lines.
  			while ($ctx =~ /\\$/ &&
  			       $lines[$ctx_ln - 1] =~ /^.\s*(?:\\)?$/) {
  				$ctx .= $lines[$ctx_ln - 1];
  				$ctx_ln++;
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
1009
1010
1011
  
  			if ($ctx =~ /\\$/) {
  				if ($ctx =~ /;/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1012
1013
1014
1015
  					ERROR("Macros with multiple statements should be enclosed in a do - while loop
  " . "$here
  $ctx
  ");
d8aaf1214   Andy Whitcroft   update checkpatch...
1016
  				} else {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1017
1018
1019
1020
  					ERROR("Macros with complex values should be enclosed in parenthesis
  " . "$here
  $ctx
  ");
d8aaf1214   Andy Whitcroft   update checkpatch...
1021
  				}
653d4876b   Andy Whitcroft   update checkpatch...
1022
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1023
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
  # check for redundant bracing round if etc
  		if ($line =~ /\b(if|while|for|else)\b/) {
  			# Locate the end of the opening statement.
  			my @control = ctx_statement($linenr, $realcnt, 0);
  			my $nr = $linenr + (scalar(@control) - 1);
  			my $cnt = $realcnt - (scalar(@control) - 1);
  
  			my $off = $realcnt - $cnt;
  			#print "$off: line<$line>end<" . $lines[$nr - 1] . ">
  ";
  
  			# If this is is a braced statement group check it
  			if ($lines[$nr - 1] =~ /{\s*$/) {
  				my ($lvl, @block) = ctx_block_level($nr, $cnt);
  
  				my $stmt = join(' ', @block);
22f2a2ef9   Andy Whitcroft   update checkpatch...
1040
1041
1042
1043
  				$stmt =~ s/(^[^{]*){//;
  				my $before = $1;
  				$stmt =~ s/}([^}]*$)//;
  				my $after = $1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
  
  				#print "block<" . join(' ', @block) . "><" . scalar(@block) . ">
  ";
  				#print "stmt<$stmt>
  
  ";
  
  				# Count the ;'s if there is fewer than two
  				# then there can only be one statement,
  				# if there is a brace inside we cannot
  				# trivially detect if its one statement.
  				# Also nested if's often require braces to
  				# disambiguate the else binding so shhh there.
  				my @semi = ($stmt =~ /;/g);
22f2a2ef9   Andy Whitcroft   update checkpatch...
1058
  				push(@semi, "/**/") if ($stmt =~ m@/\*@);
f0a594c1c   Andy Whitcroft   update checkpatch...
1059
1060
1061
  				##print "semi<" . scalar(@semi) . ">
  ";
  				if ($lvl == 0 && scalar(@semi) < 2 &&
22f2a2ef9   Andy Whitcroft   update checkpatch...
1062
1063
  				    $stmt !~ /{/ && $stmt !~ /\bif\b/ &&
  				    $before !~ /}/ && $after !~ /{/) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1064
1065
1066
1067
1068
  				    	my $herectx = "$here
  " . join("
  ", @control, @block[1 .. $#block]) . "
  ";
  				    	shift(@block);
22f2a2ef9   Andy Whitcroft   update checkpatch...
1069
1070
  					WARN("braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
1071
1072
1073
  				}
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1074
  # don't include deprecated include files (uses RAW line)
4a0df2ef4   Andy Whitcroft   update checkpatch...
1075
  		for my $inc (@dep_includes) {
653d4876b   Andy Whitcroft   update checkpatch...
1076
  			if ($rawline =~ m@\#\s*include\s*\<$inc>@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1077
1078
  				ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1079
1080
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1081
1082
  # don't use deprecated functions
  		for my $func (@dep_functions) {
00df344fd   Andy Whitcroft   update checkpatch...
1083
  			if ($line =~ /\b$func\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1084
1085
  				ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1086
1087
1088
1089
  			}
  		}
  
  # no volatiles please
00df344fd   Andy Whitcroft   update checkpatch...
1090
  		if ($line =~ /\bvolatile\b/ && $line !~ /\basm\s+volatile\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1091
1092
  			WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1093
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1094
1095
  # warn about #if 0
  		if ($line =~ /^.#\s*if\s+0\b/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1096
1097
1098
  			CHK("if this code is redundant consider removing it
  " .
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1099
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1100
1101
1102
1103
1104
1105
1106
1107
  # check for needless kfree() checks
  		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
  			my $expr = $1;
  			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
  				WARN("kfree(NULL) is safe this check is probabally not required
  " . $hereprev);
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1108
1109
1110
1111
1112
1113
1114
  # warn about #ifdefs in C files
  #		if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
1115
1116
1117
1118
1119
  # warn about spacing in #ifdefs
  		if ($line =~ /^.#\s*(ifdef|ifndef|elif)\s\s+/) {
  			ERROR("exactly one space required after that #$1
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1120
1121
1122
1123
  # check for spinlock_t definitions without a comment.
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) {
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1124
1125
  				CHK("$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1126
1127
1128
1129
1130
  			}
  		}
  # 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)) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1131
1132
  				CHK("memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1133
1134
1135
  			}
  		}
  # check of hardware specific defines
22f2a2ef9   Andy Whitcroft   update checkpatch...
1136
  		if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1137
1138
  			CHK("architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1139
  		}
653d4876b   Andy Whitcroft   update checkpatch...
1140

de7d4f0e1   Andy Whitcroft   update checkpatch...
1141
1142
  # check the location of the inline attribute, that it is between
  # storage class and type.
22f2a2ef9   Andy Whitcroft   update checkpatch...
1143
1144
  		if ($line =~ /$Type\s+(?:inline|__always_inline|noinline)\b/ ||
  		    $line =~ /\b(?:inline|__always_inline|noinline)\s+$Storage/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
  			ERROR("inline keyword should sit between storage class and type
  " . $herecurr);
  		}
  
  # check for new externs in .c files.
  		if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) {
  			WARN("externs should be avoided in .c files
  " .  $herecurr);
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
  				CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
  			}
653d4876b   Andy Whitcroft   update checkpatch...
1163
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1164
1165
1166
  	}
  
  	if ($chk_patch && !$is_patch) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1167
1168
  		ERROR("Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
1169
1170
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1171
1172
  		ERROR("Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
1173
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1174
1175
1176
  	if ($clean == 0 && ($chk_patch || $is_patch)) {
  		print report_dump();
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
  	if ($clean == 1 && $quiet == 0) {
  		print "Your patch has no obvious style problems and is ready for submission.
  "
  	}
  	if ($clean == 0 && $quiet == 0) {
  		print "Your patch has style problems, please review.  If any of these errors
  ";
  		print "are false positives report them to the maintainer, see
  ";
  		print "CHECKPATCH in MAINTAINERS.
  ";
  	}
  	return $clean;
  }