Blame view

scripts/checkpatch.pl 195 KB
cb77f0d62   Kamil Rytarowski   scripts: Switch t...
1
  #!/usr/bin/env perl
882ea1d64   Joe Perches   scripts: use SPDX...
2
3
  # SPDX-License-Identifier: GPL-2.0
  #
dbf004d78   Dave Jones   remove my email a...
4
  # (c) 2001, Dave Jones. (the file handling bit)
00df344fd   Andy Whitcroft   update checkpatch...
5
  # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
2a5a2c252   Andy Whitcroft   checkpatch: updat...
6
  # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
015830be9   Andy Whitcroft   checkpatch: updat...
7
  # (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
882ea1d64   Joe Perches   scripts: use SPDX...
8
  # (c) 2010-2018 Joe Perches <joe@perches.com>
0a920b5b6   Andy Whitcroft   add a trivial pat...
9
10
  
  use strict;
cb77f0d62   Kamil Rytarowski   scripts: Switch t...
11
  use warnings;
c707a81de   Joe Perches   checkpatch: make ...
12
  use POSIX;
36061e380   Joe Perches   checkpatch: fix u...
13
14
  use File::Basename;
  use Cwd 'abs_path';
572302971   Joe Perches   checkpatch: color...
15
  use Term::ANSIColor qw(:constants);
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
16
  use Encode qw(decode encode);
0a920b5b6   Andy Whitcroft   add a trivial pat...
17
18
  
  my $P = $0;
36061e380   Joe Perches   checkpatch: fix u...
19
  my $D = dirname(abs_path($P));
0a920b5b6   Andy Whitcroft   add a trivial pat...
20

000d1cc18   Joe Perches   checkpatch.pl: ad...
21
  my $V = '0.32';
0a920b5b6   Andy Whitcroft   add a trivial pat...
22
23
24
25
26
27
28
  
  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...
29
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
30
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
31
  my $terse = 0;
34d8815f9   Joe Perches   checkpatch: add -...
32
  my $showfile = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
33
  my $file = 0;
4a593c344   Du, Changbin   checkpatch: add s...
34
  my $git = 0;
0dea9f1ee   Joe Perches   checkpatch: reduc...
35
  my %git_commits = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
36
  my $check = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
37
  my $check_orig = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
38
39
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
40
  my $summary_file = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
41
  my $show_types = 0;
3beb42ece   Joe Perches   checkpatch: add -...
42
  my $list_types = 0;
3705ce5bc   Joe Perches   checkpatch: creat...
43
  my $fix = 0;
9624b8d65   Joe Perches   checkpatch: add a...
44
  my $fix_inplace = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
45
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
46
  my %debug;
3445686af   Joe Perches   checkpatch: ignor...
47
  my %camelcase = ();
91bfe4843   Joe Perches   checkpatch: add -...
48
49
50
  my %use_type = ();
  my @use = ();
  my %ignore_type = ();
000d1cc18   Joe Perches   checkpatch.pl: ad...
51
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
52
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
53
  my $configuration_file = ".checkpatch.conf";
6cd7f3869   Joe Perches   checkpatch: allow...
54
  my $max_line_length = 80;
d62a201f2   Dave Hansen   checkpatch: enfor...
55
56
  my $ignore_perl_version = 0;
  my $minimum_perl_version = 5.10.0;
56193274e   Vadim Bendebury   checkpatch: allow...
57
  my $min_conf_desc_length = 4;
66b47b4a9   Kees Cook   checkpatch: look ...
58
  my $spelling_file = "$D/spelling.txt";
ebfd7d623   Joe Perches   checkpatch: add o...
59
  my $codespell = 0;
f1a636785   Maxim Uvarov   checkpatch: remov...
60
  my $codespellfile = "/usr/share/codespell/dictionary.txt";
bf1fa1dae   Joe Perches   checkpatch: exter...
61
  my $conststructsfile = "$D/const_structs.checkpatch";
75ad8c575   Jerome Forissier   checkpatch: add -...
62
  my $typedefsfile = "";
737c07677   John Brooks   checkpatch: chang...
63
  my $color = "auto";
dadf680de   Joe Perches   checkpatch: allow...
64
  my $allow_c99_comments = 1;
77f5b10a8   Hannes Eder   checkpatch: make ...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  
  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
34d8815f9   Joe Perches   checkpatch: add -...
80
    --showfile                 emit diffed file position, not input file position
4a593c344   Du, Changbin   checkpatch: add s...
81
82
83
84
85
86
87
88
89
90
    -g, --git                  treat FILE as a single commit or git revision range
                               single git commit with:
                                 <rev>
                                 <rev>^
                                 <rev>~n
                               multiple git commits with:
                                 <rev1>..<rev2>
                                 <rev1>...<rev2>
                                 <rev>-<count>
                               git merges are ignored
77f5b10a8   Hannes Eder   checkpatch: make ...
91
92
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
3beb42ece   Joe Perches   checkpatch: add -...
93
    --list-types               list the possible message types
91bfe4843   Joe Perches   checkpatch: add -...
94
    --types TYPE(,TYPE2...)    show only these comma separated message types
000d1cc18   Joe Perches   checkpatch.pl: ad...
95
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
3beb42ece   Joe Perches   checkpatch: add -...
96
    --show-types               show the specific message type in the output
6cd7f3869   Joe Perches   checkpatch: allow...
97
    --max-line-length=n        set the maximum line length, if exceeded, warn
56193274e   Vadim Bendebury   checkpatch: allow...
98
    --min-conf-desc-length=n   set the min description length, if shorter, warn
77f5b10a8   Hannes Eder   checkpatch: make ...
99
100
101
102
103
104
105
106
107
    --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
3705ce5bc   Joe Perches   checkpatch: creat...
108
109
110
111
112
    --fix                      EXPERIMENTAL - may create horrible results
                               If correctable single-line errors exist, create
                               "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
                               with potential errors corrected to the preferred
                               checkpatch style
9624b8d65   Joe Perches   checkpatch: add a...
113
114
115
    --fix-inplace              EXPERIMENTAL - may create horrible results
                               Is the same as --fix, but overwrites the input
                               file.  It's your fault if there's no backup or git
d62a201f2   Dave Hansen   checkpatch: enfor...
116
117
    --ignore-perl-version      override checking of perl version.  expect
                               runtime errors.
ebfd7d623   Joe Perches   checkpatch: add o...
118
    --codespell                Use the codespell dictionary for spelling/typos
f1a636785   Maxim Uvarov   checkpatch: remov...
119
                               (default:/usr/share/codespell/dictionary.txt)
ebfd7d623   Joe Perches   checkpatch: add o...
120
    --codespellfile            Use this codespell dictionary
75ad8c575   Jerome Forissier   checkpatch: add -...
121
    --typedefsfile             Read additional types from this file
737c07677   John Brooks   checkpatch: chang...
122
123
    --color[=WHEN]             Use colors 'always', 'never', or only when output
                               is a terminal ('auto'). Default is 'auto'.
77f5b10a8   Hannes Eder   checkpatch: make ...
124
125
126
127
128
129
130
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
3beb42ece   Joe Perches   checkpatch: add -...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  sub uniq {
  	my %seen;
  	return grep { !$seen{$_}++ } @_;
  }
  
  sub list_types {
  	my ($exitcode) = @_;
  
  	my $count = 0;
  
  	local $/ = undef;
  
  	open(my $script, '<', abs_path($P)) or
  	    die "$P: Can't read '$P' $!
  ";
  
  	my $text = <$script>;
  	close($script);
  
  	my @types = ();
0547fa585   Jean Delvare   checkpatch: add 6...
151
152
  	# Also catch when type or level is passed through a variable
  	for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
3beb42ece   Joe Perches   checkpatch: add -...
153
154
155
156
157
158
159
160
161
162
163
164
165
  		push (@types, $_);
  	}
  	@types = sort(uniq(@types));
  	print("#\tMessage type
  
  ");
  	foreach my $type (@types) {
  		print(++$count . "\t" . $type . "
  ");
  	}
  
  	exit($exitcode);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  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;
  }
737c07677   John Brooks   checkpatch: chang...
193
194
195
196
197
198
199
  # Perl's Getopt::Long allows options to take optional arguments after a space.
  # Prevent --color by itself from consuming other arguments
  foreach (@ARGV) {
  	if ($_ eq "--color" || $_ eq "-color") {
  		$_ = "--color=$color";
  	}
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
200
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
201
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
202
203
204
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
205
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
206
  	'terse!'	=> \$terse,
34d8815f9   Joe Perches   checkpatch: add -...
207
  	'showfile!'	=> \$showfile,
77f5b10a8   Hannes Eder   checkpatch: make ...
208
  	'f|file!'	=> \$file,
4a593c344   Du, Changbin   checkpatch: add s...
209
  	'g|git!'	=> \$git,
6c72ffaab   Andy Whitcroft   update checkpatch...
210
211
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
212
  	'ignore=s'	=> \@ignore,
91bfe4843   Joe Perches   checkpatch: add -...
213
  	'types=s'	=> \@use,
000d1cc18   Joe Perches   checkpatch.pl: ad...
214
  	'show-types!'	=> \$show_types,
3beb42ece   Joe Perches   checkpatch: add -...
215
  	'list-types!'	=> \$list_types,
6cd7f3869   Joe Perches   checkpatch: allow...
216
  	'max-line-length=i' => \$max_line_length,
56193274e   Vadim Bendebury   checkpatch: allow...
217
  	'min-conf-desc-length=i' => \$min_conf_desc_length,
6c72ffaab   Andy Whitcroft   update checkpatch...
218
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
219
220
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
221
  	'summary-file!'	=> \$summary_file,
3705ce5bc   Joe Perches   checkpatch: creat...
222
  	'fix!'		=> \$fix,
9624b8d65   Joe Perches   checkpatch: add a...
223
  	'fix-inplace!'	=> \$fix_inplace,
d62a201f2   Dave Hansen   checkpatch: enfor...
224
  	'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0df   Andy Whitcroft   update checkpatch...
225
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
226
  	'test-only=s'	=> \$tst_only,
ebfd7d623   Joe Perches   checkpatch: add o...
227
228
  	'codespell!'	=> \$codespell,
  	'codespellfile=s'	=> \$codespellfile,
75ad8c575   Jerome Forissier   checkpatch: add -...
229
  	'typedefsfile=s'	=> \$typedefsfile,
737c07677   John Brooks   checkpatch: chang...
230
231
232
  	'color=s'	=> \$color,
  	'no-color'	=> \$color,	#keep old behaviors of -nocolor
  	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
77f5b10a8   Hannes Eder   checkpatch: make ...
233
234
235
236
237
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
238

3beb42ece   Joe Perches   checkpatch: add -...
239
  list_types(0) if ($list_types);
9624b8d65   Joe Perches   checkpatch: add a...
240
  $fix = 1 if ($fix_inplace);
2ac73b4f6   Joe Perches   checkpatch: make ...
241
  $check_orig = $check;
9624b8d65   Joe Perches   checkpatch: add a...
242

0a920b5b6   Andy Whitcroft   add a trivial pat...
243
  my $exit = 0;
5b57980de   Joe Perches   checkpatch: impro...
244
  my $perl_version_ok = 1;
d62a201f2   Dave Hansen   checkpatch: enfor...
245
  if ($^V && $^V lt $minimum_perl_version) {
5b57980de   Joe Perches   checkpatch: impro...
246
  	$perl_version_ok = 0;
d62a201f2   Dave Hansen   checkpatch: enfor...
247
248
  	printf "$P: requires at least perl version %vd
  ", $minimum_perl_version;
5b57980de   Joe Perches   checkpatch: impro...
249
  	exit(1) if (!$ignore_perl_version);
d62a201f2   Dave Hansen   checkpatch: enfor...
250
  }
45107ff6d   Allen Hubbe   checkpatch: if no...
251
  #if no filenames are given, push '-' to read patch from stdin
0a920b5b6   Andy Whitcroft   add a trivial pat...
252
  if ($#ARGV < 0) {
45107ff6d   Allen Hubbe   checkpatch: if no...
253
  	push(@ARGV, '-');
0a920b5b6   Andy Whitcroft   add a trivial pat...
254
  }
737c07677   John Brooks   checkpatch: chang...
255
256
257
258
259
260
261
262
263
264
265
266
  if ($color =~ /^[01]$/) {
  	$color = !$color;
  } elsif ($color =~ /^always$/i) {
  	$color = 1;
  } elsif ($color =~ /^never$/i) {
  	$color = 0;
  } elsif ($color =~ /^auto$/i) {
  	$color = (-t STDOUT);
  } else {
  	die "Invalid color mode: $color
  ";
  }
91bfe4843   Joe Perches   checkpatch: add -...
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
  sub hash_save_array_words {
  	my ($hashRef, $arrayRef) = @_;
  
  	my @array = split(/,/, join(',', @$arrayRef));
  	foreach my $word (@array) {
  		$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*$/);
  
  		$hashRef->{$word}++;
  	}
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
284

91bfe4843   Joe Perches   checkpatch: add -...
285
286
  sub hash_show_words {
  	my ($hashRef, $prefix) = @_;
000d1cc18   Joe Perches   checkpatch.pl: ad...
287

3c816e490   Joe Perches   checkpatch: emit ...
288
  	if (keys %$hashRef) {
d8469f162   Joe Perches   checkpatch: impro...
289
290
  		print "
  NOTE: $prefix message types:";
58cb3cf66   Joe Perches   checkpatch: fix p...
291
  		foreach my $word (sort keys %$hashRef) {
91bfe4843   Joe Perches   checkpatch: add -...
292
293
  			print " $word";
  		}
d8469f162   Joe Perches   checkpatch: impro...
294
295
  		print "
  ";
91bfe4843   Joe Perches   checkpatch: add -...
296
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
297
  }
91bfe4843   Joe Perches   checkpatch: add -...
298
299
  hash_save_array_words(\%ignore_type, \@ignore);
  hash_save_array_words(\%use_type, \@use);
c2fdda0df   Andy Whitcroft   update checkpatch...
300
301
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
302
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
303
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
304
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
305
306
307
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
308
  }
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
309
  my $rpt_cleaners = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
310
311
312
313
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
  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...
334
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
335
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
336
337
338
339
  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...
340
341
342
343
344
345
346
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
417495eda   Andy Whitcroft   checkpatch: add _...
347
  			__kprobes|
165e72a6c   Sven Eckelmann   checkpatch: add _...
348
  			__ref|
33aa4597d   Geert Uytterhoeven   checkpatch: updat...
349
350
  			__refconst|
  			__refdata|
ad315455d   Boqun Feng   sparse: Add __pri...
351
352
  			__rcu|
  			__private
6c72ffaab   Andy Whitcroft   update checkpatch...
353
  		}x;
e970b8846   Joe Perches   checkpatch: add r...
354
355
356
357
358
  our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
  our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
  our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
  our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
  our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
8716de383   Joe Perches   checkpatch: add t...
359

52131292c   Wolfram Sang   checkpatch: fix f...
360
361
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
362
363
  our $Attribute	= qr{
  			const|
03f1df7da   Joe Perches   checkpatch: Add a...
364
365
366
  			__percpu|
  			__nocast|
  			__safe|
46d832f5e   Michael S. Tsirkin   checkpatch: repla...
367
  			__bitwise|
03f1df7da   Joe Perches   checkpatch: Add a...
368
369
370
371
372
373
374
375
  			__packed__|
  			__packed2__|
  			__naked|
  			__maybe_unused|
  			__always_unused|
  			__noreturn|
  			__used|
  			__cold|
e23ef1f33   Joe Perches   checkpatch: ignor...
376
  			__pure|
03f1df7da   Joe Perches   checkpatch: Add a...
377
378
  			__noclone|
  			__deprecated|
6c72ffaab   Andy Whitcroft   update checkpatch...
379
  			__read_mostly|
c5967e989   Joe Perches   checkpatch: add _...
380
  			__ro_after_init|
6c72ffaab   Andy Whitcroft   update checkpatch...
381
  			__kprobes|
8716de383   Joe Perches   checkpatch: add t...
382
  			$InitAttribute|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
383
384
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
385
386
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
387
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
388
  our $Modifier;
91cb5195f   Joe Perches   checkpatch: expan...
389
  our $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
6c72ffaab   Andy Whitcroft   update checkpatch...
390
391
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
95e2c6023   Joe Perches   checkpatch: warn ...
392
393
394
395
  our $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
  our $Binary	= qr{(?i)0b[01]+$Int_type?};
  our $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
  our $Int	= qr{[0-9]+$Int_type?};
2435880fe   Joe Perches   checkpatch: add c...
396
  our $Octal	= qr{0[0-7]+$Int_type?};
c0a5c8985   Joe Perches   checkpatch: impro...
397
  our $String	= qr{"[X\t]*"};
326b1ffc1   Joe Perches   checkpatch: fix $...
398
399
400
  our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
  our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
  our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
74349bcce   Joe Perches   checkpatch: add s...
401
  our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
2435880fe   Joe Perches   checkpatch: add c...
402
  our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
326b1ffc1   Joe Perches   checkpatch: fix $...
403
  our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
447432f32   Joe Perches   checkpatch: fix j...
404
  our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
23f780c90   Joe Perches   checkpatch: impro...
405
  our $Arithmetic = qr{\+|-|\*|\/|%};
6c72ffaab   Andy Whitcroft   update checkpatch...
406
407
408
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
23f780c90   Joe Perches   checkpatch: impro...
409
  			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
6c72ffaab   Andy Whitcroft   update checkpatch...
410
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
411
  our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
ab7e23f34   Joe Perches   checkpatch: add t...
412
  our $BasicType;
8905a67c6   Andy Whitcroft   update checkpatch...
413
  our $NonptrType;
1813087db   Joe Perches   checkpatch: add t...
414
  our $NonptrTypeMisordered;
8716de383   Joe Perches   checkpatch: add t...
415
  our $NonptrTypeWithAttr;
8905a67c6   Andy Whitcroft   update checkpatch...
416
  our $Type;
1813087db   Joe Perches   checkpatch: add t...
417
  our $TypeMisordered;
8905a67c6   Andy Whitcroft   update checkpatch...
418
  our $Declare;
1813087db   Joe Perches   checkpatch: add t...
419
  our $DeclareMisordered;
8905a67c6   Andy Whitcroft   update checkpatch...
420

15662b3e8   Joe Perches   checkpatch: add a...
421
422
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
423
424
425
426
427
428
429
  	|  \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...
430
431
432
433
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
e6176fa47   Joe Perches   checkpatch: add -...
434
  our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
021158b4c   Joe Perches   checkpatch: add t...
435
436
437
438
  our $typeOtherOSTypedefs = qr{(?x:
  	u_(?:char|short|int|long) |          # bsd
  	u(?:nchar|short|int|long)            # sysv
  )};
e6176fa47   Joe Perches   checkpatch: add -...
439
  our $typeKernelTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
440
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
441
442
  	atomic_t
  )};
e6176fa47   Joe Perches   checkpatch: add -...
443
444
445
446
447
  our $typeTypedefs = qr{(?x:
  	$typeC99Typedefs\b|
  	$typeOtherOSTypedefs\b|
  	$typeKernelTypedefs\b
  )};
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
448

6d32f7a39   Joe Perches   checkpatch: impro...
449
  our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
691e669ba   Joe Perches   checkpatch.pl: al...
450
  our $logFunctions = qr{(?x:
758d7aada   Miles Chen   checkpatch: updat...
451
  	printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
7d0b6594e   Jacob Keller   checkpatch: allow...
452
  	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
87bd499af   Joe Perches   checkpatch: add T...
453
  	TP_printk|
6e60c02e9   Joe Perches   checkpatch.pl: up...
454
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
455
  	panic|
066687279   Joe Perches   checkpatch: updat...
456
457
  	MODULE_[A-Z_]+|
  	seq_vprintf|seq_printf|seq_puts
691e669ba   Joe Perches   checkpatch.pl: al...
458
  )};
201124755   Joe Perches   checkpatch: valid...
459
460
461
462
463
464
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
8543ae129   Mugunthan V N   checkpatch: add S...
465
  	Suggested-by:|
201124755   Joe Perches   checkpatch: valid...
466
467
468
  	To:|
  	Cc:
  )};
1813087db   Joe Perches   checkpatch: add t...
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
  our @typeListMisordered = (
  	qr{char\s+(?:un)?signed},
  	qr{int\s+(?:(?:un)?signed\s+)?short\s},
  	qr{int\s+short(?:\s+(?:un)?signed)},
  	qr{short\s+int(?:\s+(?:un)?signed)},
  	qr{(?:un)?signed\s+int\s+short},
  	qr{short\s+(?:un)?signed},
  	qr{long\s+int\s+(?:un)?signed},
  	qr{int\s+long\s+(?:un)?signed},
  	qr{long\s+(?:un)?signed\s+int},
  	qr{int\s+(?:un)?signed\s+long},
  	qr{int\s+(?:un)?signed},
  	qr{int\s+long\s+long\s+(?:un)?signed},
  	qr{long\s+long\s+int\s+(?:un)?signed},
  	qr{long\s+long\s+(?:un)?signed\s+int},
  	qr{long\s+long\s+(?:un)?signed},
  	qr{long\s+(?:un)?signed},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
487
488
  our @typeList = (
  	qr{void},
0c773d9d6   Joe Perches   checkpatch: add s...
489
490
491
492
493
494
495
496
497
  	qr{(?:(?:un)?signed\s+)?char},
  	qr{(?:(?:un)?signed\s+)?short\s+int},
  	qr{(?:(?:un)?signed\s+)?short},
  	qr{(?:(?:un)?signed\s+)?int},
  	qr{(?:(?:un)?signed\s+)?long\s+int},
  	qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
  	qr{(?:(?:un)?signed\s+)?long\s+long},
  	qr{(?:(?:un)?signed\s+)?long},
  	qr{(?:un)?signed},
8905a67c6   Andy Whitcroft   update checkpatch...
498
499
500
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
501
502
503
504
505
506
  	qr{struct\s+$Ident},
  	qr{union\s+$Ident},
  	qr{enum\s+$Ident},
  	qr{${Ident}_t},
  	qr{${Ident}_handler},
  	qr{${Ident}_handler_fn},
1813087db   Joe Perches   checkpatch: add t...
507
  	@typeListMisordered,
8905a67c6   Andy Whitcroft   update checkpatch...
508
  );
938224b5e   Joe Perches   checkpatch: warn ...
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
  
  our $C90_int_types = qr{(?x:
  	long\s+long\s+int\s+(?:un)?signed|
  	long\s+long\s+(?:un)?signed\s+int|
  	long\s+long\s+(?:un)?signed|
  	(?:(?:un)?signed\s+)?long\s+long\s+int|
  	(?:(?:un)?signed\s+)?long\s+long|
  	int\s+long\s+long\s+(?:un)?signed|
  	int\s+(?:(?:un)?signed\s+)?long\s+long|
  
  	long\s+int\s+(?:un)?signed|
  	long\s+(?:un)?signed\s+int|
  	long\s+(?:un)?signed|
  	(?:(?:un)?signed\s+)?long\s+int|
  	(?:(?:un)?signed\s+)?long|
  	int\s+long\s+(?:un)?signed|
  	int\s+(?:(?:un)?signed\s+)?long|
  
  	int\s+(?:un)?signed|
  	(?:(?:un)?signed\s+)?int
  )};
485ff23ed   Alex Dowad   checkpatch: make ...
530
  our @typeListFile = ();
8716de383   Joe Perches   checkpatch: add t...
531
532
533
534
535
  our @typeListWithAttr = (
  	@typeList,
  	qr{struct\s+$InitAttribute\s+$Ident},
  	qr{union\s+$InitAttribute\s+$Ident},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
536
537
538
  our @modifierList = (
  	qr{fastcall},
  );
485ff23ed   Alex Dowad   checkpatch: make ...
539
  our @modifierListFile = ();
8905a67c6   Andy Whitcroft   update checkpatch...
540

2435880fe   Joe Perches   checkpatch: add c...
541
542
543
544
545
546
  our @mode_permission_funcs = (
  	["module_param", 3],
  	["module_param_(?:array|named|string)", 4],
  	["module_param_array_named", 5],
  	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
  	["proc_create(?:_data|)", 2],
459cf0ae5   Joe Perches   checkpatch: impro...
547
548
549
550
551
  	["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
  	["IIO_DEV_ATTR_[A-Z_]+", 1],
  	["SENSOR_(?:DEVICE_|)ATTR_2", 2],
  	["SENSOR_TEMPLATE(?:_2|)", 3],
  	["__ATTR", 2],
2435880fe   Joe Perches   checkpatch: add c...
552
  );
515a235ef   Joe Perches   checkpatch: impro...
553
554
555
556
557
558
  #Create a search pattern for all these functions to speed up a loop below
  our $mode_perms_search = "";
  foreach my $entry (@mode_permission_funcs) {
  	$mode_perms_search .= '|' if ($mode_perms_search ne "");
  	$mode_perms_search .= $entry->[0];
  }
001804689   Joe Perches   checkpatch: add a...
559
  $mode_perms_search = "(?:${mode_perms_search})";
515a235ef   Joe Perches   checkpatch: impro...
560

b392c64f5   Joe Perches   checkpatch: match...
561
562
563
564
565
566
567
  our $mode_perms_world_writable = qr{
  	S_IWUGO		|
  	S_IWOTH		|
  	S_IRWXUGO	|
  	S_IALLUGO	|
  	0[0-7][0-7][2367]
  }x;
f90774e1f   Joe Perches   checkpatch: look ...
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
  our %mode_permission_string_types = (
  	"S_IRWXU" => 0700,
  	"S_IRUSR" => 0400,
  	"S_IWUSR" => 0200,
  	"S_IXUSR" => 0100,
  	"S_IRWXG" => 0070,
  	"S_IRGRP" => 0040,
  	"S_IWGRP" => 0020,
  	"S_IXGRP" => 0010,
  	"S_IRWXO" => 0007,
  	"S_IROTH" => 0004,
  	"S_IWOTH" => 0002,
  	"S_IXOTH" => 0001,
  	"S_IRWXUGO" => 0777,
  	"S_IRUGO" => 0444,
  	"S_IWUGO" => 0222,
  	"S_IXUGO" => 0111,
  );
  
  #Create a search pattern for all these strings to speed up a loop below
  our $mode_perms_string_search = "";
  foreach my $entry (keys %mode_permission_string_types) {
  	$mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
  	$mode_perms_string_search .= $entry;
  }
001804689   Joe Perches   checkpatch: add a...
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
  our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
  our $multi_mode_perms_string_search = qr{
  	${single_mode_perms_string_search}
  	(?:\s*\|\s*${single_mode_perms_string_search})*
  }x;
  
  sub perms_to_octal {
  	my ($string) = @_;
  
  	return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
  
  	my $val = "";
  	my $oval = "";
  	my $to = 0;
  	my $curpos = 0;
  	my $lastpos = 0;
  	while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
  		$curpos = pos($string);
  		my $match = $2;
  		my $omatch = $1;
  		last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
  		$lastpos = $curpos;
  		$to |= $mode_permission_string_types{$match};
  		$val .= '\s*\|\s*' if ($val ne "");
  		$val .= $match;
  		$oval .= $omatch;
  	}
  	$oval =~ s/^\s*\|\s*//;
  	$oval =~ s/\s*\|\s*$//;
  	return sprintf("%04o", $to);
  }
f90774e1f   Joe Perches   checkpatch: look ...
624

7840a94cd   Wolfram Sang   checkpatch: refac...
625
626
  our $allowed_asm_includes = qr{(?x:
  	irq|
cdcee686e   Sergey Ryazanov   checkpatch: updat...
627
628
629
  	memory|
  	time|
  	reboot
7840a94cd   Wolfram Sang   checkpatch: refac...
630
631
  )};
  # memory.h: ARM has a custom one
66b47b4a9   Kees Cook   checkpatch: look ...
632
633
  # Load common spelling mistakes and build regular expression list.
  my $misspellings;
66b47b4a9   Kees Cook   checkpatch: look ...
634
  my %spelling_fix;
66b47b4a9   Kees Cook   checkpatch: look ...
635

36061e380   Joe Perches   checkpatch: fix u...
636
  if (open(my $spelling, '<', $spelling_file)) {
36061e380   Joe Perches   checkpatch: fix u...
637
638
  	while (<$spelling>) {
  		my $line = $_;
66b47b4a9   Kees Cook   checkpatch: look ...
639

36061e380   Joe Perches   checkpatch: fix u...
640
641
642
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
66b47b4a9   Kees Cook   checkpatch: look ...
643

36061e380   Joe Perches   checkpatch: fix u...
644
645
646
647
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my ($suspect, $fix) = split(/\|\|/, $line);
66b47b4a9   Kees Cook   checkpatch: look ...
648

36061e380   Joe Perches   checkpatch: fix u...
649
650
651
  		$spelling_fix{$suspect} = $fix;
  	}
  	close($spelling);
36061e380   Joe Perches   checkpatch: fix u...
652
653
654
  } else {
  	warn "No typos will be found - file '$spelling_file': $!
  ";
66b47b4a9   Kees Cook   checkpatch: look ...
655
  }
66b47b4a9   Kees Cook   checkpatch: look ...
656

ebfd7d623   Joe Perches   checkpatch: add o...
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
  if ($codespell) {
  	if (open(my $spelling, '<', $codespellfile)) {
  		while (<$spelling>) {
  			my $line = $_;
  
  			$line =~ s/\s*
  ?$//g;
  			$line =~ s/^\s*//g;
  
  			next if ($line =~ m/^\s*#/);
  			next if ($line =~ m/^\s*$/);
  			next if ($line =~ m/, disabled/i);
  
  			$line =~ s/,.*$//;
  
  			my ($suspect, $fix) = split(/->/, $line);
  
  			$spelling_fix{$suspect} = $fix;
  		}
  		close($spelling);
  	} else {
  		warn "No codespell typos will be found - file '$codespellfile': $!
  ";
  	}
  }
  
  $misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
75ad8c575   Jerome Forissier   checkpatch: add -...
684
685
  sub read_words {
  	my ($wordsRef, $file) = @_;
bf1fa1dae   Joe Perches   checkpatch: exter...
686

75ad8c575   Jerome Forissier   checkpatch: add -...
687
688
689
  	if (open(my $words, '<', $file)) {
  		while (<$words>) {
  			my $line = $_;
bf1fa1dae   Joe Perches   checkpatch: exter...
690

75ad8c575   Jerome Forissier   checkpatch: add -...
691
692
693
  			$line =~ s/\s*
  ?$//g;
  			$line =~ s/^\s*//g;
bf1fa1dae   Joe Perches   checkpatch: exter...
694

75ad8c575   Jerome Forissier   checkpatch: add -...
695
696
697
698
699
700
701
702
703
704
705
706
707
  			next if ($line =~ m/^\s*#/);
  			next if ($line =~ m/^\s*$/);
  			if ($line =~ /\s/) {
  				print("$file: '$line' invalid - ignored
  ");
  				next;
  			}
  
  			$$wordsRef .= '|' if ($$wordsRef ne "");
  			$$wordsRef .= $line;
  		}
  		close($file);
  		return 1;
bf1fa1dae   Joe Perches   checkpatch: exter...
708
  	}
75ad8c575   Jerome Forissier   checkpatch: add -...
709
710
711
712
713
714
715
716
717
718
719
720
721
722
  
  	return 0;
  }
  
  my $const_structs = "";
  read_words(\$const_structs, $conststructsfile)
      or warn "No structs that should be const will be found - file '$conststructsfile': $!
  ";
  
  my $typeOtherTypedefs = "";
  if (length($typedefsfile)) {
  	read_words(\$typeOtherTypedefs, $typedefsfile)
  	    or warn "No additional types will be considered - file '$typedefsfile': $!
  ";
bf1fa1dae   Joe Perches   checkpatch: exter...
723
  }
75ad8c575   Jerome Forissier   checkpatch: add -...
724
  $typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
bf1fa1dae   Joe Perches   checkpatch: exter...
725

8905a67c6   Andy Whitcroft   update checkpatch...
726
  sub build_types {
485ff23ed   Alex Dowad   checkpatch: make ...
727
728
729
730
731
732
733
734
  	my $mods = "(?x:  
  " . join("|
    ", (@modifierList, @modifierListFile)) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", (@typeList, @typeListFile)) . "
  )";
1813087db   Joe Perches   checkpatch: add t...
735
736
737
738
  	my $Misordered = "(?x:  
  " . join("|
    ", @typeListMisordered) . "
  )";
8716de383   Joe Perches   checkpatch: add t...
739
740
741
742
  	my $allWithAttr = "(?x:  
  " . join("|
    ", @typeListWithAttr) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
743
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
ab7e23f34   Joe Perches   checkpatch: add t...
744
  	$BasicType	= qr{
ab7e23f34   Joe Perches   checkpatch: add t...
745
746
747
  				(?:$typeTypedefs\b)|
  				(?:${all}\b)
  		}x;
8905a67c6   Andy Whitcroft   update checkpatch...
748
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
749
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
750
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
751
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
752
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
753
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
754
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
755
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
756
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
757
758
759
760
761
762
763
  	$NonptrTypeMisordered	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:${Misordered}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8716de383   Joe Perches   checkpatch: add t...
764
765
766
767
768
769
770
771
772
  	$NonptrTypeWithAttr	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
  				(?:$typeTypedefs\b)|
  				(?:${allWithAttr}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
773
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
774
  			$NonptrType
1574a29f8   Joe Perches   checkpatch: allow...
775
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
776
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
777
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
778
779
780
781
782
  	$TypeMisordered	= qr{
  			$NonptrTypeMisordered
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
  			(?:\s+$Inline|\s+$Modifier)*
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
783
  	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087db   Joe Perches   checkpatch: add t...
784
  	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c6   Andy Whitcroft   update checkpatch...
785
786
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
787

7d2367af0   Joe Perches   checkpatch: sugge...
788
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
789
790
791
792
793
794
  
  # Using $balanced_parens, $LvalOrFunc, or $FuncArg
  # requires at least perl version v5.10.0
  # Any use must be runtime checked with $^V
  
  our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
2435880fe   Joe Perches   checkpatch: add c...
795
  our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
c0a5c8985   Joe Perches   checkpatch: impro...
796
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7d2367af0   Joe Perches   checkpatch: sugge...
797

f84223087   Joe Perches   checkpatch: updat...
798
  our $declaration_macros = qr{(?x:
3e838b6c4   Joe Perches   checkpatch: Allow...
799
  	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
fe658f94b   Steffen Maier   checkpatch: [HLP]...
800
  	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
3d102fc0e   Gilad Ben-Yossef   checkpatch: add C...
801
802
  	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|
  	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
f84223087   Joe Perches   checkpatch: updat...
803
  )};
7d2367af0   Joe Perches   checkpatch: sugge...
804
805
806
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
5b9553abf   Joe Perches   checkpatch: make ...
807
808
809
810
811
  
  	while ($string =~ /^\s*\(.*\)\s*$/) {
  		$string =~ s@^\s*\(\s*@@;
  		$string =~ s@\s*\)\s*$@@;
  	}
7d2367af0   Joe Perches   checkpatch: sugge...
812
  	$string =~ s@\s+@ @g;
5b9553abf   Joe Perches   checkpatch: make ...
813

7d2367af0   Joe Perches   checkpatch: sugge...
814
815
  	return $string;
  }
3445686af   Joe Perches   checkpatch: ignor...
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
  sub seed_camelcase_file {
  	my ($file) = @_;
  
  	return if (!(-f $file));
  
  	local $/;
  
  	open(my $include_file, '<', "$file")
  	    or warn "$P: Can't read '$file' $!
  ";
  	my $text = <$include_file>;
  	close($include_file);
  
  	my @lines = split('
  ', $text);
  
  	foreach my $line (@lines) {
  		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
  		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
  			$camelcase{$1} = 1;
11ea516a6   Joe Perches   checkpatch: find ...
836
837
838
  		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
  			$camelcase{$1} = 1;
  		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
3445686af   Joe Perches   checkpatch: ignor...
839
840
841
842
  			$camelcase{$1} = 1;
  		}
  	}
  }
85b0ee18b   Joe Perches   checkpatch: see i...
843
844
  sub is_maintained_obsolete {
  	my ($filename) = @_;
f2c19c2f3   Jerome Forissier   checkpatch: don't...
845
  	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
85b0ee18b   Joe Perches   checkpatch: see i...
846

0616efa45   Joe Perches   checkpatch: speed...
847
  	my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
85b0ee18b   Joe Perches   checkpatch: see i...
848
849
850
  
  	return $status =~ /obsolete/i;
  }
3b6e8ac9e   Joe Perches   checkpatch: valid...
851
852
  sub is_SPDX_License_valid {
  	my ($license) = @_;
562941127   Joe Perches   checkpatch: fix S...
853
  	return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$root/.git"));
3b6e8ac9e   Joe Perches   checkpatch: valid...
854

562941127   Joe Perches   checkpatch: fix S...
855
856
  	my $root_path = abs_path($root);
  	my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
3b6e8ac9e   Joe Perches   checkpatch: valid...
857
858
859
  	return 0 if ($status ne "");
  	return 1;
  }
3445686af   Joe Perches   checkpatch: ignor...
860
861
862
863
864
  my $camelcase_seeded = 0;
  sub seed_camelcase_includes {
  	return if ($camelcase_seeded);
  
  	my $files;
c707a81de   Joe Perches   checkpatch: make ...
865
866
867
868
  	my $camelcase_cache = "";
  	my @include_files = ();
  
  	$camelcase_seeded = 1;
351b2a1fe   Joe Perches   checkpatch: cache...
869

3645e3283   Richard Genoud   checkpatch: fix d...
870
  	if (-e ".git") {
351b2a1fe   Joe Perches   checkpatch: cache...
871
872
  		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
  		chomp $git_last_include_commit;
c707a81de   Joe Perches   checkpatch: make ...
873
  		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686af   Joe Perches   checkpatch: ignor...
874
  	} else {
c707a81de   Joe Perches   checkpatch: make ...
875
  		my $last_mod_date = 0;
3445686af   Joe Perches   checkpatch: ignor...
876
  		$files = `find $root/include -name "*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
  		@include_files = split('
  ', $files);
  		foreach my $file (@include_files) {
  			my $date = POSIX::strftime("%Y%m%d%H%M",
  						   localtime((stat $file)[9]));
  			$last_mod_date = $date if ($last_mod_date < $date);
  		}
  		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
  	}
  
  	if ($camelcase_cache ne "" && -f $camelcase_cache) {
  		open(my $camelcase_file, '<', "$camelcase_cache")
  		    or warn "$P: Can't read '$camelcase_cache' $!
  ";
  		while (<$camelcase_file>) {
  			chomp;
  			$camelcase{$_} = 1;
  		}
  		close($camelcase_file);
  
  		return;
3445686af   Joe Perches   checkpatch: ignor...
898
  	}
c707a81de   Joe Perches   checkpatch: make ...
899

3645e3283   Richard Genoud   checkpatch: fix d...
900
  	if (-e ".git") {
c707a81de   Joe Perches   checkpatch: make ...
901
902
903
904
  		$files = `git ls-files "include/*.h"`;
  		@include_files = split('
  ', $files);
  	}
3445686af   Joe Perches   checkpatch: ignor...
905
906
907
  	foreach my $file (@include_files) {
  		seed_camelcase_file($file);
  	}
351b2a1fe   Joe Perches   checkpatch: cache...
908

c707a81de   Joe Perches   checkpatch: make ...
909
  	if ($camelcase_cache ne "") {
351b2a1fe   Joe Perches   checkpatch: cache...
910
  		unlink glob ".checkpatch-camelcase.*";
c707a81de   Joe Perches   checkpatch: make ...
911
912
913
  		open(my $camelcase_file, '>', "$camelcase_cache")
  		    or warn "$P: Can't write '$camelcase_cache' $!
  ";
351b2a1fe   Joe Perches   checkpatch: cache...
914
915
916
917
918
919
  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
  			print $camelcase_file ("$_
  ");
  		}
  		close($camelcase_file);
  	}
3445686af   Joe Perches   checkpatch: ignor...
920
  }
d311cd445   Joe Perches   checkpatch: add t...
921
922
923
924
925
926
927
928
929
  sub git_commit_info {
  	my ($commit, $id, $desc) = @_;
  
  	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
  
  	my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
  	$output =~ s/^\s*//gm;
  	my @lines = split("
  ", $output);
0d7835fca   Joe Perches   checkpatch: updat...
930
  	return ($id, $desc) if ($#lines < 0);
d311cd445   Joe Perches   checkpatch: add t...
931
932
933
934
935
936
937
938
939
940
941
  	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
  # Maybe one day convert this block of bash into something that returns
  # all matching commit ids, but it's very slow...
  #
  #		echo "checking commits $1..."
  #		git rev-list --remotes | grep -i "^$1" |
  #		while read line ; do
  #		    git log --format='%H %s' -1 $line |
  #		    echo "commit $(cut -c 1-12,41-)"
  #		done
  	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
948b133a1   Heinrich Schuchardt   checkpatch: remov...
942
  		$id = undef;
d311cd445   Joe Perches   checkpatch: add t...
943
944
945
946
947
948
949
  	} else {
  		$id = substr($lines[0], 0, 12);
  		$desc = substr($lines[0], 41);
  	}
  
  	return ($id, $desc);
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
950
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
951
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
952
  my @lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
953
  my @fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
954
955
  my @fixed_inserted = ();
  my @fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
956
  my $fixlinenr = -1;
4a593c344   Du, Changbin   checkpatch: add s...
957
958
959
960
961
962
963
  # If input is git commits, extract all commits from the commit expressions.
  # For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
  die "$P: No git repository found
  " if ($git && !-e ".git");
  
  if ($git) {
  	my @commits = ();
0dea9f1ee   Joe Perches   checkpatch: reduc...
964
  	foreach my $commit_expr (@ARGV) {
4a593c344   Du, Changbin   checkpatch: add s...
965
  		my $git_range;
28898fd1a   Joe Perches   checkpatch: impro...
966
967
  		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
  			$git_range = "-$2 $1";
4a593c344   Du, Changbin   checkpatch: add s...
968
969
  		} elsif ($commit_expr =~ m/\.\./) {
  			$git_range = "$commit_expr";
4a593c344   Du, Changbin   checkpatch: add s...
970
  		} else {
0dea9f1ee   Joe Perches   checkpatch: reduc...
971
972
973
974
975
  			$git_range = "-1 $commit_expr";
  		}
  		my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
  		foreach my $line (split(/
  /, $lines)) {
28898fd1a   Joe Perches   checkpatch: impro...
976
977
  			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
  			next if (!defined($1) || !defined($2));
0dea9f1ee   Joe Perches   checkpatch: reduc...
978
979
980
981
  			my $sha1 = $1;
  			my $subject = $2;
  			unshift(@commits, $sha1);
  			$git_commits{$sha1} = $subject;
4a593c344   Du, Changbin   checkpatch: add s...
982
983
984
985
986
987
  		}
  	}
  	die "$P: no git commits after extraction!
  " if (@commits == 0);
  	@ARGV = @commits;
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
988
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
989
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
990
  	my $FILE;
4a593c344   Du, Changbin   checkpatch: add s...
991
992
993
994
995
  	if ($git) {
  		open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
  			die "$P: $filename: git format-patch failed - $!
  ";
  	} elsif ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
996
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
997
998
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
999
1000
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
1001
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1002
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
1003
1004
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1005
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1006
1007
  	if ($filename eq '-') {
  		$vname = 'Your patch';
4a593c344   Du, Changbin   checkpatch: add s...
1008
  	} elsif ($git) {
0dea9f1ee   Joe Perches   checkpatch: reduc...
1009
  		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
c2fdda0df   Andy Whitcroft   update checkpatch...
1010
1011
1012
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1013
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1014
1015
1016
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1017
  	close($FILE);
d8469f162   Joe Perches   checkpatch: impro...
1018
1019
1020
1021
1022
1023
1024
1025
1026
  
  	if ($#ARGV > 0 && $quiet == 0) {
  		print '-' x length($vname) . "
  ";
  		print "$vname
  ";
  		print '-' x length($vname) . "
  ";
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1027
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1028
1029
1030
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
1031
  	@lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
1032
  	@fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
1033
1034
  	@fixed_inserted = ();
  	@fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
1035
  	$fixlinenr = -1;
485ff23ed   Alex Dowad   checkpatch: make ...
1036
1037
1038
  	@modifierListFile = ();
  	@typeListFile = ();
  	build_types();
0a920b5b6   Andy Whitcroft   add a trivial pat...
1039
  }
d8469f162   Joe Perches   checkpatch: impro...
1040
  if (!$quiet) {
3c816e490   Joe Perches   checkpatch: emit ...
1041
1042
  	hash_show_words(\%use_type, "Used");
  	hash_show_words(\%ignore_type, "Ignored");
5b57980de   Joe Perches   checkpatch: impro...
1043
  	if (!$perl_version_ok) {
d8469f162   Joe Perches   checkpatch: impro...
1044
1045
1046
  		print << "EOM"
  
  NOTE: perl $^V is not modern enough to detect all possible issues.
5b57980de   Joe Perches   checkpatch: impro...
1047
        An upgrade to at least perl $minimum_perl_version is suggested.
d8469f162   Joe Perches   checkpatch: impro...
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
  EOM
  	}
  	if ($exit) {
  		print << "EOM"
  
  NOTE: If any of the errors are false positives, please report
        them to the maintainer, see CHECKPATCH in MAINTAINERS.
  EOM
  	}
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1058
1059
1060
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
  	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...
1073
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1074
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
1075
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1076

201124755   Joe Perches   checkpatch: valid...
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
  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;
85e12066e   Joe Perches   checkpatch: impro...
1094
  		$formatted_email =~ s/\Q$address\E.*$//;
201124755   Joe Perches   checkpatch: valid...
1095
  		$name = $formatted_email;
3705ce5bc   Joe Perches   checkpatch: creat...
1096
  		$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
  		$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 = "";
  		}
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1110
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1111
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
1112
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
  	$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;
3705ce5bc   Joe Perches   checkpatch: creat...
1127
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1128
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
1129
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
  
  	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;
  }
d311cd445   Joe Perches   checkpatch: add t...
1144
  sub which {
bd474ca07   Joe Perches   checkpatch: use t...
1145
  	my ($bin) = @_;
d311cd445   Joe Perches   checkpatch: add t...
1146

bd474ca07   Joe Perches   checkpatch: use t...
1147
1148
1149
1150
  	foreach my $path (split(/:/, $ENV{PATH})) {
  		if (-e "$path/$bin") {
  			return "$path/$bin";
  		}
d311cd445   Joe Perches   checkpatch: add t...
1151
  	}
d311cd445   Joe Perches   checkpatch: add t...
1152

bd474ca07   Joe Perches   checkpatch: use t...
1153
  	return "";
d311cd445   Joe Perches   checkpatch: add t...
1154
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
  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...
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
  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...
1186
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
1187
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
1188
1189
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1190

4a0df2ef4   Andy Whitcroft   update checkpatch...
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
  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...
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
1214
1215
1216
1217
1218
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
1219
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
1220
1221
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
1222

773647a09   Andy Whitcroft   update checkpatch...
1223
1224
1225
1226
1227
  	# Always copy over the diff marker.
  	$res = substr($line, 0, 1);
  
  	for ($off = 1; $off < length($line); $off++) {
  		$c = substr($line, $off, 1);
8d2e11b22   Claudio Fontana   checkpatch: two s...
1228
  		# Comments we are whacking completely including the begin
773647a09   Andy Whitcroft   update checkpatch...
1229
1230
1231
1232
1233
1234
1235
  		# 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...
1236
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
1237
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
1238
1239
1240
1241
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
1242
  		}
113f04a83   Daniel Walker   checkpatch: handl...
1243
1244
1245
1246
1247
1248
1249
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
1250
1251
1252
1253
1254
1255
1256
  
  		# 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...
1257
  		}
773647a09   Andy Whitcroft   update checkpatch...
1258
1259
1260
1261
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
1262

773647a09   Andy Whitcroft   update checkpatch...
1263
1264
1265
1266
1267
1268
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1269

fae17daed   Andy Whitcroft   checkpatch: comme...
1270
1271
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1272
1273
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
1274
1275
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
1276
1277
1278
1279
1280
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
1281
  	}
113f04a83   Daniel Walker   checkpatch: handl...
1282
1283
1284
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1285
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
1286
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1287
1288
1289
1290
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
1291
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1292
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
1293
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
1294
  	}
dadf680de   Joe Perches   checkpatch: allow...
1295
1296
1297
1298
  	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
  		my $match = $1;
  		$res =~ s/\Q$match\E/"$;" x length($match)/e;
  	}
00df344fd   Andy Whitcroft   update checkpatch...
1299
1300
  	return $res;
  }
a6962d727   Joe Perches   checkpatch: Prefe...
1301
1302
  sub get_quoted_string {
  	my ($line, $rawline) = @_;
478b17998   Joe Perches   checkpatch: impro...
1303
  	return "" if (!defined($line) || !defined($rawline));
33acb54a4   Joe Perches   checkpatch: use $...
1304
  	return "" if ($line !~ m/($String)/g);
a6962d727   Joe Perches   checkpatch: Prefe...
1305
1306
  	return substr($rawline, $-[0], $+[0] - $-[0]);
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1307
1308
1309
1310
1311
1312
  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...
1313
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1314

13214adf7   Andy Whitcroft   update checkpatch...
1315
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1316
1317
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
1318
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
1319
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
1320
1321
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1322
1323
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
1324
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
1325
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
1326
1327
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1328
1329
1330
1331
  		# 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...
1332
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
1333
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
1334
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
1335
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
1336
1337
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1338
1339
1340
1341
1342
1343
1344
  				$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...
1345
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
1346
1347
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1348
1349
1350
1351
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1352
  		}
cf655043d   Andy Whitcroft   update checkpatch...
1353
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
1354
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
1355
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
1356

773647a09   Andy Whitcroft   update checkpatch...
1357
1358
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
1359
1360
1361
1362
1363
1364
1365
1366
1367
  
  		# 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...
1368
1369
1370
1371
1372
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
1373
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
  		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...
1384
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
  		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...
1395
1396
1397
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
  			}
  		}
  		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...
1409
1410
1411
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
1412
1413
1414
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1415
1416
1417
1418
1419
1420
1421
1422
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1423
1424
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1425
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
1426
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1427
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
1428
1429
1430
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1431
1432
1433
1434
1435
1436
1437
1438
  
  	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...
1439
1440
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
1441
1442
1443
1444
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
  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...
1492
1493
1494
1495
1496
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
1497
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
1498
1499
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
1500
1501
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
1502
1503
1504
1505
1506
1507
1508
1509
  	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...
1510
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
1511
1512
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
1513
1514
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1515
1516
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
1517
1518
1519
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
1520
1521
1522
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
1523
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1524
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
1525
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1526
1527
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1528
1529
1530
1531
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
1532
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
1533
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
1534
1535
1536
1537
1538
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
1539
1540
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
1541
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1542
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
1543
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1544
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
1545
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1546
1547
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
1548
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1549
1550
1551
1552
1553
1554
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1555

f0a594c1c   Andy Whitcroft   update checkpatch...
1556
1557
1558
1559
1560
1561
1562
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1563

f0a594c1c   Andy Whitcroft   update checkpatch...
1564
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
1565
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1566
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1567
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1568
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1569
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1570
1571
1572
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1573
1574
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1575
1576
1577
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1578
1579
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
1580
1581
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
1582
1583
1584
1585
1586
1587
  	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...
1588
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1589
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1590
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1591
1592
1593
1594
1595
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1596
1597
1598
1599
1600
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
1601
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1602
1603
1604
1605
1606
1607
1608
  	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...
1609
1610
1611
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
  		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...
1634
1635
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1636
1637
1638
1639
1640
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
  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;
  }
2a9f9d851   Tobin C. Harding   checkpatch: add s...
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
  sub get_stat_real {
  	my ($linenr, $lc) = @_;
  
  	my $stat_real = raw_line($linenr, 0);
  	for (my $count = $linenr + 1; $count <= $lc; $count++) {
  		$stat_real = $stat_real . "
  " . raw_line($count, 0);
  	}
  
  	return $stat_real;
  }
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
  sub get_stat_here {
  	my ($linenr, $cnt, $here) = @_;
  
  	my $herectx = $here . "
  ";
  	for (my $n = 0; $n < $cnt; $n++) {
  		$herectx .= raw_line($linenr, $n) . "
  ";
  	}
  
  	return $herectx;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1679
1680
1681
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1682

6c72ffaab   Andy Whitcroft   update checkpatch...
1683
1684
1685
1686
1687
1688
  	$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...
1689
1690
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1691
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1692

6c72ffaab   Andy Whitcroft   update checkpatch...
1693
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1694
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1695
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1696
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
1697
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1698
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
1699
1700
1701
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1702
1703
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1704
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1705
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1706
1707
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1708

6c72ffaab   Andy Whitcroft   update checkpatch...
1709
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1710
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1711
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1712
1713
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1714

6c72ffaab   Andy Whitcroft   update checkpatch...
1715
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1716
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1717
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1718
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1719
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1720
1721
1722
1723
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1724
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1725
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1726
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1727
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1728
1729
1730
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1731
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1732

e91b6e263   Andy Whitcroft   checkpatch: types...
1733
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1734
1735
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1736
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1737
1738
1739
1740
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1741
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1742
1743
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1744
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1745
1746
1747
1748
1749
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1750
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1751
1752
1753
1754
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1755

c45dcabd2   Andy Whitcroft   update checkpatch...
1756
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1757
1758
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1759
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1760
1761
1762
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1763
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1764

c45dcabd2   Andy Whitcroft   update checkpatch...
1765
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1766
1767
1768
1769
1770
  			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...
1771
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1772

c45dcabd2   Andy Whitcroft   update checkpatch...
1773
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1774
1775
1776
1777
1778
1779
1780
1781
1782
  			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...
1783
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1784
1785
1786
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1787
1788
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1789

171ae1a49   Andy Whitcroft   update checkpatch...
1790
1791
1792
1793
1794
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1795
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1796
1797
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1798
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1799
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1800
1801
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1802
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1803
1804
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1805
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1806
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1807
1808
1809
1810
1811
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1812
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1813
1814
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1815
1816
1817
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1818
1819
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1820
1821
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1822
1823
1824
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1825
1826
1827
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1828
1829
1830
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1831
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1832
1833
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1834
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1835
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1836
1837
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1838
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1839
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1840

8e761b04a   Andy Whitcroft   checkpatch: detec...
1841
1842
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1843
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1844
1845
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1846
1847
1848
1849
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1850
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1851
1852
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1853
1854
1855
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1856
1857
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1858
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1859
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1860
1861
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1862
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1863
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1864
1865
1866
1867
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
  		} 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...
1884

8e761b04a   Andy Whitcroft   checkpatch: detec...
1885
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1886
1887
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1888
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1889
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
  			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...
1902
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1903
1904
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1905
1906
1907
1908
1909
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1910
1911
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1912
1913
1914
1915
1916
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1917
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1918

1f65f947a   Andy Whitcroft   checkpatch: add c...
1919
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1920
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1921
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1922
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1923
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1924
1925
1926
1927
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1928
1929
1930
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1931
1932
1933
1934
1935
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1936
1937
1938
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1939
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1940
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1941
1942
1943
1944
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1945
1946
1947
1948
1949
1950
1951
  		# 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...
1952
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1953
1954
1955
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
1956
  					push(@modifierListFile, $modifier);
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1957
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1958
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1959
1960
1961
1962
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
1963
  			push(@typeListFile, $possible);
c45dcabd2   Andy Whitcroft   update checkpatch...
1964
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1965
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1966
1967
1968
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1969
1970
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1971
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1972
  sub show_type {
cbec18afc   Joe Perches   checkpatch: use a...
1973
  	my ($type) = @_;
91bfe4843   Joe Perches   checkpatch: add -...
1974

522b837c6   Alexey Dobriyan   checkpatch: warn ...
1975
  	$type =~ tr/[a-z]/[A-Z]/;
cbec18afc   Joe Perches   checkpatch: use a...
1976
1977
1978
  	return defined $use_type{$type} if (scalar keys %use_type > 0);
  
  	return !defined $ignore_type{$type};
000d1cc18   Joe Perches   checkpatch.pl: ad...
1979
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
1980
  sub report {
cbec18afc   Joe Perches   checkpatch: use a...
1981
1982
1983
1984
  	my ($level, $type, $msg) = @_;
  
  	if (!show_type($type) ||
  	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
1985
1986
  		return 0;
  	}
572302971   Joe Perches   checkpatch: color...
1987
  	my $output = '';
737c07677   John Brooks   checkpatch: chang...
1988
  	if ($color) {
572302971   Joe Perches   checkpatch: color...
1989
1990
1991
1992
1993
1994
1995
1996
1997
  		if ($level eq 'ERROR') {
  			$output .= RED;
  		} elsif ($level eq 'WARNING') {
  			$output .= YELLOW;
  		} else {
  			$output .= GREEN;
  		}
  	}
  	$output .= $prefix . $level . ':';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1998
  	if ($show_types) {
737c07677   John Brooks   checkpatch: chang...
1999
  		$output .= BLUE if ($color);
572302971   Joe Perches   checkpatch: color...
2000
  		$output .= "$type:";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2001
  	}
737c07677   John Brooks   checkpatch: chang...
2002
  	$output .= RESET if ($color);
572302971   Joe Perches   checkpatch: color...
2003
2004
  	$output .= ' ' . $msg . "
  ";
34d8815f9   Joe Perches   checkpatch: add -...
2005
2006
2007
2008
2009
2010
2011
2012
  
  	if ($showfile) {
  		my @lines = split("
  ", $output, -1);
  		splice(@lines, 1, 1);
  		$output = join("
  ", @lines);
  	}
572302971   Joe Perches   checkpatch: color...
2013
2014
2015
  	$output = (split('
  ', $output))[0] . "
  " if ($terse);
8905a67c6   Andy Whitcroft   update checkpatch...
2016

572302971   Joe Perches   checkpatch: color...
2017
  	push(our @report, $output);
773647a09   Andy Whitcroft   update checkpatch...
2018
2019
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
2020
  }
cbec18afc   Joe Perches   checkpatch: use a...
2021

f0a594c1c   Andy Whitcroft   update checkpatch...
2022
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
2023
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
2024
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
2025

d752fcc88   Joe Perches   checkpatch: add a...
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
  sub fixup_current_range {
  	my ($lineRef, $offset, $length) = @_;
  
  	if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
  		my $o = $1;
  		my $l = $2;
  		my $no = $o + $offset;
  		my $nl = $l + $length;
  		$$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
  	}
  }
  
  sub fix_inserted_deleted_lines {
  	my ($linesRef, $insertedRef, $deletedRef) = @_;
  
  	my $range_last_linenr = 0;
  	my $delta_offset = 0;
  
  	my $old_linenr = 0;
  	my $new_linenr = 0;
  
  	my $next_insert = 0;
  	my $next_delete = 0;
  
  	my @lines = ();
  
  	my $inserted = @{$insertedRef}[$next_insert++];
  	my $deleted = @{$deletedRef}[$next_delete++];
  
  	foreach my $old_line (@{$linesRef}) {
  		my $save_line = 1;
  		my $line = $old_line;	#don't modify the array
323b267fa   Joe Perches   checkpatch: fix -...
2058
  		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
d752fcc88   Joe Perches   checkpatch: add a...
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
  			$delta_offset = 0;
  		} elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {	#new hunk
  			$range_last_linenr = $new_linenr;
  			fixup_current_range(\$line, $delta_offset, 0);
  		}
  
  		while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
  			$deleted = @{$deletedRef}[$next_delete++];
  			$save_line = 0;
  			fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
  		}
  
  		while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
  			push(@lines, ${$inserted}{'LINE'});
  			$inserted = @{$insertedRef}[$next_insert++];
  			$new_linenr++;
  			fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
  		}
  
  		if ($save_line) {
  			push(@lines, $line);
  			$new_linenr++;
  		}
  
  		$old_linenr++;
  	}
  
  	return @lines;
  }
f2d7e4d43   Joe Perches   checkpatch: add f...
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
  sub fix_insert_line {
  	my ($linenr, $line) = @_;
  
  	my $inserted = {
  		LINENR => $linenr,
  		LINE => $line,
  	};
  	push(@fixed_inserted, $inserted);
  }
  
  sub fix_delete_line {
  	my ($linenr, $line) = @_;
  
  	my $deleted = {
  		LINENR => $linenr,
  		LINE => $line,
  	};
  
  	push(@fixed_deleted, $deleted);
  }
de7d4f0e1   Andy Whitcroft   update checkpatch...
2108
  sub ERROR {
cbec18afc   Joe Perches   checkpatch: use a...
2109
2110
2111
  	my ($type, $msg) = @_;
  
  	if (report("ERROR", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2112
2113
  		our $clean = 0;
  		our $cnt_error++;
3705ce5bc   Joe Perches   checkpatch: creat...
2114
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2115
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2116
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2117
2118
  }
  sub WARN {
cbec18afc   Joe Perches   checkpatch: use a...
2119
2120
2121
  	my ($type, $msg) = @_;
  
  	if (report("WARNING", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2122
2123
  		our $clean = 0;
  		our $cnt_warn++;
3705ce5bc   Joe Perches   checkpatch: creat...
2124
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2125
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2126
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2127
2128
  }
  sub CHK {
cbec18afc   Joe Perches   checkpatch: use a...
2129
2130
2131
  	my ($type, $msg) = @_;
  
  	if ($check && report("CHECK", $type, $msg)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2132
2133
  		our $clean = 0;
  		our $cnt_chk++;
3705ce5bc   Joe Perches   checkpatch: creat...
2134
  		return 1;
6c72ffaab   Andy Whitcroft   update checkpatch...
2135
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2136
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2137
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
  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...
2164
2165
2166
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
2167
2168
  	}
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2169
2170
  sub trim {
  	my ($string) = @_;
b34c648bb   Joe Perches   checkpatch: bette...
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
  	$string =~ s/^\s+|\s+$//g;
  
  	return $string;
  }
  
  sub ltrim {
  	my ($string) = @_;
  
  	$string =~ s/^\s+//;
  
  	return $string;
  }
  
  sub rtrim {
  	my ($string) = @_;
  
  	$string =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
2188
2189
2190
  
  	return $string;
  }
52ea85061   Joe Perches   checkpatch: add t...
2191
2192
2193
2194
2195
2196
2197
  sub string_find_replace {
  	my ($string, $find, $replace) = @_;
  
  	$string =~ s/$find/$replace/g;
  
  	return $string;
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
  sub tabify {
  	my ($leading) = @_;
  
  	my $source_indent = 8;
  	my $max_spaces_before_tab = $source_indent - 1;
  	my $spaces_to_tab = " " x $source_indent;
  
  	#convert leading spaces to tabs
  	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
  	#Remove spaces before a tab
  	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
  
  	return "$leading";
  }
d1fe9c099   Joe Perches   checkpatch: add s...
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
  sub pos_last_openparen {
  	my ($line) = @_;
  
  	my $pos = 0;
  
  	my $opens = $line =~ tr/\(/\(/;
  	my $closes = $line =~ tr/\)/\)/;
  
  	my $last_openparen = 0;
  
  	if (($opens == 0) || ($closes >= $opens)) {
  		return -1;
  	}
  
  	my $len = length($line);
  
  	for ($pos = 0; $pos < $len; $pos++) {
  		my $string = substr($line, $pos);
  		if ($string =~ /^($FuncArg|$balanced_parens)/) {
  			$pos += length($1) - 1;
  		} elsif (substr($line, $pos, 1) eq '(') {
  			$last_openparen = $pos;
  		} elsif (index($string, '(') == -1) {
  			last;
  		}
  	}
91cb5195f   Joe Perches   checkpatch: expan...
2238
  	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c099   Joe Perches   checkpatch: add s...
2239
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
2240
2241
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2242
2243
2244
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2245
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2246
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2247
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2248

4a0df2ef4   Andy Whitcroft   update checkpatch...
2249
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2250
2251
2252
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2253
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2254
  	my $signoff = 0;
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2255
2256
  	my $author = '';
  	my $authorsignoff = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2257
  	my $is_patch = 0;
133712a2e   Rob Herring   checkpatch: DT bi...
2258
  	my $is_binding_patch = -1;
29ee1b0c6   Joe Perches   checkpatch: ignor...
2259
  	my $in_header_lines = $file ? 0 : 1;
15662b3e8   Joe Perches   checkpatch: add a...
2260
  	my $in_commit_log = 0;		#Scanning lines before patch
ed43c4e58   Allen Hubbe   checkpatch: check...
2261
  	my $has_commit_log = 0;		#Encountered lines before patch
490b292c8   Joe Perches   checkpatch: warn ...
2262
  	my $commit_log_lines = 0;	#Number of commit log lines
77cb8546b   Joe Perches   checkpatch: warn ...
2263
  	my $commit_log_possible_stack_dump = 0;
2a076f40d   Joe Perches   checkpatch, Submi...
2264
  	my $commit_log_long_line = 0;
e518e9a59   Joe Perches   checkpatch: emit ...
2265
  	my $commit_log_has_diff = 0;
13f1937ef   Joe Perches   checkpatch: emit ...
2266
  	my $reported_maintainer_file = 0;
fa64205df   Pasi Savanainen   checkpatch: check...
2267
  	my $non_utf8_charset = 0;
365dd4eaa   Joe Perches   checkpatch: add a...
2268
  	my $last_blank_line = 0;
5e4f6ba5e   Joe Perches   checkpatch: add a...
2269
  	my $last_coalesced_string_linenr = -1;
365dd4eaa   Joe Perches   checkpatch: add a...
2270

13214adf7   Andy Whitcroft   update checkpatch...
2271
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
2272
2273
2274
2275
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2276
2277
2278
2279
2280
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
77cb8546b   Joe Perches   checkpatch: warn ...
2281
  	my $context_function;		#undef'd unless there's a known function
0a920b5b6   Andy Whitcroft   add a trivial pat...
2282
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
2283
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2284
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2285
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2286

13214adf7   Andy Whitcroft   update checkpatch...
2287
2288
2289
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
2290
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
2291
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2292
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2293
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
2294

7e51f1979   Joe Perches   checkpatch: check...
2295
  	my %signatures = ();
323c1260b   Joe Perches   checkpatch: warn ...
2296

c2fdda0df   Andy Whitcroft   update checkpatch...
2297
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
2298
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
2299
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
2300
2301
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
2302

d8b077101   Joe Perches   checkpatch: exten...
2303
  	my $camelcase_file_seeded = 0;
9f3a89926   Rob Herring   checkpatch.pl: ad...
2304
  	my $checklicenseline = 1;
773647a09   Andy Whitcroft   update checkpatch...
2305
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
2306
2307
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
2308
2309
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
2310

3705ce5bc   Joe Perches   checkpatch: creat...
2311
  		push(@fixed, $rawline) if ($fix);
773647a09   Andy Whitcroft   update checkpatch...
2312
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2313
  			$setup_docs = 0;
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
2314
  			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2315
2316
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
2317
2318
  			#next;
  		}
74fd4f347   Joe Perches   checkpatch: impro...
2319
  		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
773647a09   Andy Whitcroft   update checkpatch...
2320
2321
2322
2323
2324
2325
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2326
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
2327
2328
2329
2330
2331
2332
  
  			# 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...
2333
2334
2335
2336
2337
2338
2339
  			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...
2340
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
2341
2342
2343
2344
2345
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
2346
2347
2348
2349
2350
2351
2352
2353
2354
  			}
  			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...
2355
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
2356
2357
2358
2359
2360
2361
2362
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
2363
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
2364
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
2365
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
2366
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2367
  		}
773647a09   Andy Whitcroft   update checkpatch...
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2380
2381
2382
2383
2384
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
2385
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
2386
2387
  	$realcnt = 0;
  	$linenr = 0;
194f66fc9   Joe Perches   checkpatch: add a...
2388
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2389
2390
  	foreach my $line (@lines) {
  		$linenr++;
194f66fc9   Joe Perches   checkpatch: add a...
2391
  		$fixlinenr++;
1b5539b1f   Joe Perches   checkpatch: reduc...
2392
2393
  		my $sline = $line;	#copy of $line
  		$sline =~ s/$;/ /g;	#with comments as spaces
0a920b5b6   Andy Whitcroft   add a trivial pat...
2394

c2fdda0df   Andy Whitcroft   update checkpatch...
2395
  		my $rawline = $rawlines[$linenr - 1];
6c72ffaab   Andy Whitcroft   update checkpatch...
2396

12c253abb   Joe Perches   checkpatch: impro...
2397
2398
2399
2400
2401
2402
2403
  # check if it's a mode change, rename or start of a patch
  		if (!$in_commit_log &&
  		    ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||
  		    ($line =~ /^rename (?:from|to) \S+\s*$/ ||
  		     $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {
  			$is_patch = 1;
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2404
  #extract the line range in the file after the patch is applied
e518e9a59   Joe Perches   checkpatch: emit ...
2405
  		if (!$in_commit_log &&
74fd4f347   Joe Perches   checkpatch: impro...
2406
2407
  		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
  			my $context = $4;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2408
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
2409
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2410
2411
2412
2413
2414
2415
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2416
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
2417
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
2418
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
2419
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2420
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2421
  			$suppress_statement = 0;
74fd4f347   Joe Perches   checkpatch: impro...
2422
2423
2424
2425
2426
  			if ($context =~ /\b(\w+)\s*\(/) {
  				$context_function = $1;
  			} else {
  				undef $context_function;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2427
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2428

4a0df2ef4   Andy Whitcroft   update checkpatch...
2429
2430
2431
  # 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...
2432
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2433
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
2434
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2435

4a0df2ef4   Andy Whitcroft   update checkpatch...
2436
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
2437
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2438
2439
2440
2441
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
2442
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
2443
2444
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
2445

d8aaf1214   Andy Whitcroft   update checkpatch...
2446
2447
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2448
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
2449
  		my $hunk_line = ($realcnt != 0);
6c72ffaab   Andy Whitcroft   update checkpatch...
2450
2451
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
2452

2ac73b4f6   Joe Perches   checkpatch: make ...
2453
  		my $found_file = 0;
773647a09   Andy Whitcroft   update checkpatch...
2454
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
2455
2456
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2457
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2458
  			$in_commit_log = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
2459
  			$found_file = 1;
3bf9a009f   Rabin Vincent   checkpatch: check...
2460
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
2461
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2462
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2463
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2464
2465
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
2466
2467
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2468
2469
2470
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
2471
  			}
773647a09   Andy Whitcroft   update checkpatch...
2472

c1ab33269   Andy Whitcroft   checkpatch: inclu...
2473
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2474
2475
2476
2477
  				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...
2478
  			}
2ac73b4f6   Joe Perches   checkpatch: make ...
2479
2480
  			$found_file = 1;
  		}
34d8815f9   Joe Perches   checkpatch: add -...
2481
2482
2483
2484
  #make up the handle for any error we report on this line
  		if ($showfile) {
  			$prefix = "$realfile:$realline: "
  		} elsif ($emacs) {
7d3a9f673   Joe Perches   checkpatch: repor...
2485
2486
2487
2488
2489
  			if ($file) {
  				$prefix = "$filename:$realline: ";
  			} else {
  				$prefix = "$filename:$linenr: ";
  			}
34d8815f9   Joe Perches   checkpatch: add -...
2490
  		}
2ac73b4f6   Joe Perches   checkpatch: make ...
2491
  		if ($found_file) {
85b0ee18b   Joe Perches   checkpatch: see i...
2492
2493
2494
2495
2496
  			if (is_maintained_obsolete($realfile)) {
  				WARN("OBSOLETE",
  				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.
  ");
  			}
7bd7e483c   Joe Perches   checkpatch: make ...
2497
  			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2ac73b4f6   Joe Perches   checkpatch: make ...
2498
2499
2500
2501
  				$check = 1;
  			} else {
  				$check = $check_orig;
  			}
9f3a89926   Rob Herring   checkpatch.pl: ad...
2502
  			$checklicenseline = 1;
133712a2e   Rob Herring   checkpatch: DT bi...
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
  
  			if ($realfile !~ /^MAINTAINERS/) {
  				my $last_binding_patch = $is_binding_patch;
  
  				$is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@;
  
  				if (($last_binding_patch != -1) &&
  				    ($last_binding_patch ^ $is_binding_patch)) {
  					WARN("DT_SPLIT_BINDING_PATCH",
  					     "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.txt
  ");
  				}
  			}
773647a09   Andy Whitcroft   update checkpatch...
2516
2517
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
2518
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2519

c2fdda0df   Andy Whitcroft   update checkpatch...
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2530

6c72ffaab   Andy Whitcroft   update checkpatch...
2531
  		$cnt_lines++ if ($realcnt != 0);
490b292c8   Joe Perches   checkpatch: warn ...
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
  # Verify the existence of a commit log if appropriate
  # 2 is used because a $signature is counted in $commit_log_lines
  		if ($in_commit_log) {
  			if ($line !~ /^\s*$/) {
  				$commit_log_lines++;	#could be a $signature
  			}
  		} elsif ($has_commit_log && $commit_log_lines < 2) {
  			WARN("COMMIT_MESSAGE",
  			     "Missing commit description - Add an appropriate one
  ");
  			$commit_log_lines = 2;	#warn only once
  		}
e518e9a59   Joe Perches   checkpatch: emit ...
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
  # Check if the commit log has what seems like a diff which can confuse patch
  		if ($in_commit_log && !$commit_log_has_diff &&
  		    (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
  		      $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
  		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
  		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
  			ERROR("DIFF_IN_COMMIT_MSG",
  			      "Avoid using diff content in the commit message - patch(1) might not work
  " . $herecurr);
  			$commit_log_has_diff = 1;
  		}
3bf9a009f   Rabin Vincent   checkpatch: check...
2555
2556
2557
2558
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
04db4d25d   Joe Perches   checkpatch: compl...
2559
2560
  			if ($realfile !~ m@scripts/@ &&
  			    $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2561
2562
2563
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
2564
2565
  			}
  		}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2566
2567
2568
2569
2570
2571
  # Check the patch for a From:
  		if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
  			$author = $1;
  			$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
  			$author =~ s/"//g;
  		}
201124755   Joe Perches   checkpatch: valid...
2572
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
2573
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2574
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
2575
  			$in_commit_log = 0;
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2576
2577
2578
2579
2580
2581
2582
  			if ($author ne '') {
  				my $l = $line;
  				$l =~ s/"//g;
  				if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) {
  				    $authorsignoff = 1;
  				}
  			}
201124755   Joe Perches   checkpatch: valid...
2583
  		}
e0d975b1b   Joe Perches   checkpatch: reduc...
2584
2585
2586
2587
2588
  # Check if MAINTAINERS is being updated.  If so, there's probably no need to
  # emit the "does MAINTAINERS need updating?" message on file add/move/delete
  		if ($line =~ /^\s*MAINTAINERS\s*\|/) {
  			$reported_maintainer_file = 1;
  		}
201124755   Joe Perches   checkpatch: valid...
2589
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
2590
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
2591
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
2592
2593
2594
2595
2596
  			my $space_before = $1;
  			my $sign_off = $2;
  			my $space_after = $3;
  			my $email = $4;
  			my $ucfirst_sign_off = ucfirst(lc($sign_off));
ce0338df3   Joe Perches   checkpatch: test ...
2597
2598
2599
2600
2601
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
2602
  			if (defined $space_before && $space_before ne "") {
3705ce5bc   Joe Perches   checkpatch: creat...
2603
2604
2605
2606
  				if (WARN("BAD_SIGN_OFF",
  					 "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2607
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2608
2609
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2610
2611
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5bc   Joe Perches   checkpatch: creat...
2612
2613
2614
2615
  				if (WARN("BAD_SIGN_OFF",
  					 "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2616
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2617
2618
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2619
2620
  			}
  			if (!defined $space_after || $space_after ne " ") {
3705ce5bc   Joe Perches   checkpatch: creat...
2621
2622
2623
2624
  				if (WARN("BAD_SIGN_OFF",
  					 "Use a single space after $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2625
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2626
2627
  					    "$ucfirst_sign_off $email";
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2628
  			}
201124755   Joe Perches   checkpatch: valid...
2629
2630
2631
2632
  
  			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...
2633
2634
2635
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2636
2637
2638
2639
2640
2641
2642
2643
2644
  			} 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...
2645
2646
2647
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2648
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2649
  			}
7e51f1979   Joe Perches   checkpatch: check...
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
  
  # Check for duplicate signatures
  			my $sig_nospace = $line;
  			$sig_nospace =~ s/\s//g;
  			$sig_nospace = lc($sig_nospace);
  			if (defined $signatures{$sig_nospace}) {
  				WARN("BAD_SIGN_OFF",
  				     "Duplicate signature
  " . $herecurr);
  			} else {
  				$signatures{$sig_nospace} = 1;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2662
  		}
a2fe16b9d   Joe Perches   checkpatch: try t...
2663
2664
2665
2666
2667
2668
2669
  # Check email subject for common tools that don't need to be mentioned
  		if ($in_header_lines &&
  		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
  			WARN("EMAIL_SUBJECT",
  			     "A patch subject line should describe the change not the tool that found it
  " . $herecurr);
  		}
7ebd05ef1   Christopher Covington   checkpatch.pl: ad...
2670
2671
2672
2673
2674
2675
  # Check for unwanted Gerrit info
  		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
  			ERROR("GERRIT_CHANGE_ID",
  			      "Remove Gerrit Change-Id's before submitting upstream.
  " . $herecurr);
  		}
369c8dd39   Joe Perches   checkpatch: impro...
2676
2677
2678
2679
2680
2681
2682
2683
2684
  # Check if the commit log is in a possible stack dump
  		if ($in_commit_log && !$commit_log_possible_stack_dump &&
  		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
  		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
  					# timestamp
  		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
  					# stack dump address
  			$commit_log_possible_stack_dump = 1;
  		}
2a076f40d   Joe Perches   checkpatch, Submi...
2685
2686
  # Check for line lengths > 75 in commit log, warn once
  		if ($in_commit_log && !$commit_log_long_line &&
369c8dd39   Joe Perches   checkpatch: impro...
2687
2688
2689
2690
2691
2692
2693
2694
  		    length($line) > 75 &&
  		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
  					# file delta changes
  		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
  					# filename then :
  		      $line =~ /^\s*(?:Fixes:|Link:)/i ||
  					# A Fixes: or Link: line
  		      $commit_log_possible_stack_dump)) {
2a076f40d   Joe Perches   checkpatch, Submi...
2695
2696
2697
2698
2699
  			WARN("COMMIT_LOG_LONG_LINE",
  			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)
  " . $herecurr);
  			$commit_log_long_line = 1;
  		}
bf4daf12a   Joe Perches   checkpatch: avoid...
2700
  # Reset possible stack dump if a blank line is found
369c8dd39   Joe Perches   checkpatch: impro...
2701
2702
2703
2704
  		if ($in_commit_log && $commit_log_possible_stack_dump &&
  		    $line =~ /^\s*$/) {
  			$commit_log_possible_stack_dump = 0;
  		}
bf4daf12a   Joe Perches   checkpatch: avoid...
2705

0d7835fca   Joe Perches   checkpatch: updat...
2706
  # Check for git id commit length and improperly formed commit descriptions
369c8dd39   Joe Perches   checkpatch: impro...
2707
  		if ($in_commit_log && !$commit_log_possible_stack_dump &&
aab38f516   Joe Perches   checkpatch: yet a...
2708
  		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
e882dbfc2   Wei Wang   checkpatch: speci...
2709
  		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
fe043ea12   Joe Perches   checkpatch: warn ...
2710
  		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
aab38f516   Joe Perches   checkpatch: yet a...
2711
  		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
369c8dd39   Joe Perches   checkpatch: impro...
2712
2713
  		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
  		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
fe043ea12   Joe Perches   checkpatch: warn ...
2714
2715
  			my $init_char = "c";
  			my $orig_commit = "";
0d7835fca   Joe Perches   checkpatch: updat...
2716
2717
2718
2719
2720
  			my $short = 1;
  			my $long = 0;
  			my $case = 1;
  			my $space = 1;
  			my $hasdesc = 0;
19c146a64   Joe Perches   checkpatch: make ...
2721
  			my $hasparens = 0;
0d7835fca   Joe Perches   checkpatch: updat...
2722
2723
2724
  			my $id = '0123456789ab';
  			my $orig_desc = "commit description";
  			my $description = "";
fe043ea12   Joe Perches   checkpatch: warn ...
2725
2726
2727
2728
2729
2730
  			if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
  				$init_char = $1;
  				$orig_commit = lc($2);
  			} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
  				$orig_commit = lc($1);
  			}
0d7835fca   Joe Perches   checkpatch: updat...
2731
2732
2733
2734
2735
2736
  			$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
  			$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
  			$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
  			$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
  			if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
  				$orig_desc = $1;
19c146a64   Joe Perches   checkpatch: make ...
2737
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2738
2739
2740
2741
  			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
  				 defined $rawlines[$linenr] &&
  				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
  				$orig_desc = $1;
19c146a64   Joe Perches   checkpatch: make ...
2742
  				$hasparens = 1;
b671fde05   Joe Perches   checkpatch: add a...
2743
2744
2745
2746
2747
2748
2749
  			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
  				 defined $rawlines[$linenr] &&
  				 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
  				$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
  				$orig_desc = $1;
  				$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
  				$orig_desc .= " " . $1;
19c146a64   Joe Perches   checkpatch: make ...
2750
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2751
2752
2753
2754
  			}
  
  			($id, $description) = git_commit_info($orig_commit,
  							      $id, $orig_desc);
948b133a1   Heinrich Schuchardt   checkpatch: remov...
2755
2756
  			if (defined($id) &&
  			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
0d7835fca   Joe Perches   checkpatch: updat...
2757
2758
2759
2760
  				ERROR("GIT_COMMIT_ID",
  				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'
  " . $herecurr);
  			}
d311cd445   Joe Perches   checkpatch: add t...
2761
  		}
13f1937ef   Joe Perches   checkpatch: emit ...
2762
2763
2764
2765
2766
2767
  # Check for added, moved or deleted files
  		if (!$reported_maintainer_file && !$in_commit_log &&
  		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
  		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
  		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
  		      (defined($1) || defined($2))))) {
a82603a83   Andrew Jeffery   checkpatch: don't...
2768
  			$is_patch = 1;
13f1937ef   Joe Perches   checkpatch: emit ...
2769
2770
2771
2772
2773
  			$reported_maintainer_file = 1;
  			WARN("FILE_PATH_CHANGES",
  			     "added, moved or deleted file(s), does MAINTAINERS need updating?
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2774
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
2775
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2776
2777
2778
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
2779
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2780
2781
2782
2783
  		}
  
  # 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...
2784
2785
2786
2787
2788
2789
2790
  		    $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 ...
2791
2792
2793
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
2794
  		}
15662b3e8   Joe Perches   checkpatch: add a...
2795
2796
2797
  # 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 =~ /^$/ &&
eb3a58de3   Joe Perches   checkpatch: allow...
2798
2799
  		    !($rawline =~ /^\s+(?:\S|$)/ ||
  		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
15662b3e8   Joe Perches   checkpatch: add a...
2800
2801
  			$in_header_lines = 0;
  			$in_commit_log = 1;
ed43c4e58   Allen Hubbe   checkpatch: check...
2802
  			$has_commit_log = 1;
15662b3e8   Joe Perches   checkpatch: add a...
2803
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
2804
2805
2806
2807
2808
2809
2810
2811
2812
  # Check if there is UTF-8 in a commit log when a mail header has explicitly
  # declined it, i.e defined some charset where it is missing.
  		if ($in_header_lines &&
  		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
  		    $1 !~ /utf-8/i) {
  			$non_utf8_charset = 1;
  		}
  
  		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
15662b3e8   Joe Perches   checkpatch: add a...
2813
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
2814
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
2815
2816
2817
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
d6430f718   Joe Perches   checkpatch: don't...
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
  # Check for absolute kernel paths in commit message
  		if ($tree && $in_commit_log) {
  			while ($line =~ m{(?:^|\s)(/\S*)}g) {
  				my $file = $1;
  
  				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
  				    check_absolute_file($1, $herecurr)) {
  					#
  				} else {
  					check_absolute_file($file, $herecurr);
  				}
  			}
  		}
66b47b4a9   Kees Cook   checkpatch: look ...
2831
  # Check for various typo / spelling mistakes
66d7a382c   Joe Perches   checkpatch: add s...
2832
2833
  		if (defined($misspellings) &&
  		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
ebfd7d623   Joe Perches   checkpatch: add o...
2834
  			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
66b47b4a9   Kees Cook   checkpatch: look ...
2835
2836
2837
2838
  				my $typo = $1;
  				my $typo_fix = $spelling_fix{lc($typo)};
  				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
  				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
0675a8fbd   Jean Delvare   checkpatch: renam...
2839
2840
2841
2842
2843
  				my $msg_level = \&WARN;
  				$msg_level = \&CHK if ($file);
  				if (&{$msg_level}("TYPO_SPELLING",
  						  "'$typo' may be misspelled - perhaps '$typo_fix'?
  " . $herecurr) &&
66b47b4a9   Kees Cook   checkpatch: look ...
2844
2845
2846
2847
2848
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
  				}
  			}
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
2849
2850
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2851

0a920b5b6   Andy Whitcroft   add a trivial pat...
2852
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2853
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2854
2855
2856
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d5e616fc1   Joe Perches   checkpatch: add a...
2857
2858
2859
2860
  			if (ERROR("DOS_LINE_ENDINGS",
  				  "DOS line endings
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2861
  				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
2862
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2863
2864
2865
2866
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2867
2868
2869
2870
  			if (ERROR("TRAILING_WHITESPACE",
  				  "trailing whitespace
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2871
  				$fixed[$fixlinenr] =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
2872
  			}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2873
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2874
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2875

4783f894d   Josh Triplett   checkpatch.pl: ch...
2876
  # Check for FSF mailing addresses.
109d8cb20   Alexander Duyck   checkpatch: only ...
2877
  		if ($rawline =~ /\bwrite to the Free/i ||
1bde561e4   Matthew Wilcox   checkpatch: add a...
2878
  		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
3e2232f2d   Joe Perches   checkpatch: updat...
2879
2880
  		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
  		    $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894d   Josh Triplett   checkpatch.pl: ch...
2881
2882
2883
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
0675a8fbd   Jean Delvare   checkpatch: renam...
2884
2885
2886
2887
2888
  			my $msg_level = \&ERROR;
  			$msg_level = \&CHK if ($file);
  			&{$msg_level}("FSF_MAILING_ADDRESS",
  				      "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.
  " . $herevet)
4783f894d   Josh Triplett   checkpatch.pl: ch...
2889
  		}
3354957a4   Andi Kleen   checkpatch: add c...
2890
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2891
2892
  # 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...
2893
  		if ($realfile =~ /Kconfig/ &&
678ae162d   Ulf Magnusson   checkpatch: kconf...
2894
2895
2896
2897
  		    # 'choice' is usually the last thing on the line (though
  		    # Kconfig supports named choices), so use a word boundary
  		    # (\b) rather than a whitespace character (\s)
  		    $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
3354957a4   Andi Kleen   checkpatch: add c...
2898
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2899
2900
2901
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
2902
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2903
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
2904
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2905
2906
2907
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2908
2909
  
  				next if ($f =~ /^-/);
8d73e0e7d   Joe Perches   checkpatch: quiet...
2910
  				last if (!$file && $f =~ /^\@\@/);
a13858033   Andy Whitcroft   checkpatch: only ...
2911

86adf1a07   Ulf Magnusson   checkpatch: kconf...
2912
  				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2913
  					$is_start = 1;
84af7a619   Ulf Magnusson   checkpatch: kconf...
2914
2915
2916
2917
2918
2919
  				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) {
  					if ($lines[$ln - 1] =~ "---help---") {
  						WARN("CONFIG_DESCRIPTION",
  						     "prefer 'help' over '---help---' for new help texts
  " . $herecurr);
  					}
a13858033   Andy Whitcroft   checkpatch: only ...
2920
2921
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2922
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
2923
2924
2925
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
678ae162d   Ulf Magnusson   checkpatch: kconf...
2926
2927
2928
2929
2930
2931
2932
  
  				# This only checks context lines in the patch
  				# and so hopefully shouldn't trigger false
  				# positives, even though some of these are
  				# common words in help texts
  				if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
  						  if|endif|menu|endmenu|source)\b/x) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2933
2934
2935
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
2936
2937
  				$length++;
  			}
56193274e   Vadim Bendebury   checkpatch: allow...
2938
2939
2940
2941
2942
  			if ($is_start && $is_end && $length < $min_conf_desc_length) {
  				WARN("CONFIG_DESCRIPTION",
  				     "please write a paragraph that describes the config symbol fully
  " . $herecurr);
  			}
a13858033   Andy Whitcroft   checkpatch: only ...
2943
2944
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
2945
  		}
628f91a28   Joe Perches   checkpatch: warn ...
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
  # check for MAINTAINERS entries that don't have the right form
  		if ($realfile =~ /^MAINTAINERS$/ &&
  		    $rawline =~ /^\+[A-Z]:/ &&
  		    $rawline !~ /^\+[A-Z]:\t\S/) {
  			if (WARN("MAINTAINERS_STYLE",
  				 "MAINTAINERS entries use one tab after TYPE:
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
  			}
  		}
327953e9a   Christoph Jaeger   checkpatch: add c...
2957
2958
2959
2960
2961
2962
2963
  # discourage the use of boolean for type definition attributes of Kconfig options
  		if ($realfile =~ /Kconfig/ &&
  		    $line =~ /^\+\s*\bboolean\b/) {
  			WARN("CONFIG_TYPE_BOOLEAN",
  			     "Use of boolean is deprecated, please use bool instead.
  " . $herecurr);
  		}
c68e58783   Arnaud Lacombe   script/checkpatch...
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
  		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});
  		}
bff5da433   Rob Herring   checkpatch: add D...
2978
  # check for DT compatible documentation
7dd05b38e   Florian Vaussard   checkpatch: check...
2979
2980
2981
  		if (defined $root &&
  			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
  			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
bff5da433   Rob Herring   checkpatch: add D...
2982
  			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
cc93319b5   Florian Vaussard   checkpatch: impro...
2983
2984
  			my $dt_path = $root . "/Documentation/devicetree/bindings/";
  			my $vp_file = $dt_path . "vendor-prefixes.txt";
bff5da433   Rob Herring   checkpatch: add D...
2985
2986
  			foreach my $compat (@compats) {
  				my $compat2 = $compat;
185d566bc   Rob Herring   checkpatch: fix w...
2987
2988
2989
2990
  				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
  				my $compat3 = $compat;
  				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
  				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;
bff5da433   Rob Herring   checkpatch: add D...
2991
2992
2993
2994
2995
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
  					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path
  " . $herecurr);
  				}
4fbf32a69   Florian Vaussard   checkpatch: fix s...
2996
2997
  				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
  				my $vendor = $1;
cc93319b5   Florian Vaussard   checkpatch: impro...
2998
  				`grep -Eq "^$vendor\\b" $vp_file`;
bff5da433   Rob Herring   checkpatch: add D...
2999
3000
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
cc93319b5   Florian Vaussard   checkpatch: impro...
3001
3002
  					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file
  " . $herecurr);
bff5da433   Rob Herring   checkpatch: add D...
3003
3004
3005
  				}
  			}
  		}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
  # check for using SPDX license tag at beginning of files
  		if ($realline == $checklicenseline) {
  			if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
  				$checklicenseline = 2;
  			} elsif ($rawline =~ /^\+/) {
  				my $comment = "";
  				if ($realfile =~ /\.(h|s|S)$/) {
  					$comment = '/*';
  				} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
  					$comment = '//';
  				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
  					$comment = '#';
  				} elsif ($realfile =~ /\.rst$/) {
  					$comment = '..';
  				}
  
  				if ($comment !~ /^$/ &&
  				    $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {
3b6e8ac9e   Joe Perches   checkpatch: valid...
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
  					 WARN("SPDX_LICENSE_TAG",
  					      "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline
  " . $herecurr);
  				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
  					 my $spdx_license = $1;
  					 if (!is_SPDX_License_valid($spdx_license)) {
  						  WARN("SPDX_LICENSE_TAG",
  						       "'$spdx_license' is not supported in LICENSES/...
  " . $herecurr);
  					 }
9f3a89926   Rob Herring   checkpatch.pl: ad...
3034
3035
3036
  				}
  			}
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
3037
  # check we are in a valid source file if not then ignore this hunk
d6430f718   Joe Perches   checkpatch: don't...
3038
  		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
5368df20f   Andy Whitcroft   checkpatch: check...
3039

47e0c88b3   Joe Perches   checkpatch: categ...
3040
3041
3042
3043
3044
3045
  # line length limit (with some exclusions)
  #
  # There are a few types of lines that may extend beyond $max_line_length:
  #	logging functions like pr_info that end in a string
  #	lines with a single string
  #	#defines that are a single string
2e4bbbc55   Andreas Brauchli   checkpatch: allow...
3046
  #	lines with an RFC3986 like URL
47e0c88b3   Joe Perches   checkpatch: categ...
3047
3048
  #
  # There are 3 different line length message types:
ab1ecabf4   Jean Delvare   checkpatch: fix t...
3049
  # LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
47e0c88b3   Joe Perches   checkpatch: categ...
3050
3051
3052
3053
3054
  # LONG_LINE_STRING	a string starts before but extends beyond $max_line_length
  # LONG_LINE		all other lines longer than $max_line_length
  #
  # if LONG_LINE is ignored, the other 2 types are also ignored
  #
b4749e96a   Joe Perches   checkpatch: fix l...
3055
  		if ($line =~ /^\+/ && $length > $max_line_length) {
47e0c88b3   Joe Perches   checkpatch: categ...
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
  			my $msg_type = "LONG_LINE";
  
  			# Check the allowed long line types first
  
  			# logging functions that end in a string that starts
  			# before $max_line_length
  			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
  			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
  				$msg_type = "";
  
  			# lines with only strings (w/ possible termination)
  			# #defines with only strings
  			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
  				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
  				$msg_type = "";
cc147506b   Joe Perches   checkpatch: allow...
3071
3072
3073
  			# More special cases
  			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
  				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
d560a5f8a   Joe Perches   checkpatch: skip ...
3074
  				$msg_type = "";
2e4bbbc55   Andreas Brauchli   checkpatch: allow...
3075
3076
3077
  			# URL ($rawline is used in case the URL is in a comment)
  			} elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
  				$msg_type = "";
47e0c88b3   Joe Perches   checkpatch: categ...
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
  			# Otherwise set the alternate message types
  
  			# a comment starts before $max_line_length
  			} elsif ($line =~ /($;[\s$;]*)$/ &&
  				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
  				$msg_type = "LONG_LINE_COMMENT"
  
  			# a quoted string starts before $max_line_length
  			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
  				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
  				$msg_type = "LONG_LINE_STRING"
  			}
  
  			if ($msg_type ne "" &&
  			    (show_type("LONG_LINE") || show_type($msg_type))) {
  				WARN($msg_type,
  				     "line over $max_line_length characters
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3097
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
3098
3099
  # 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...
3100
3101
3102
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
3103
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3104
  # check we are in a valid source file C or perl if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
3105
  		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3106
3107
3108
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
3109
3110
3111
3112
3113
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3114
  			$rpt_cleaners = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3115
3116
3117
3118
  			if (ERROR("CODE_INDENT",
  				  "code indent should use tabs where possible
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3119
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3120
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3121
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3122
3123
3124
3125
3126
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3127
3128
3129
3130
  			if (WARN("SPACE_BEFORE_TAB",
  				"please, no space before tabs
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3131
  				while ($fixed[$fixlinenr] =~
d2207ccbc   Joe Perches   checkpatch: remov...
3132
  					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc9   Joe Perches   checkpatch: add a...
3133
  				while ($fixed[$fixlinenr] =~
c76f4cb3d   Joe Perches   checkpatch: impro...
3134
  					   s/(^\+.*) +\t/$1\t/) {}
3705ce5bc   Joe Perches   checkpatch: creat...
3135
  			}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3136
  		}
6a487211e   Joe Perches   checkpatch: add t...
3137
3138
3139
3140
3141
3142
3143
  
  # check for assignments on the start of a line
  		if ($sline =~ /^\+\s+($Assignment)[^=]/) {
  			CHK("ASSIGNMENT_CONTINUATIONS",
  			    "Assignment operator '$1' should be on the previous line
  " . $hereprev);
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3144

d1fe9c099   Joe Perches   checkpatch: add s...
3145
3146
3147
3148
3149
3150
  # check for && or || at the start of a line
  		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
  			CHK("LOGICAL_CONTINUATIONS",
  			    "Logical continuations should be on the previous line
  " . $hereprev);
  		}
a91e8994f   Joe Perches   checkpatch: add t...
3151
  # check indentation starts on a tab stop
5b57980de   Joe Perches   checkpatch: impro...
3152
  		if ($perl_version_ok &&
bd49111f7   Joe Perches   checkpatch: avoid...
3153
  		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
a91e8994f   Joe Perches   checkpatch: add t...
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
  			my $indent = length($1);
  			if ($indent % 8) {
  				if (WARN("TABSTOP",
  					 "Statements should start on a tabstop
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
  				}
  			}
  		}
d1fe9c099   Joe Perches   checkpatch: add s...
3164
  # check multi-line statement indentation matches previous line
5b57980de   Joe Perches   checkpatch: impro...
3165
  		if ($perl_version_ok &&
fd71f6326   Joe Perches   checkpatch: impro...
3166
  		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
d1fe9c099   Joe Perches   checkpatch: add s...
3167
3168
3169
3170
3171
3172
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
3173
3174
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
3175
3176
3177
3178
3179
3180
3181
3182
  
  				my $goodtabindent = $oldindent .
  					"\t" x ($pos / 8) .
  					" "  x ($pos % 8);
  				my $goodspaceindent = $oldindent . " "  x $pos;
  
  				if ($newindent ne $goodtabindent &&
  				    $newindent ne $goodspaceindent) {
3705ce5bc   Joe Perches   checkpatch: creat...
3183
3184
3185
3186
3187
  
  					if (CHK("PARENTHESIS_ALIGNMENT",
  						"Alignment should match open parenthesis
  " . $hereprev) &&
  					    $fix && $line =~ /^\+/) {
194f66fc9   Joe Perches   checkpatch: add a...
3188
  						$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3189
3190
  						    s/^\+[ \t]*/\+$goodtabindent/;
  					}
d1fe9c099   Joe Perches   checkpatch: add s...
3191
3192
3193
  				}
  			}
  		}
6ab3a9701   Joe Perches   checkpatch: impro...
3194
3195
3196
3197
3198
3199
3200
3201
3202
  # check for space after cast like "(int) foo" or "(struct foo) bar"
  # avoid checking a few false positives:
  #   "sizeof(<type>)" or "__alignof__(<type>)"
  #   function pointer declarations like "(*foo)(int) = bar;"
  #   structure definitions like "(struct foo) { 0 };"
  #   multiline macros that define functions
  #   known attributes or the __attribute__ keyword
  		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
  		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3203
  			if (CHK("SPACING",
f27c95db1   Joe Perches   checkpatch: impro...
3204
3205
  				"No space is necessary after a cast
  " . $herecurr) &&
3705ce5bc   Joe Perches   checkpatch: creat...
3206
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3207
  				$fixed[$fixlinenr] =~
f27c95db1   Joe Perches   checkpatch: impro...
3208
  				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5bc   Joe Perches   checkpatch: creat...
3209
  			}
aad4f6149   Joe Perches   checkpatch: add -...
3210
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3211
3212
  # Block comment styles
  # Networking with an initial /*
058806007   Joe Perches   checkpatch: check...
3213
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd61   Joe Perches   checkpatch: impro...
3214
  		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c6   Joe Perches   checkpatch: ignor...
3215
3216
  		    $rawline =~ /^\+[ \t]*\*/ &&
  		    $realline > 2) {
058806007   Joe Perches   checkpatch: check...
3217
3218
3219
3220
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments don't use an empty /* line, use /* Comment...
  " . $hereprev);
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3221
3222
3223
  # Block comments use * on subsequent lines
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
  		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
a605e32eb   Joe Perches   checkpatch: warn ...
3224
  		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
61135e966   Joe Perches   checkpatch: fix n...
3225
  		    $rawline =~ /^\+/ &&			#line is new
a605e32eb   Joe Perches   checkpatch: warn ...
3226
  		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
86406b1cb   Joe Perches   checkpatch: alway...
3227
3228
3229
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use * on subsequent lines
  " . $hereprev);
a605e32eb   Joe Perches   checkpatch: warn ...
3230
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3231
3232
  # Block comments use */ on trailing lines
  		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
c24f9f195   Joe Perches   checkpatch: impro...
3233
3234
3235
  		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
  		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
  		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
86406b1cb   Joe Perches   checkpatch: alway...
3236
3237
3238
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use a trailing */ on a separate line
  " . $herecurr);
058806007   Joe Perches   checkpatch: check...
3239
  		}
08eb9b801   Joe Perches   checkpatch: test ...
3240
3241
  # Block comment * alignment
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
af207524a   Joe Perches   checkpatch: impro...
3242
3243
3244
  		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
  		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
  		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
08eb9b801   Joe Perches   checkpatch: test ...
3245
  		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
af207524a   Joe Perches   checkpatch: impro...
3246
3247
  		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
  			my $oldindent;
08eb9b801   Joe Perches   checkpatch: test ...
3248
  			$prevrawline =~ m@^\+([ \t]*/?)\*@;
af207524a   Joe Perches   checkpatch: impro...
3249
3250
3251
3252
3253
3254
  			if (defined($1)) {
  				$oldindent = expand_tabs($1);
  			} else {
  				$prevrawline =~ m@^\+(.*/?)\*@;
  				$oldindent = expand_tabs($1);
  			}
08eb9b801   Joe Perches   checkpatch: test ...
3255
3256
  			$rawline =~ m@^\+([ \t]*)\*@;
  			my $newindent = $1;
08eb9b801   Joe Perches   checkpatch: test ...
3257
  			$newindent = expand_tabs($newindent);
af207524a   Joe Perches   checkpatch: impro...
3258
  			if (length($oldindent) ne length($newindent)) {
08eb9b801   Joe Perches   checkpatch: test ...
3259
3260
3261
3262
3263
  				WARN("BLOCK_COMMENT_STYLE",
  				     "Block comments should align the * on each line
  " . $hereprev);
  			}
  		}
7f6191914   Joe Perches   checkpatch: add t...
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
  # check for missing blank lines after struct/union declarations
  # with exceptions for various attributes and macros
  		if ($prevline =~ /^[\+ ]};?\s*$/ &&
  		    $line =~ /^\+/ &&
  		    !($line =~ /^\+\s*$/ ||
  		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
  		      $line =~ /^\+\s*MODULE_/i ||
  		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
  		      $line =~ /^\+[a-z_]*init/ ||
  		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
  		      $line =~ /^\+\s*DECLARE/ ||
0bc989ffc   Masahiro Yamada   checkpatch: do no...
3275
  		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
7f6191914   Joe Perches   checkpatch: add t...
3276
  		      $line =~ /^\+\s*__setup/)) {
d752fcc88   Joe Perches   checkpatch: add a...
3277
3278
3279
3280
  			if (CHK("LINE_SPACING",
  				"Please use a blank line after function/struct/union/enum declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3281
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3282
  			}
7f6191914   Joe Perches   checkpatch: add t...
3283
  		}
365dd4eaa   Joe Perches   checkpatch: add a...
3284
3285
3286
3287
  # check for multiple consecutive blank lines
  		if ($prevline =~ /^[\+ ]\s*$/ &&
  		    $line =~ /^\+\s*$/ &&
  		    $last_blank_line != ($linenr - 1)) {
d752fcc88   Joe Perches   checkpatch: add a...
3288
3289
3290
3291
  			if (CHK("LINE_SPACING",
  				"Please don't use multiple blank lines
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3292
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3293
  			}
365dd4eaa   Joe Perches   checkpatch: add a...
3294
3295
  			$last_blank_line = $linenr;
  		}
3b617e3b8   Joe Perches   checkpatch: net a...
3296
  # check for missing blank lines after declarations
3f7bac031   Joe Perches   checkpatch: alway...
3297
3298
3299
  		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
  			# actual declarations
  		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
3300
3301
  			# function pointer declarations
  		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
  			# foo bar; where foo is some local typedef or #define
  		     $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
  			# known declaration macros
  		     $prevline =~ /^\+\s+$declaration_macros/) &&
  			# for "else if" which can look like "$Ident $Ident"
  		    !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
  			# other possible extensions of declaration lines
  		      $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
  			# not starting a section or a macro "\" extended line
  		      $prevline =~ /(?:\{\s*|\\)$/) &&
  			# looks like a declaration
  		    !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
3314
3315
  			# function pointer declarations
  		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3316
3317
3318
3319
3320
  			# foo bar; where foo is some local typedef or #define
  		      $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
  			# known declaration macros
  		      $sline =~ /^\+\s+$declaration_macros/ ||
  			# start of struct or union or enum
328b5f417   Joe Perches   checkpatch: add o...
3321
  		      $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3322
3323
3324
3325
3326
3327
3328
3329
  			# start or end of block or continuation of declaration
  		      $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
  			# bitfield continuation
  		      $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
  			# other possible extensions of declaration lines
  		      $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
  			# indentation of previous and current line are the same
  		    (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
d752fcc88   Joe Perches   checkpatch: add a...
3330
3331
3332
3333
  			if (WARN("LINE_SPACING",
  				 "Missing a blank line after declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3334
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3335
  			}
3b617e3b8   Joe Perches   checkpatch: net a...
3336
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3337
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
3338
3339
3340
3341
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
3705ce5bc   Joe Perches   checkpatch: creat...
3342
  		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3343
3344
3345
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3346
3347
3348
3349
  			if (WARN("LEADING_SPACE",
  				 "please, no spaces at the start of a line
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3350
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3351
  			}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3352
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3353
3354
  # check we are in a valid C source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c)$/);
5751a24ed   Joe Perches   checkpatch: add -...
3355
3356
3357
3358
3359
3360
  # check for unusual line ending [ or (
  		if ($line =~ /^\+.*([\[\(])\s*$/) {
  			CHK("OPEN_ENDED_LINE",
  			    "Lines should not end with a '$1'
  " . $herecurr);
  		}
4dbed76f2   Joe Perches   checkpatch: impro...
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
  # check if this appears to be the start function declaration, save the name
  		if ($sline =~ /^\+\{\s*$/ &&
  		    $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
  			$context_function = $1;
  		}
  
  # check if this appears to be the end of function declaration
  		if ($sline =~ /^\+\}\s*$/) {
  			undef $context_function;
  		}
032a4c0f9   Joe Perches   checkpatch: warn ...
3371
  # check indentation of any line with a bare else
840080a08   Joe Perches   checkpatch: add e...
3372
  # (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f9   Joe Perches   checkpatch: warn ...
3373
3374
3375
  # if the previous line is a break or return and is indented 1 tab more...
  		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
  			my $tabs = length($1) + 1;
840080a08   Joe Perches   checkpatch: add e...
3376
3377
3378
3379
  			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
  			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
  			     defined $lines[$linenr] &&
  			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
032a4c0f9   Joe Perches   checkpatch: warn ...
3380
3381
3382
3383
3384
  				WARN("UNNECESSARY_ELSE",
  				     "else is not generally useful after a break or return
  " . $hereprev);
  			}
  		}
c00df19a5   Joe Perches   checkpatch: warn ...
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
  # check indentation of a line with a break;
  # if the previous line is a goto or return and is indented the same # of tabs
  		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
  			my $tabs = $1;
  			if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
  				WARN("UNNECESSARY_BREAK",
  				     "break is not useful after a goto or return
  " . $hereprev);
  			}
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
3395
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
3396
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3397
3398
3399
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
3400
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3401

56e77d709   Joe Perches   checkpatch: warn ...
3402
3403
3404
3405
3406
3407
  # check for old HOTPLUG __dev<foo> section markings
  		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
  			WARN("HOTPLUG_SECTION",
  			     "Using $1 is unnecessary
  " . $herecurr);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3408
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3409
3410
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3411
3412
  #print "LINE<$line>
  ";
ca8198640   Joe Perches   checkpatch: fix s...
3413
  		if ($linenr > $suppress_statement &&
1b5539b1f   Joe Perches   checkpatch: reduc...
3414
  		    $realcnt && $sline =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
3415
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
3416
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
3417
3418
3419
3420
3421
3422
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
  #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...
3434

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3435
3436
3437
3438
3439
3440
3441
  			# 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...
3442
3443
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
3444

c2fdda0df   Andy Whitcroft   update checkpatch...
3445
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
3446
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3447
3448
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
3449
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3450

463f28648   Andy Whitcroft   checkpatch: possi...
3451
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3452
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
3453
  			} 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...
3454
3455
3456
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3457
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
3458
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3459
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
3460
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3461
3462
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
3463
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3464
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3465
3466
3467
3468
3469
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
3470
  			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...
3471
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
3472

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
3480
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3481
3482
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3483
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3484

9c0ca6f9a   Andy Whitcroft   update checkpatch...
3485
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3486
3487
3488
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
3489

653d4876b   Andy Whitcroft   update checkpatch...
3490
3491
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
  		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...
3510
3511
3512
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
3513
3514
3515
3516
3517
  			}
  		}
  
  # 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
0fe3dc2bc   Joe Perches   checkpatch: add f...
3518
  		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a09   Andy Whitcroft   update checkpatch...
3519
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3520
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
3521
3522
3523
3524
3525
3526
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3527
3528
3529
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
3530
3531
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
3532

548596d52   Andy Whitcroft   checkpatch: trail...
3533
3534
3535
3536
3537
3538
  			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...
3539
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
3540
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
3541

53210168f   Andy Whitcroft   checkpatch: tough...
3542
3543
3544
3545
3546
3547
3548
  			#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...
3549

d752fcc88   Joe Perches   checkpatch: add a...
3550
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3551
3552
3553
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3554
3555
3556
3557
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
3558
  			}
773647a09   Andy Whitcroft   update checkpatch...
3559
3560
3561
3562
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3563
3564
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3565
3566
3567
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3568
3569
3570
3571
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3572
3573
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
3574
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3575
  # Check relative indent for conditionals and blocks.
f6950a735   Joe Perches   checkpatch: impro...
3576
  		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3577
3578
3579
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3580
3581
3582
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
9f5af480f   Joe Perches   checkpatch: impro...
3583
3584
3585
  			# remove inline comments
  			$s =~ s/$;/ /g;
  			$c =~ s/$;/ /g;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3586
3587
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
3588
3589
3590
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3591

9f5af480f   Joe Perches   checkpatch: impro...
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
  			# 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;
  			while ($s =~ /
  \s+\\
  /) {
  				$cond_lines += $s =~ s/
  \s+\\
  /
  /g;
  			}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
  			# 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...
3618
3619
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
  				$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...
3630
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
3631
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3632
3633
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
3634
3635
3636
3637
3638
  				# 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...
3639
3640
3641
3642
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
3643
3644
3645
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3646
3647
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
3648
3649
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
3650
3651
3652
3653
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3654
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
  			}
  
  			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...
3670
3671
  			#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...
3672

9f5af480f   Joe Perches   checkpatch: impro...
3673
3674
3675
  			if ($check && $s ne '' &&
  			    (($sindent % 8) != 0 ||
  			     ($sindent < $indent) ||
f6950a735   Joe Perches   checkpatch: impro...
3676
3677
  			     ($sindent == $indent &&
  			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
9f5af480f   Joe Perches   checkpatch: impro...
3678
  			     ($sindent > $indent + 8))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3679
3680
3681
3682
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3683
3684
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3685
3686
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
3687
3688
3689
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
3690
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
3691
3692
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
3693
3694
3695
3696
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
3697
3698
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
3699
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3700
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
3701
  #ignore lines not being added
3705ce5bc   Joe Perches   checkpatch: creat...
3702
  		next if ($line =~ /^[^\+]/);
00df344fd   Andy Whitcroft   update checkpatch...
3703

11ca40a0f   Joe Perches   checkpatch: avoid...
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
  # check for dereferences that span multiple lines
  		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
  		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
  			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
  			my $ref = $1;
  			$line =~ /^.\s*($Lval)/;
  			$ref .= $1;
  			$ref =~ s/\s//g;
  			WARN("MULTILINE_DEREFERENCE",
  			     "Avoid multiple line dereference - prefer '$ref'
  " . $hereprev);
  		}
a1ce18e4f   Joe Perches   checkpatch: warn ...
3716
  # check for declarations of signed or unsigned without int
c84471157   Joe Perches   checkpatch: impro...
3717
  		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
3718
3719
  			my $type = $1;
  			my $var = $2;
207a8e846   Joe Perches   checkpatch: impro...
3720
3721
  			$var = "" if (!defined $var);
  			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
  				my $sign = $1;
  				my $pointer = $2;
  
  				$pointer = "" if (!defined $pointer);
  
  				if (WARN("UNSPECIFIED_INT",
  					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'
  " . $herecurr) &&
  				    $fix) {
  					my $decl = trim($sign) . " int ";
207a8e846   Joe Perches   checkpatch: impro...
3732
3733
3734
3735
3736
  					my $comp_pointer = $pointer;
  					$comp_pointer =~ s/\s//g;
  					$decl .= $comp_pointer;
  					$decl = rtrim($decl) if ($var eq "");
  					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
a1ce18e4f   Joe Perches   checkpatch: warn ...
3737
3738
3739
  				}
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3740
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
3741
3742
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3743
3744
3745
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3746
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3747
3748
3749
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3750
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3751
3752
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3753
3754
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
3755
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3756
3757
3758
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
3759
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3760
3761
3762
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3763
3764
3765
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3766

f0a594c1c   Andy Whitcroft   update checkpatch...
3767
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
3768
3769
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc88   Joe Perches   checkpatch: add a...
3770
3771
3772
  			if (ERROR("OPEN_BRACE",
  				  "that open brace { should be on the previous line
  " . $hereprev) &&
f2d7e4d43   Joe Perches   checkpatch: add f...
3773
3774
3775
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3776
3777
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3778
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3779
  				$fixedline = $line;
8d81ae05d   Cyril Bur   checkpatch: silen...
3780
  				$fixedline =~ s/^(.\s*)\{\s*/$1/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3781
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3782
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3783
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3784
3785
3786
3787
3788
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
3789
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
3790
3791
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3792
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
3793
3794
3795
3796
3797
3798
3799
  				      "malformed #include filename
  " . $herecurr);
  			}
  			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
  				ERROR("UAPI_INCLUDE",
  				      "No #include in ...include/uapi/... should use a uapi/ path prefix
  " . $herecurr);
653d4876b   Andy Whitcroft   update checkpatch...
3800
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3801
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3802

0a920b5b6   Andy Whitcroft   add a trivial pat...
3803
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
3804
  		if ($line =~ m{//}) {
3705ce5bc   Joe Perches   checkpatch: creat...
3805
3806
3807
3808
  			if (ERROR("C99_COMMENTS",
  				  "do not use C99 // comments
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3809
  				my $line = $fixed[$fixlinenr];
3705ce5bc   Joe Perches   checkpatch: creat...
3810
3811
  				if ($line =~ /\/\/(.*)$/) {
  					my $comment = trim($1);
194f66fc9   Joe Perches   checkpatch: add a...
3812
  					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5bc   Joe Perches   checkpatch: creat...
3813
3814
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3815
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3816
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3817
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
3818
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
3819

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3820
3821
3822
3823
3824
3825
3826
3827
3828
  # 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...
3829
3830
3831
3832
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
3833
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
3834
3835
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
3836
3837
3838
3839
3840
3841
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3842
3843
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
3844
3845
3846
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3847
3848
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
3849
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3850
3851
3852
3853
3854
  #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...
3855
3856
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
  		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...
3867
3868
3869
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3870
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3871

5150bda43   Joe Eloff   checkpatch: chang...
3872
  # check for global initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
3873
  		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3874
  			if (ERROR("GLOBAL_INITIALISERS",
6d32f7a39   Joe Perches   checkpatch: impro...
3875
3876
  				  "do not initialise globals to $1
  " . $herecurr) &&
d5e616fc1   Joe Perches   checkpatch: add a...
3877
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
3878
  				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3879
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3880
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3881
  # check for static initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
3882
  		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3883
  			if (ERROR("INITIALISED_STATIC",
6d32f7a39   Joe Perches   checkpatch: impro...
3884
3885
  				  "do not initialise statics to $1
  " .
d5e616fc1   Joe Perches   checkpatch: add a...
3886
3887
  				      $herecurr) &&
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
3888
  				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3889
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3890
  		}
1813087db   Joe Perches   checkpatch: add t...
3891
3892
3893
3894
3895
3896
3897
  # check for misordered declarations of char/short/int/long with signed/unsigned
  		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
  			my $tmp = trim($1);
  			WARN("MISORDERED_TYPE",
  			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order
  " . $herecurr);
  		}
809e082e9   Joe Perches   checkpatch: warn ...
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
  # check for unnecessary <signed> int declarations of short/long/long long
  		while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {
  			my $type = trim($1);
  			next if ($type !~ /\bint\b/);
  			next if ($type !~ /\b(?:short|long\s+long|long)\b/);
  			my $new_type = $type;
  			$new_type =~ s/\b\s*int\s*\b/ /;
  			$new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;
  			$new_type =~ s/^const\s+//;
  			$new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);
  			$new_type = "const $new_type" if ($type =~ /^const\b/);
  			$new_type =~ s/\s+/ /g;
  			$new_type = trim($new_type);
  			if (WARN("UNNECESSARY_INT",
  				 "Prefer '$new_type' over '$type' as the int is unnecessary
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;
  			}
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
3918
3919
  # 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...
3920
3921
3922
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3923
3924
3925
3926
3927
  				$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...
3928
3929
3930
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3931
3932
  				$herecurr);
                 }
ab7e23f34   Joe Perches   checkpatch: add t...
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
  # check for const <foo> const where <foo> is not a pointer or array type
  		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
  			my $found = $1;
  			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
  				WARN("CONST_CONST",
  				     "'const $found const *' should probably be 'const $found * const'
  " . $herecurr);
  			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
  				WARN("CONST_CONST",
  				     "'const $found const' should probably be 'const $found'
  " . $herecurr);
  			}
  		}
9b0fa60d9   Joe Perches   checkpatch: add t...
3946
3947
3948
3949
3950
3951
3952
  # check for non-global char *foo[] = {"bar", ...} declarations.
  		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "char * array declaration might be better as static const
  " .
  				$herecurr);
                 }
b598b6706   Joe Perches   checkpatch: add '...
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
  # check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
  		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
  			my $array = $1;
  			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
  				my $array_div = $1;
  				if (WARN("ARRAY_SIZE",
  					 "Prefer ARRAY_SIZE($array)
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
  				}
  			}
  		}
b36190c5f   Joe Perches   checkpatch.pl: ch...
3966
3967
3968
3969
3970
3971
  # check for function declarations without arguments like "int foo()"
  		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
  			if (ERROR("FUNCTION_WITHOUT_ARGS",
  				  "Bad function definition - $1() should probably be $1(void)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3972
  				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5f   Joe Perches   checkpatch.pl: ch...
3973
3974
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3975
3976
3977
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
3978
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3979
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
3980
  		    $line !~ /\b$typeTypedefs\b/ &&
46d832f5e   Michael S. Tsirkin   checkpatch: repla...
3981
  		    $line !~ /\b__bitwise\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3982
3983
3984
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3985
3986
3987
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
3988
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
3989
3990
3991
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3992
  			my ($ident, $from, $to) = ($1, $2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
3993
3994
3995
3996
3997
3998
  
  			# 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/...
3999
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4000
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
4001

3705ce5bc   Joe Perches   checkpatch: creat...
4002
4003
  ##			print "1: from<$from> to<$to> ident<$ident>
  ";
65863862b   Andy Whitcroft   checkpatch: dissa...
4004
  			if ($from ne $to) {
3705ce5bc   Joe Perches   checkpatch: creat...
4005
4006
4007
4008
4009
4010
4011
  				if (ERROR("POINTER_LOCATION",
  					  "\"(foo$from)\" should be \"(foo$to)\"
  " .  $herecurr) &&
  				    $fix) {
  					my $sub_from = $ident;
  					my $sub_to = $ident;
  					$sub_to =~ s/\Q$from\E/$to/;
194f66fc9   Joe Perches   checkpatch: add a...
4012
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4013
4014
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4015
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
4016
4017
4018
4019
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
4020
  			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
4021
4022
4023
4024
4025
4026
  
  			# 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/...
4027
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4028
4029
4030
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
4031

3705ce5bc   Joe Perches   checkpatch: creat...
4032
4033
  ##			print "2: from<$from> to<$to> ident<$ident>
  ";
667026e7b   Andy Whitcroft   checkpatch: a mod...
4034
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4035
4036
4037
4038
4039
4040
4041
4042
  				if (ERROR("POINTER_LOCATION",
  					  "\"foo${from}bar\" should be \"foo${to}bar\"
  " .  $herecurr) &&
  				    $fix) {
  
  					my $sub_from = $match;
  					my $sub_to = $match;
  					$sub_to =~ s/\Q$from\E/$to/;
194f66fc9   Joe Perches   checkpatch: add a...
4043
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4044
4045
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4046
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4047
  		}
9d3e3c705   Joe Perches   checkpatch: add w...
4048
4049
  # avoid BUG() or BUG_ON()
  		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4050
4051
4052
4053
4054
  			my $msg_level = \&WARN;
  			$msg_level = \&CHK if ($file);
  			&{$msg_level}("AVOID_BUG",
  				      "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()
  " . $herecurr);
9d3e3c705   Joe Perches   checkpatch: add w...
4055
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4056

9d3e3c705   Joe Perches   checkpatch: add w...
4057
  # avoid LINUX_VERSION_CODE
8905a67c6   Andy Whitcroft   update checkpatch...
4058
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4059
4060
4061
  			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...
4062
  		}
17441227f   Joe Perches   checkpatch: add w...
4063
4064
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4065
  			WARN("PRINTK_RATELIMITED",
101ee6802   Joe Perches   checkpatch: neate...
4066
4067
  			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
4068
  		}
eeef5733e   Joe Perches   checkpatch: print...
4069
4070
4071
4072
4073
  # printk should use KERN_* levels
  		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
  			WARN("PRINTK_WITHOUT_KERN_LEVEL",
  			     "printk() should include KERN_<LEVEL> facility level
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
4074
  		}
243f3803c   Joe Perches   checkpatch: sugge...
4075
4076
4077
4078
  		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
  			my $orig = $1;
  			my $level = lc($orig);
  			$level = "warn" if ($level eq "warning");
8f26b8376   Joe Perches   checkpatch: updat...
4079
4080
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
4081
  			WARN("PREFER_PR_LEVEL",
daa8b0592   Yogesh Chaudhari   checkpatch.pl: mo...
4082
4083
  			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
4084
4085
4086
  		}
  
  		if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4087
4088
4089
4090
  			if (WARN("PREFER_PR_LEVEL",
  				 "Prefer pr_warn(... to pr_warning(...
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4091
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4092
4093
  				    s/\bpr_warning\b/pr_warn/;
  			}
243f3803c   Joe Perches   checkpatch: sugge...
4094
  		}
dc1393130   Joe Perches   checkpatch: prefe...
4095
4096
4097
4098
4099
4100
4101
4102
4103
  		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
  			my $orig = $1;
  			my $level = lc($orig);
  			$level = "warn" if ($level eq "warning");
  			$level = "dbg" if ($level eq "debug");
  			WARN("PREFER_DEV_LEVEL",
  			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...
  " . $herecurr);
  		}
91c9afaf9   Andy Lutomirski   checkpatch.pl: ne...
4104
4105
4106
4107
4108
4109
4110
4111
  # ENOSYS means "bad syscall nr" and nothing else.  This will have a small
  # number of false positives, but assembly files are not checked, so at
  # least the arch entry code will not trigger this warning.
  		if ($line =~ /\bENOSYS\b/) {
  			WARN("ENOSYS",
  			     "ENOSYS means 'invalid syscall nr' and nothing else
  " . $herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4112
4113
  # function brace can't be on same line, except for #defines of do while,
  # or if closed on same line
5b57980de   Joe Perches   checkpatch: impro...
4114
  		if ($perl_version_ok &&
2d453e3b4   Joe Perches   checkpatch: impro...
4115
4116
4117
  		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
  		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
  		    $sline !~ /}/) {
8d1824780   Joe Perches   checkpatch: add -...
4118
  			if (ERROR("OPEN_BRACE",
2d453e3b4   Joe Perches   checkpatch: impro...
4119
4120
  				  "open brace '{' following function definitions go on the next line
  " . $herecurr) &&
8d1824780   Joe Perches   checkpatch: add -...
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixed_line = $rawline;
  				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
  				my $line1 = $1;
  				my $line2 = $2;
  				fix_insert_line($fixlinenr, ltrim($line1));
  				fix_insert_line($fixlinenr, "\+{");
  				if ($line2 !~ /^\s*$/) {
  					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4133
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4134

8905a67c6   Andy Whitcroft   update checkpatch...
4135
4136
4137
  # 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*$/) {
8d1824780   Joe Perches   checkpatch: add -...
4138
4139
4140
4141
4142
4143
4144
4145
4146
  			if (ERROR("OPEN_BRACE",
  				  "open brace '{' following $1 go on the same line
  " . $hereprev) &&
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixedline = rtrim($prevrawline) . " {";
  				fix_insert_line($fixlinenr, $fixedline);
  				$fixedline = $rawline;
8d81ae05d   Cyril Bur   checkpatch: silen...
4147
  				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
8d1824780   Joe Perches   checkpatch: add -...
4148
4149
4150
4151
  				if ($fixedline !~ /^\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
4152
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4153
  # missing space after union, struct or enum definition
3705ce5bc   Joe Perches   checkpatch: creat...
4154
4155
4156
4157
4158
  		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
  			if (WARN("SPACING",
  				 "missing space after $1 definition
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4159
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4160
4161
  				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
  			}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4162
  		}
31070b5d4   Joe Perches   checkpatch: add t...
4163
4164
4165
  # Function pointer declarations
  # check spacing between type, funcptr, and args
  # canonical declaration is "type (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4166
  		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d4   Joe Perches   checkpatch: add t...
4167
4168
4169
4170
4171
4172
  			my $declare = $1;
  			my $pre_pointer_space = $2;
  			my $post_pointer_space = $3;
  			my $funcname = $4;
  			my $post_funcname_space = $5;
  			my $pre_args_space = $6;
91f72e9c6   Joe Perches   checkpatch: don't...
4173
4174
4175
4176
4177
4178
4179
4180
4181
  # the $Declare variable will capture all spaces after the type
  # so check it for a missing trailing missing space but pointer return types
  # don't need a space so don't warn for those.
  			my $post_declare_space = "";
  			if ($declare =~ /(\s+)$/) {
  				$post_declare_space = $1;
  				$declare = rtrim($declare);
  			}
  			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
31070b5d4   Joe Perches   checkpatch: add t...
4182
4183
4184
  				WARN("SPACING",
  				     "missing space after return type
  " . $herecurr);
91f72e9c6   Joe Perches   checkpatch: don't...
4185
  				$post_declare_space = " ";
31070b5d4   Joe Perches   checkpatch: add t...
4186
4187
4188
  			}
  
  # unnecessary space "type  (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
  # This test is not currently implemented because these declarations are
  # equivalent to
  #	int  foo(int bar, ...)
  # and this is form shouldn't/doesn't generate a checkpatch warning.
  #
  #			elsif ($declare =~ /\s{2,}$/) {
  #				WARN("SPACING",
  #				     "Multiple spaces after return type
  " . $herecurr);
  #			}
31070b5d4   Joe Perches   checkpatch: add t...
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
  
  # unnecessary space "type ( *funcptr)(args...)"
  			if (defined $pre_pointer_space &&
  			    $pre_pointer_space =~ /^\s/) {
  				WARN("SPACING",
  				     "Unnecessary space after function pointer open parenthesis
  " . $herecurr);
  			}
  
  # unnecessary space "type (* funcptr)(args...)"
  			if (defined $post_pointer_space &&
  			    $post_pointer_space =~ /^\s/) {
  				WARN("SPACING",
  				     "Unnecessary space before function pointer name
  " . $herecurr);
  			}
  
  # unnecessary space "type (*funcptr )(args...)"
  			if (defined $post_funcname_space &&
  			    $post_funcname_space =~ /^\s/) {
  				WARN("SPACING",
  				     "Unnecessary space after function pointer name
  " . $herecurr);
  			}
  
  # unnecessary space "type (*funcptr) (args...)"
  			if (defined $pre_args_space &&
  			    $pre_args_space =~ /^\s/) {
  				WARN("SPACING",
  				     "Unnecessary space before function pointer arguments
  " . $herecurr);
  			}
  
  			if (show_type("SPACING") && $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4233
  				$fixed[$fixlinenr] =~
91f72e9c6   Joe Perches   checkpatch: don't...
4234
  				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d4   Joe Perches   checkpatch: add t...
4235
4236
  			}
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4237
4238
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4239
4240
  #  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...
4241
4242
4243
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4244
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
38dca988b   Heinrich Schuchardt   checkpatch: allow...
4245
  			    $prefix !~ /[{,:]\s+$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4246
4247
4248
4249
  				if (ERROR("BRACKET_SPACE",
  					  "space prohibited before open square bracket '['
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4250
  				    $fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4251
4252
  					s/^(\+.*?)\s+\[/$1\[/;
  				}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4253
4254
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4255
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
4256
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4257
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
4258
4259
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
4260
4261
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
4262
4263
4264
4265
4266
4267
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
4268
4269
4270
  			# 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...
4271
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
4272
4273
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
4274
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4275
4276
4277
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
4278
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4279
4280
  
  			} else {
3705ce5bc   Joe Perches   checkpatch: creat...
4281
4282
4283
4284
  				if (WARN("SPACING",
  					 "space prohibited between function name and open parenthesis '('
  " . $herecurr) &&
  					     $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4285
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4286
4287
  					    s/\b$name\s+\(/$name\(/;
  				}
6c72ffaab   Andy Whitcroft   update checkpatch...
4288
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
4289
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
4290

653d4876b   Andy Whitcroft   update checkpatch...
4291
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4292
  		if (!($line=~/\#\s*include/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4293
4294
  			my $fixed_line = "";
  			my $line_fixed = 0;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4295
4296
4297
4298
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
4299
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
847316231   Joe Perches   checkpatch: repor...
4300
  				\?:|\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4301
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
4302
  			my @elements = split(/($ops|;)/, $opline);
3705ce5bc   Joe Perches   checkpatch: creat...
4303
4304
4305
4306
4307
4308
4309
4310
4311
  
  ##			print("element count: <" . $#elements . ">
  ");
  ##			foreach my $el (@elements) {
  ##				print("el: <$el>
  ");
  ##			}
  
  			my @fix_elements = ();
00df344fd   Andy Whitcroft   update checkpatch...
4312
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4313

3705ce5bc   Joe Perches   checkpatch: creat...
4314
4315
4316
4317
4318
4319
  			foreach my $el (@elements) {
  				push(@fix_elements, substr($rawline, $off, length($el)));
  				$off += length($el);
  			}
  
  			$off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4320
  			my $blank = copy_spacing($opline);
b34c648bb   Joe Perches   checkpatch: bette...
4321
  			my $last_after = -1;
6c72ffaab   Andy Whitcroft   update checkpatch...
4322

0a920b5b6   Andy Whitcroft   add a trivial pat...
4323
  			for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5bc   Joe Perches   checkpatch: creat...
4324
4325
4326
4327
4328
  
  				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
  
  ##				print("n: <$n> good: <$good>
  ");
4a0df2ef4   Andy Whitcroft   update checkpatch...
4329
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
4330
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
4331
4332
4333
4334
4335
4336
  				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...
4337
4338
4339
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
4340
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4341
4342
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
4343
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4344

0a920b5b6   Andy Whitcroft   add a trivial pat...
4345
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
4346
4347
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4348
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4349
4350
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
4351
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4352
4353
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
4354
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4355
4356
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4357
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4358
4359
4360
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
4361
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
4362
4363
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
4364

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
4368
4369
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
4370
4371
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
d7fe8065a   Sam Bobroff   checkpatch: impro...
4372
  				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
13214adf7   Andy Whitcroft   update checkpatch...
4373

cf655043d   Andy Whitcroft   update checkpatch...
4374
4375
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
4376

d8aaf1214   Andy Whitcroft   update checkpatch...
4377
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
4378
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
4379
4380
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4381
4382
4383
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4384
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4385
4386
  							$line_fixed = 1;
  						}
d8aaf1214   Andy Whitcroft   update checkpatch...
4387
4388
4389
4390
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
4391

b00e48148   Joe Perches   checkpatch: don't...
4392
4393
4394
  				#   :   when part of a bitfield
  				} elsif ($opv eq ':B') {
  					# skip the bitfield test for now
1f65f947a   Andy Whitcroft   checkpatch: add c...
4395
4396
  				# No spaces for:
  				#   ->
b00e48148   Joe Perches   checkpatch: don't...
4397
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4398
  					if ($ctx =~ /Wx.|.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4399
4400
4401
  						if (ERROR("SPACING",
  							  "spaces prohibited around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4402
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4403
4404
4405
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4406
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4407
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4408
  					}
2381097b6   Joe Perches   checkpatch: add a...
4409
  				# , must not have a space before and must have a space on the right.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4410
  				} elsif ($op eq ',') {
2381097b6   Joe Perches   checkpatch: add a...
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
  					my $rtrim_before = 0;
  					my $space_after = 0;
  					if ($ctx =~ /Wx./) {
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
  							$line_fixed = 1;
  							$rtrim_before = 1;
  						}
  					}
cf655043d   Andy Whitcroft   update checkpatch...
4421
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4422
4423
4424
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4425
  							$line_fixed = 1;
b34c648bb   Joe Perches   checkpatch: bette...
4426
  							$last_after = $n;
2381097b6   Joe Perches   checkpatch: add a...
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
  							$space_after = 1;
  						}
  					}
  					if ($rtrim_before || $space_after) {
  						if ($rtrim_before) {
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
  						} else {
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
  						}
  						if ($space_after) {
  							$good .= " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4438
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4439
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4440
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
4441
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4442
4443
4444
4445
4446
4447
4448
  					#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...
4449
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
4450
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
4451
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4452
4453
4454
  						if (ERROR("SPACING",
  							  "space required before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4455
4456
4457
4458
  							if ($n != $last_after + 2) {
  								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
4459
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4460
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
4461
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4462
4463
4464
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4465
4466
4467
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4468
  							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4469
4470
4471
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4472
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4473
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4474
4475
4476
4477
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
4478
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4479
4480
4481
  						if (ERROR("SPACING",
  							  "space required one side of that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4482
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4483
4484
  							$line_fixed = 1;
  						}
773647a09   Andy Whitcroft   update checkpatch...
4485
4486
4487
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4488
4489
4490
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4491
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4492
4493
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4494
  					}
773647a09   Andy Whitcroft   update checkpatch...
4495
  					if ($ctx =~ /ExW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4496
4497
4498
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4499
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4500
4501
4502
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4503
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4504
  						}
653d4876b   Andy Whitcroft   update checkpatch...
4505
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4506

0a920b5b6   Andy Whitcroft   add a trivial pat...
4507
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4508
4509
4510
  				} 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...
4511
4512
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
4513
  				{
d2e025f36   Joe Perches   checkpatch: add -...
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
  					if ($check) {
  						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
  							if (CHK("SPACING",
  								"spaces preferred around that '$op' $at
  " . $hereptr)) {
  								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
  								$fix_elements[$n + 2] =~ s/^\s+//;
  								$line_fixed = 1;
  							}
  						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
  							if (CHK("SPACING",
  								"space preferred before that '$op' $at
  " . $hereptr)) {
  								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
  						}
  					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4532
4533
4534
  						if (ERROR("SPACING",
  							  "need consistent spacing around '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4535
4536
4537
4538
  							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
4539
4540
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4541
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4542
4543
4544
4545
  				# 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./) {
3705ce5bc   Joe Perches   checkpatch: creat...
4546
4547
4548
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4549
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4550
4551
  							$line_fixed = 1;
  						}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4552
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4553
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
4554
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
4555
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
4556
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
4557
4558
4559
4560
4561
4562
4563
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
e0df7e1fa   Joe Perches   checkpatch: avoid...
4564
4565
4566
4567
4568
4569
4570
  					# for asm volatile statements
  					# ignore a colon with another
  					# colon immediately before or after
  					if (($op eq ':') &&
  					    ($ca =~ /:$/ || $cc =~ /^:/)) {
  						$ok = 1;
  					}
847316231   Joe Perches   checkpatch: repor...
4571
  					# messages are ERROR, but ?: are CHK
1f65f947a   Andy Whitcroft   checkpatch: add c...
4572
  					if ($ok == 0) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4573
4574
  						my $msg_level = \&ERROR;
  						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
847316231   Joe Perches   checkpatch: repor...
4575

0675a8fbd   Jean Delvare   checkpatch: renam...
4576
4577
4578
  						if (&{$msg_level}("SPACING",
  								  "spaces required around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4579
4580
4581
4582
  							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
4583
4584
  							$line_fixed = 1;
  						}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4585
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4586
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4587
  				$off += length($elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4588
4589
4590
4591
4592
4593
4594
4595
4596
  
  ##				print("n: <$n> GOOD: <$good>
  ");
  
  				$fixed_line = $fixed_line . $good;
  			}
  
  			if (($#elements % 2) == 0) {
  				$fixed_line = $fixed_line . $fix_elements[$#elements];
0a920b5b6   Andy Whitcroft   add a trivial pat...
4597
  			}
3705ce5bc   Joe Perches   checkpatch: creat...
4598

194f66fc9   Joe Perches   checkpatch: add a...
4599
4600
  			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
  				$fixed[$fixlinenr] = $fixed_line;
3705ce5bc   Joe Perches   checkpatch: creat...
4601
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4602
  		}
786b63262   Joe Perches   checkpatch: move ...
4603
  # check for whitespace before a non-naked semicolon
d2e248e7b   Joe Perches   checkpatch: warn ...
4604
  		if ($line =~ /^\+.*\S\s+;\s*$/) {
786b63262   Joe Perches   checkpatch: move ...
4605
4606
4607
4608
  			if (WARN("SPACING",
  				 "space prohibited before semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4609
  				1 while $fixed[$fixlinenr] =~
786b63262   Joe Perches   checkpatch: move ...
4610
4611
4612
  				    s/^(\+.*\S)\s+;/$1;/;
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4613
4614
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4615
4616
4617
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
4618
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
  ## # 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...
4630
4631
4632
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
4633
4634
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4635

0a920b5b6   Andy Whitcroft   add a trivial pat...
4636
  #need space before brace following if, while, etc
6b8c69e43   Geyslan G. Bem   checkpatch: fix a...
4637
  		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
6ad724e2a   Michal Zylowski   checkpatch: check...
4638
  		    $line =~ /\b(?:else|do)\{/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4639
4640
4641
4642
  			if (ERROR("SPACING",
  				  "space required before the open brace '{'
  " . $herecurr) &&
  			    $fix) {
6ad724e2a   Michal Zylowski   checkpatch: check...
4643
  				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
3705ce5bc   Joe Perches   checkpatch: creat...
4644
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4645
  		}
c4a62ef91   Joe Perches   checkpatch: add a...
4646
4647
4648
4649
4650
4651
4652
4653
  ## # check for blank lines before declarations
  ##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
  ##		    $prevrawline =~ /^.\s*$/) {
  ##			WARN("SPACING",
  ##			     "No blank lines before declarations
  " . $hereprev);
  ##		}
  ##
de7d4f0e1   Andy Whitcroft   update checkpatch...
4654
4655
4656
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4657
4658
4659
4660
  			if (ERROR("SPACING",
  				  "space required after that close brace '}'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4661
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4662
4663
  				    s/}((?!(?:,|;|\)))\S)/} $1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4664
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4665
4666
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4667
4668
4669
4670
  			if (ERROR("SPACING",
  				  "space prohibited after that open square bracket '['
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4671
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4672
4673
  				    s/\[\s+/\[/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4674
4675
  		}
  		if ($line =~ /\s\]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4676
4677
4678
4679
  			if (ERROR("SPACING",
  				  "space prohibited before that close square bracket ']'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4680
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4681
4682
  				    s/\s+\]/\]/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4683
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4684
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4685
4686
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4687
4688
4689
4690
  			if (ERROR("SPACING",
  				  "space prohibited after that open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4691
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4692
4693
  				    s/\(\s+/\(/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4694
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4695
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4696
4697
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4698
4699
4700
4701
  			if (ERROR("SPACING",
  				  "space prohibited before that close parenthesis ')'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4702
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4703
4704
  				    s/\s+\)/\)/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4705
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
4706
4707
4708
4709
  # check unnecessary parentheses around addressof/dereference single $Lvals
  # ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
  
  		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
ea4acbb11   Joe Perches   checkpatch: Add -...
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
  			my $var = $1;
  			if (CHK("UNNECESSARY_PARENTHESES",
  				"Unnecessary parentheses around $var
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
  			}
  		}
  
  # check for unnecessary parentheses around function pointer uses
  # ie: (foo->bar)(); should be foo->bar();
  # but not "if (foo->bar) (" to avoid some false positives
  		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
  			my $var = $2;
  			if (CHK("UNNECESSARY_PARENTHESES",
  				"Unnecessary parentheses around function pointer $var
  " . $herecurr) &&
  			    $fix) {
  				my $var2 = deparenthesize($var);
  				$var2 =~ s/\s//g;
  				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
  			}
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
4733

63b7c73ec   Joe Perches   checkpatch: add -...
4734
  # check for unnecessary parentheses around comparisons in if uses
a032aa4c4   Joe Perches   checkpatch: exclu...
4735
4736
  # when !drivers/staging or command-line uses --strict
  		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
5b57980de   Joe Perches   checkpatch: impro...
4737
  		    $perl_version_ok && defined($stat) &&
63b7c73ec   Joe Perches   checkpatch: add -...
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
  		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {
  			my $if_stat = $1;
  			my $test = substr($2, 1, -1);
  			my $herectx;
  			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
  				my $match = $1;
  				# avoid parentheses around potential macro args
  				next if ($match =~ /^\s*\w+\s*$/);
  				if (!defined($herectx)) {
  					$herectx = $here . "
  ";
  					my $cnt = statement_rawlines($if_stat);
  					for (my $n = 0; $n < $cnt; $n++) {
  						my $rl = raw_line($linenr, $n);
  						$herectx .=  $rl . "
  ";
  						last if $rl =~ /^[ \+].*\{/;
  					}
  				}
  				CHK("UNNECESSARY_PARENTHESES",
  				    "Unnecessary parentheses around '$match'
  " . $herectx);
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4762
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
4763
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
4764
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4765
4766
4767
4768
  			if (WARN("INDENTED_LABEL",
  				 "labels should not be indented
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4769
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4770
4771
  				    s/^(.)\s+/$1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4772
  		}
5b9553abf   Joe Perches   checkpatch: make ...
4773
  # return is not a function
507e51418   Joe Perches   checkpatch: impro...
4774
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
4775
  			my $spacing = $1;
5b57980de   Joe Perches   checkpatch: impro...
4776
  			if ($perl_version_ok &&
5b9553abf   Joe Perches   checkpatch: make ...
4777
4778
4779
4780
4781
4782
4783
4784
  			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
  				my $value = $1;
  				$value = deparenthesize($value);
  				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
  					ERROR("RETURN_PARENTHESES",
  					      "return is not a function, parentheses are not required
  " . $herecurr);
  				}
c45dcabd2   Andy Whitcroft   update checkpatch...
4785
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4786
4787
4788
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
4789
4790
  			}
  		}
507e51418   Joe Perches   checkpatch: impro...
4791

b43ae21bd   Joe Perches   checkpatch: reduc...
4792
4793
4794
4795
4796
4797
4798
4799
  # unnecessary return in a void function
  # at end-of-function, with the previous line a single leading tab, then return;
  # and the line before that not a goto label target like "out:"
  		if ($sline =~ /^[ \+]}\s*$/ &&
  		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
  		    $linenr >= 3 &&
  		    $lines[$linenr - 3] =~ /^[ +]/ &&
  		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
9819cf252   Joe Perches   checkpatch: warn ...
4800
  			WARN("RETURN_VOID",
b43ae21bd   Joe Perches   checkpatch: reduc...
4801
4802
4803
  			     "void function return statements are not generally useful
  " . $hereprev);
                 }
9819cf252   Joe Perches   checkpatch: warn ...
4804

189248d8f   Joe Perches   checkpatch: check...
4805
  # if statements using unnecessary parentheses - ie: if ((foo == bar))
5b57980de   Joe Perches   checkpatch: impro...
4806
  		if ($perl_version_ok &&
189248d8f   Joe Perches   checkpatch: check...
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
  		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
  			my $openparens = $1;
  			my $count = $openparens =~ tr@\(@\(@;
  			my $msg = "";
  			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
  				my $comp = $4;	#Not $1 because of $LvalOrFunc
  				$msg = " - maybe == should be = ?" if ($comp eq "==");
  				WARN("UNNECESSARY_PARENTHESES",
  				     "Unnecessary parentheses$msg
  " . $herecurr);
  			}
  		}
c5595fa2f   Joe Perches   checkpatch: add c...
4819
4820
4821
4822
  # comparisons with a constant or upper case identifier on the left
  #	avoid cases like "foo + BAR < baz"
  #	only fix matches surrounded by parentheses to avoid incorrect
  #	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
5b57980de   Joe Perches   checkpatch: impro...
4823
  		if ($perl_version_ok &&
c5595fa2f   Joe Perches   checkpatch: add c...
4824
4825
4826
4827
4828
4829
  		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
  			my $lead = $1;
  			my $const = $2;
  			my $comp = $3;
  			my $to = $4;
  			my $newcomp = $comp;
f39e1769b   Joe Perches   checkpatch: impro...
4830
  			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
c5595fa2f   Joe Perches   checkpatch: add c...
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
  			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
  			    WARN("CONSTANT_COMPARISON",
  				 "Comparisons should place the constant on the right side of the test
  " . $herecurr) &&
  			    $fix) {
  				if ($comp eq "<") {
  					$newcomp = ">";
  				} elsif ($comp eq "<=") {
  					$newcomp = ">=";
  				} elsif ($comp eq ">") {
  					$newcomp = "<";
  				} elsif ($comp eq ">=") {
  					$newcomp = "<=";
  				}
  				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
  			}
  		}
f34e4a4f9   Joe Perches   checkpatch: impro...
4848
4849
  # Return of what appears to be an errno should normally be negative
  		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
53a3c4487   Andy Whitcroft   checkpatch: retur...
4850
4851
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4852
  				WARN("USE_NEGATIVE_ERRNO",
f34e4a4f9   Joe Perches   checkpatch: impro...
4853
4854
  				     "return of an errno should typically be negative (ie: return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
4855
4856
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4857

0a920b5b6   Andy Whitcroft   add a trivial pat...
4858
  # Need a space before open parenthesis after if, while etc
3705ce5bc   Joe Perches   checkpatch: creat...
4859
4860
4861
4862
4863
  		if ($line =~ /\b(if|while|for|switch)\(/) {
  			if (ERROR("SPACING",
  				  "space required before the open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4864
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4865
4866
  				    s/\b(if|while|for|switch)\(/$1 \(/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4867
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
4868
4869
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
4870
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
4871
4872
4873
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
  			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} &&
c11230f44   Joe Perches   checkpatch: fix "...
4896
  		    defined($stat) && defined($cond) &&
170d3a226   Andy Whitcroft   checkpatch: handl...
4897
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4898
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
4899

b53c8e104   Andy Whitcroft   checkpatch: ensur...
4900
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4901
4902
4903
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
4904
4905
4906
4907
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
4908
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
4909
4910
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
4911
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
4912
4913
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
4914
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4915
4916
4917
4918
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4919
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4920

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4921
4922
4923
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4924
4925
4926
4927
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
4928
4929
4930
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
4931
4932
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
  # 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...
4945
4946
4947
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4948
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
4949
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
4950
4951
4952
4953
  		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...
4954
4955
4956
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4957
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4958
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
4959
4960
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4961
  			ERROR("TRAILING_STATEMENTS",
048b123fa   Rasmus Villemoes   checkpatch.pl: al...
4962
4963
  			      "trailing statements should be on next line (or did you mean 'else if'?)
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
4964
4965
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
4966
4967
4968
  # 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...
4969
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
4970
4971
4972
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
4973
4974
4975
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
4976
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4977
4978
4979
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
8b8856f4b   Joe Perches   checkpatch: fix b...
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
  		    $previndent == $indent) {
  			if (ERROR("ELSE_AFTER_BRACE",
  				  "else should follow close brace '}'
  " . $hereprev) &&
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/}\s*$//;
  				if ($fixedline !~ /^\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  				$fixedline = $rawline;
  				$fixedline =~ s/^(.\s*)else/$1} else/;
  				fix_insert_line($fixlinenr, $fixedline);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4997
  		}
8b8856f4b   Joe Perches   checkpatch: fix b...
4998
4999
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
  		    $previndent == $indent) {
c2fdda0df   Andy Whitcroft   update checkpatch...
5000
5001
5002
5003
  			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...
5004
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
5005
5006
5007
5008
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
8b8856f4b   Joe Perches   checkpatch: fix b...
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
  				if (ERROR("WHILE_AFTER_BRACE",
  					  "while should follow close brace '}'
  " . $hereprev) &&
  				    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  					fix_delete_line($fixlinenr - 1, $prevrawline);
  					fix_delete_line($fixlinenr, $rawline);
  					my $fixedline = $prevrawline;
  					my $trailing = $rawline;
  					$trailing =~ s/^\+//;
  					$trailing = trim($trailing);
  					$fixedline =~ s/}\s*$/} $trailing/;
  					fix_insert_line($fixlinenr, $fixedline);
  				}
c2fdda0df   Andy Whitcroft   update checkpatch...
5022
5023
  			}
  		}
95e2c6023   Joe Perches   checkpatch: warn ...
5024
  #Specific variable tests
323c1260b   Joe Perches   checkpatch: warn ...
5025
5026
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
95e2c6023   Joe Perches   checkpatch: warn ...
5027
5028
5029
  
  #gcc binary extension
  			if ($var =~ /^$Binary$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5030
5031
5032
5033
5034
  				if (WARN("GCC_BINARY_CONSTANT",
  					 "Avoid gcc v4.3+ binary constant extension: <$var>
  " . $herecurr) &&
  				    $fix) {
  					my $hexval = sprintf("0x%x", oct($var));
194f66fc9   Joe Perches   checkpatch: add a...
5035
  					$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
5036
5037
  					    s/\b$var\b/$hexval/;
  				}
95e2c6023   Joe Perches   checkpatch: warn ...
5038
5039
5040
  			}
  
  #CamelCase
807bd26c4   Joe Perches   checkpatch: remov...
5041
  			if ($var !~ /^$Constant$/ &&
be79794bc   Joe Perches   checkpatch: chang...
5042
  			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
5043
  #Ignore Page<foo> variants
807bd26c4   Joe Perches   checkpatch: remov...
5044
  			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
5045
  #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
f51235764   Julius Werner   checkpatch: allow...
5046
5047
5048
  			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
  #Ignore some three character SI units explicitly, like MiB and KHz
  			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
7e781f67d   Joe Perches   checkpatch: check...
5049
5050
5051
  				while ($var =~ m{($Ident)}g) {
  					my $word = $1;
  					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b077101   Joe Perches   checkpatch: exten...
5052
5053
5054
5055
5056
5057
5058
  					if ($check) {
  						seed_camelcase_includes();
  						if (!$file && !$camelcase_file_seeded) {
  							seed_camelcase_file($realfile);
  							$camelcase_file_seeded = 1;
  						}
  					}
7e781f67d   Joe Perches   checkpatch: check...
5059
5060
5061
5062
5063
5064
  					if (!defined $camelcase{$word}) {
  						$camelcase{$word} = 1;
  						CHK("CAMELCASE",
  						    "Avoid CamelCase: <$word>
  " . $herecurr);
  					}
3445686af   Joe Perches   checkpatch: ignor...
5065
  				}
323c1260b   Joe Perches   checkpatch: warn ...
5066
5067
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5068
5069
  
  #no spaces allowed after \ in define
d5e616fc1   Joe Perches   checkpatch: add a...
5070
5071
5072
5073
5074
  		if ($line =~ /\#\s*define.*\\\s+$/) {
  			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
  				 "Whitespace after \\ makes next lines useless
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5075
  				$fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
5076
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5077
  		}
0e212e0a7   Fabian Frederick   checkpatch: don't...
5078
5079
  # warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
  # itself <asm/foo.h> (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
5080
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
5081
5082
5083
5084
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
5085
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
5086
  			{
0e212e0a7   Fabian Frederick   checkpatch: don't...
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
  				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
  				if ($asminclude > 0) {
  					if ($realfile =~ m{^arch/}) {
  						CHK("ARCH_INCLUDE_LINUX",
  						    "Consider using #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
  					} else {
  						WARN("INCLUDE_LINUX",
  						     "Use #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
  					}
e09dec483   Andy Whitcroft   checkpatch: reduc...
5098
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5099
5100
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5101
5102
  # 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...
5103
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
5104
5105
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
5106
5107
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
5108
5109
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
08a2843e7   Joe Perches   checkpatch: warn ...
5110
5111
  			my $has_flow_statement = 0;
  			my $has_arg_concat = 0;
c45dcabd2   Andy Whitcroft   update checkpatch...
5112
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
5113
5114
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
5115
5116
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
5117
5118
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
5119

08a2843e7   Joe Perches   checkpatch: warn ...
5120
  			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
62e15a6da   Joe Perches   checkpatch: impro...
5121
  			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
08a2843e7   Joe Perches   checkpatch: warn ...
5122

f59b64bff   Joe Perches   checkpatch: add -...
5123
5124
5125
5126
5127
5128
5129
5130
  			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
  			my $define_args = $1;
  			my $define_stmt = $dstat;
  			my @def_args = ();
  
  			if (defined $define_args && $define_args ne "") {
  				$define_args = substr($define_args, 1, length($define_args) - 2);
  				$define_args =~ s/\s*//g;
8c8c45cfd   Joe Perches   checkpatch: fix m...
5131
  				$define_args =~ s/\\\+?//g;
f59b64bff   Joe Perches   checkpatch: add -...
5132
5133
  				@def_args = split(",", $define_args);
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
5134
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5135
5136
5137
5138
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
5139

c45dcabd2   Andy Whitcroft   update checkpatch...
5140
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
5141
5142
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
6b10df425   Vladimir Zapolskiy   checkpatch: fix a...
5143
  			       $dstat =~ s/.\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
5144
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
5145
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
5146

e45bab8eb   Andy Whitcroft   checkpatch: handl...
5147
  			# Flatten any obvious string concatentation.
33acb54a4   Joe Perches   checkpatch: use $...
5148
5149
  			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*($String)/$1/)
e45bab8eb   Andy Whitcroft   checkpatch: handl...
5150
5151
  			{
  			}
42e152931   Joe Perches   checkpatch: exclu...
5152
5153
  			# Make asm volatile uses seem like a generic function
  			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5154
5155
5156
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
5157
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
5158
5159
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
5160
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
5161
5162
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
5163
  				\.$Ident\s*=\s*|
6b10df425   Vladimir Zapolskiy   checkpatch: fix a...
5164
5165
  				^\"|\"$|
  				^\[
c45dcabd2   Andy Whitcroft   update checkpatch...
5166
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
5167
5168
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f59b64bff   Joe Perches   checkpatch: add -...
5169
5170
5171
  
  			$ctx =~ s/
  *$//;
f59b64bff   Joe Perches   checkpatch: add -...
5172
  			my $stmt_cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5173
  			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
f59b64bff   Joe Perches   checkpatch: add -...
5174

f74bd1942   Andy Whitcroft   checkpatch: corre...
5175
5176
5177
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
3cc4b1c3f   Joe Perches   checkpatch: reduc...
5178
  			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd3981   Joe Perches   checkpatch: fix c...
5179
  			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
5180
5181
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
e942e2c3f   Joe Perches   checkpatch: fix s...
5182
  			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
72f115f94   Andy Whitcroft   checkpatch: compl...
5183
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
5184
5185
5186
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
4e5d56bdf   Eddie Kovsky   checkpatch: fix l...
5187
  			    $dstat !~ /^\(\{/ &&						# ({...
f95a7e6a4   Joe Perches   checkpatch: ignor...
5188
  			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd1942   Andy Whitcroft   checkpatch: corre...
5189
  			{
e795556a5   Joe Perches   checkpatch: impro...
5190
5191
5192
5193
5194
  				if ($dstat =~ /^\s*if\b/) {
  					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
  					      "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects
  " . "$herectx");
  				} elsif ($dstat =~ /;/) {
f74bd1942   Andy Whitcroft   checkpatch: corre...
5195
5196
5197
5198
  					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...
5199
  					ERROR("COMPLEX_MACRO",
388982b55   Andrew Morton   checkpatch: fix s...
5200
5201
  					      "Macros with complex values should be enclosed in parentheses
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
5202
  				}
f59b64bff   Joe Perches   checkpatch: add -...
5203
5204
  
  			}
5207649b7   Joe Perches   checkpatch: impro...
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
  
  			# Make $define_stmt single line, comment-free, etc
  			my @stmt_array = split('
  ', $define_stmt);
  			my $first = 1;
  			$define_stmt = "";
  			foreach my $l (@stmt_array) {
  				$l =~ s/\\$//;
  				if ($first) {
  					$define_stmt = $l;
  					$first = 0;
  				} elsif ($l =~ /^[\+ ]/) {
  					$define_stmt .= substr($l, 1);
  				}
  			}
  			$define_stmt =~ s/$;//g;
  			$define_stmt =~ s/\s+/ /g;
  			$define_stmt = trim($define_stmt);
f59b64bff   Joe Perches   checkpatch: add -...
5223
5224
5225
  # check if any macro arguments are reused (ignore '...' and 'type')
  			foreach my $arg (@def_args) {
  			        next if ($arg =~ /\.\.\./);
9192d41a3   Joe Perches   checkpatch: add -...
5226
  			        next if ($arg =~ /^type$/i);
7fe528a27   Joe Perches   checkpatch: impro...
5227
5228
5229
5230
  				my $tmp_stmt = $define_stmt;
  				$tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
  				$tmp_stmt =~ s/\#+\s*$arg\b//g;
  				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
d41362ed1   Joe Perches   checkpatch: fix m...
5231
  				my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
f59b64bff   Joe Perches   checkpatch: add -...
5232
5233
5234
5235
  				if ($use_cnt > 1) {
  					CHK("MACRO_ARG_REUSE",
  					    "Macro argument reuse '$arg' - possible side-effects?
  " . "$herectx");
9192d41a3   Joe Perches   checkpatch: add -...
5236
5237
  				    }
  # check if any macro arguments may have other precedence issues
7fe528a27   Joe Perches   checkpatch: impro...
5238
  				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
9192d41a3   Joe Perches   checkpatch: add -...
5239
5240
5241
5242
5243
  				    ((defined($1) && $1 ne ',') ||
  				     (defined($2) && $2 ne ','))) {
  					CHK("MACRO_ARG_PRECEDENCE",
  					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues
  " . "$herectx");
f59b64bff   Joe Perches   checkpatch: add -...
5244
  				}
653d4876b   Andy Whitcroft   update checkpatch...
5245
  			}
5023d3472   Joe Perches   checkpatch: warn ...
5246

08a2843e7   Joe Perches   checkpatch: warn ...
5247
5248
5249
  # check for macros with flow control, but without ## concatenation
  # ## concatenation is commonly a macro that defines a function so ignore those
  			if ($has_flow_statement && !$has_arg_concat) {
08a2843e7   Joe Perches   checkpatch: warn ...
5250
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5251
  				my $herectx = get_stat_here($linenr, $cnt, $here);
08a2843e7   Joe Perches   checkpatch: warn ...
5252

08a2843e7   Joe Perches   checkpatch: warn ...
5253
5254
5255
5256
  				WARN("MACRO_WITH_FLOW_CONTROL",
  				     "Macros with flow control statements should be avoided
  " . "$herectx");
  			}
481eb486a   Joe Perches   checkpatch: exten...
5257
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
5258
5259
5260
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
5261
5262
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
5263
5264
5265
5266
5267
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5268
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
5269
5270
5271
  # do {} while (0) macro tests:
  # single-statement macros do not need to be enclosed in do while (0) loop,
  # macro should not end with a semicolon
5b57980de   Joe Perches   checkpatch: impro...
5272
  		if ($perl_version_ok &&
b13edf7ff   Joe Perches   checkpatch: add c...
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
  		    $realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
  			my $ln = $linenr;
  			my $cnt = $realcnt;
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
  			($dstat, $dcond, $ln, $cnt, $off) =
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
  
  			$dstat =~ s/\\
  .//g;
1b36b201c   Joe Perches   checkpatch: Allow...
5285
  			$dstat =~ s/$;/ /g;
b13edf7ff   Joe Perches   checkpatch: add c...
5286
5287
5288
5289
5290
5291
5292
5293
  
  			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
  				my $stmts = $2;
  				my $semis = $3;
  
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5294
  				my $herectx = get_stat_here($linenr, $cnt, $here);
b13edf7ff   Joe Perches   checkpatch: add c...
5295

ac8e97f8a   Joe Perches   checkpatch: add c...
5296
5297
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
5298
5299
5300
5301
5302
5303
5304
5305
5306
  					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
  					     "Single statement macros should not use a do {} while (0) loop
  " . "$herectx");
  				}
  				if (defined $semis && $semis ne "") {
  					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
  					     "do {} while (0) macros should not be semicolon terminated
  " . "$herectx");
  				}
f5ef95b12   Joe Perches   checkpatch: warn ...
5307
5308
5309
5310
  			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5311
  				my $herectx = get_stat_here($linenr, $cnt, $here);
f5ef95b12   Joe Perches   checkpatch: warn ...
5312
5313
5314
5315
  
  				WARN("TRAILING_SEMICOLON",
  				     "macros should not use a trailing semicolon
  " . "$herectx");
b13edf7ff   Joe Perches   checkpatch: add c...
5316
5317
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5318
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
5319
5320
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
5321
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
5322
5323
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5324
5325
5326
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
5327
5328
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
5329
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
5330
5331
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5332
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
5333
5334
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
5335
5336
5337
5338
  					# If the condition carries leading newlines, then count those as offsets.
  					my ($whitespace) = ($cond =~ /^((?:\s*
  [+-])*\s*)/s);
  					my $offset = statement_rawlines($whitespace) - 1;
aad4f6149   Joe Perches   checkpatch: add -...
5339
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
5340
5341
5342
5343
5344
5345
5346
5347
5348
  					#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...
5349
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
5350
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
5351
5352
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
5353
5354
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5355
5356
5357
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5358
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5359
5360
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5361
5362
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5363
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5364
  					}
cf655043d   Andy Whitcroft   update checkpatch...
5365
5366
5367
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5368
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5369
  					}
aad4f6149   Joe Perches   checkpatch: add -...
5370
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
5371
  				}
aad4f6149   Joe Perches   checkpatch: add -...
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
  				if ($seen) {
  					my $sum_allowed = 0;
  					foreach (@allowed) {
  						$sum_allowed += $_;
  					}
  					if ($sum_allowed == 0) {
  						WARN("BRACES",
  						     "braces {} are not necessary for any arm of this statement
  " . $herectx);
  					} elsif ($sum_allowed != $allow &&
  						 $seen != $allow) {
  						CHK("BRACES",
  						    "braces {} should be used on all arms of this statement
  " . $herectx);
  					}
13214adf7   Andy Whitcroft   update checkpatch...
5387
5388
5389
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
5390
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
5391
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5392
5393
5394
5395
5396
5397
5398
5399
  			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...
5400
5401
5402
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
5403
5404
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
5405
5406
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5407
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
5408
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
  			}
  			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...
5429
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5430
5431
5432
5433
5434
5435
5436
5437
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
f055663c5   Andy Whitcroft   checkpatch: repor...
5438
  				my $cnt = statement_rawlines($block);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5439
  				my $herectx = get_stat_here($linenr, $cnt, $here);
cf655043d   Andy Whitcroft   update checkpatch...
5440

000d1cc18   Joe Perches   checkpatch.pl: ad...
5441
5442
5443
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
5444
5445
  			}
  		}
e4c5babd3   Joe Perches   checkpatch: notic...
5446
  # check for single line unbalanced braces
953304736   Sven Eckelmann   checkpatch: remov...
5447
5448
  		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
  		    $sline =~ /^.\s*else\s*\{\s*$/) {
e4c5babd3   Joe Perches   checkpatch: notic...
5449
5450
5451
  			CHK("BRACES", "Unbalanced braces around else statement
  " . $herecurr);
  		}
0979ae664   Joe Perches   checkpatch: Add -...
5452
  # check for unnecessary blank lines around braces
77b9a53a6   Joe Perches   checkpatch: don't...
5453
  		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5454
5455
5456
5457
5458
5459
  			if (CHK("BRACES",
  				"Blank lines aren't necessary before a close brace '}'
  " . $hereprev) &&
  			    $fix && $prevrawline =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  			}
0979ae664   Joe Perches   checkpatch: Add -...
5460
  		}
77b9a53a6   Joe Perches   checkpatch: don't...
5461
  		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5462
5463
5464
5465
5466
5467
  			if (CHK("BRACES",
  				"Blank lines aren't necessary after an open brace '{'
  " . $hereprev) &&
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  			}
0979ae664   Joe Perches   checkpatch: Add -...
5468
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5469
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
5470
5471
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5472
  			WARN("VOLATILE",
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
5473
5474
  			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5475
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5476
5477
5478
5479
  # Check for user-visible strings broken across lines, which breaks the ability
  # to grep for the string.  Make exceptions when the previous string ends in a
  # newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
  # (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
33acb54a4   Joe Perches   checkpatch: use $...
5480
  		if ($line =~ /^\+\s*$String/ &&
5e4f6ba5e   Joe Perches   checkpatch: add a...
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
  		    $prevline =~ /"\s*$/ &&
  		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
  			if (WARN("SPLIT_STRING",
  				 "quoted string split across lines
  " . $hereprev) &&
  				     $fix &&
  				     $prevrawline =~ /^\+.*"\s*$/ &&
  				     $last_coalesced_string_linenr != $linenr - 1) {
  				my $extracted_string = get_quoted_string($line, $rawline);
  				my $comma_close = "";
  				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
  					$comma_close = $1;
  				}
  
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/"\s*$//;
  				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
  				fix_insert_line($fixlinenr - 1, $fixedline);
  				$fixedline = $rawline;
  				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
  				if ($fixedline !~ /\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  				$last_coalesced_string_linenr = $linenr;
  			}
  		}
  
  # check for missing a space in a string concatenation
  		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
  			WARN('MISSING_SPACE',
  			     "break quoted strings at a space character
  " . $hereprev);
  		}
e4b7d3091   Joe Perches   checkpatch: clari...
5516
5517
5518
5519
  # check for an embedded function name in a string when the function is known
  # This does not work very well for -f --file checking as it depends on patch
  # context providing the function name or a single line form for in-file
  # function declarations
77cb8546b   Joe Perches   checkpatch: warn ...
5520
5521
  		if ($line =~ /^\+.*$String/ &&
  		    defined($context_function) &&
e4b7d3091   Joe Perches   checkpatch: clari...
5522
5523
  		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
  		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
77cb8546b   Joe Perches   checkpatch: warn ...
5524
  			WARN("EMBEDDED_FUNCTION_NAME",
e4b7d3091   Joe Perches   checkpatch: clari...
5525
5526
  			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string
  " . $herecurr);
77cb8546b   Joe Perches   checkpatch: warn ...
5527
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
  			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
  				 "unnecessary whitespace before a quoted newline
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\
  /$1\
  /;
  			}
  
  		}
f17dba4fc   Joe Perches   checkpatch: add -...
5541
  # concatenated string without spaces between elements
79682c0c0   Joe Perches   checkpatch: add -...
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
  		if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) {
  			if (CHK("CONCATENATED_STRING",
  				"Concatenated strings should use spaces between elements
  " . $herecurr) &&
  			    $fix) {
  				while ($line =~ /($String)/g) {
  					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
  					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/;
  					$fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/;
  				}
  			}
f17dba4fc   Joe Perches   checkpatch: add -...
5553
  		}
90ad30e5b   Joe Perches   checkpatch: add t...
5554
  # uncoalesced string fragments
33acb54a4   Joe Perches   checkpatch: use $...
5555
  		if ($line =~ /$String\s*"/) {
79682c0c0   Joe Perches   checkpatch: add -...
5556
5557
5558
5559
5560
5561
5562
5563
5564
  			if (WARN("STRING_FRAGMENTS",
  				 "Consecutive strings are generally better as a single string
  " . $herecurr) &&
  			    $fix) {
  				while ($line =~ /($String)(?=\s*")/g) {
  					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
  					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e;
  				}
  			}
90ad30e5b   Joe Perches   checkpatch: add t...
5565
  		}
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5566
5567
5568
  # check for non-standard and hex prefixed decimal printf formats
  		my $show_L = 1;	#don't show the same defect twice
  		my $show_Z = 1;
5e4f6ba5e   Joe Perches   checkpatch: add a...
5569
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5570
  			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5e4f6ba5e   Joe Perches   checkpatch: add a...
5571
  			$string =~ s/%%/__/g;
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5572
5573
  			# check for %L
  			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5574
  				WARN("PRINTF_L",
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
  				     "\%L$1 is non-standard C, use %ll$1
  " . $herecurr);
  				$show_L = 0;
  			}
  			# check for %Z
  			if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
  				WARN("PRINTF_Z",
  				     "%Z$1 is non-standard C, use %z$1
  " . $herecurr);
  				$show_Z = 0;
  			}
  			# check for 0x<decimal>
  			if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
  				ERROR("PRINTF_0XDECIMAL",
6e3007574   Joe Perches   checkpatch: emit ...
5589
5590
5591
  				      "Prefixing 0x with decimal output is defective
  " . $herecurr);
  			}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5592
5593
5594
  		}
  
  # check for line continuations in quoted strings with odd counts of "
3f7f335db   Joe Perches   checkpatch: impro...
5595
  		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5596
5597
5598
5599
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
5600
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
5601
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
60f890105   Prakruthi Deepak Heragu   checkpatch: check...
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
  			WARN("IF_0",
  			     "Consider removing the code enclosed by this #if 0 and its #endif
  " . $herecurr);
  		}
  
  # warn about #if 1
  		if ($line =~ /^.\s*\#\s*if\s+1\b/) {
  			WARN("IF_1",
  			     "Consider removing the #if 1 and its #endif
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5612
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
5613
5614
  # check for needless "if (<foo>) fn(<foo>)" uses
  		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
100425dee   Joe Perches   checkpatch: add s...
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
  			my $tested = quotemeta($1);
  			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
  			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
  				my $func = $1;
  				if (WARN('NEEDLESS_IF',
  					 "$func(NULL) is safe and this check is probably not required
  " . $hereprev) &&
  				    $fix) {
  					my $do_fix = 1;
  					my $leading_tabs = "";
  					my $new_leading_tabs = "";
  					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
  						$leading_tabs = $1;
  					} else {
  						$do_fix = 0;
  					}
  					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
  						$new_leading_tabs = $1;
  						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
  							$do_fix = 0;
  						}
  					} else {
  						$do_fix = 0;
  					}
  					if ($do_fix) {
  						fix_delete_line($fixlinenr - 1, $prevrawline);
  						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
  					}
  				}
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
5644
5645
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5646

ebfdc4096   Joe Perches   checkpatch: attem...
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
  # check for unnecessary "Out of Memory" messages
  		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
  		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
  		    (defined $1 || defined $3) &&
  		    $linenr > 3) {
  			my $testval = $2;
  			my $testline = $lines[$linenr - 3];
  
  			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
  #			print("line: <$line>
  prevline: <$prevline>
  s: <$s>
  c: <$c>
  
  
  ");
fb0d0e088   Joe Perches   checkpatch: impro...
5663
5664
  			if ($s =~ /(?:^|
  )[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) {
ebfdc4096   Joe Perches   checkpatch: attem...
5665
5666
5667
5668
5669
  				WARN("OOM_MESSAGE",
  				     "Possible unnecessary 'out of memory' message
  " . $hereprev);
  			}
  		}
f78d98f6c   Joe Perches   checkpatch: warn ...
5670
  # check for logging functions with KERN_<LEVEL>
dcaf11236   Paolo Bonzini   checkpatch: fix U...
5671
  		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6c   Joe Perches   checkpatch: warn ...
5672
5673
5674
5675
5676
5677
5678
5679
5680
  		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
  			my $level = $1;
  			if (WARN("UNNECESSARY_KERN_LEVEL",
  				 "Possible unnecessary $level
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
  			}
  		}
45c55e92f   Joe Perches   checkpatch: warn ...
5681
5682
5683
5684
5685
5686
  # check for logging continuations
  		if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
  			WARN("LOGGING_CONTINUATION",
  			     "Avoid logging continuation uses where feasible
  " . $herecurr);
  		}
abb08a538   Joe Perches   checkpatch: try t...
5687
  # check for mask then right shift without a parentheses
5b57980de   Joe Perches   checkpatch: impro...
5688
  		if ($perl_version_ok &&
abb08a538   Joe Perches   checkpatch: try t...
5689
5690
5691
5692
5693
5694
  		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
  		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
  			WARN("MASK_THEN_SHIFT",
  			     "Possible precedence defect with mask then right shift - may need parentheses
  " . $herecurr);
  		}
b75ac618d   Joe Perches   checkpatch: add -...
5695
  # check for pointer comparisons to NULL
5b57980de   Joe Perches   checkpatch: impro...
5696
  		if ($perl_version_ok) {
b75ac618d   Joe Perches   checkpatch: add -...
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
  			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
  				my $val = $1;
  				my $equal = "!";
  				$equal = "" if ($4 eq "!=");
  				if (CHK("COMPARISON_TO_NULL",
  					"Comparison to NULL could be written \"${equal}${val}\"
  " . $herecurr) &&
  					    $fix) {
  					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
  				}
  			}
  		}
8716de383   Joe Perches   checkpatch: add t...
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
  # check for bad placement of section $InitAttribute (e.g.: __initdata)
  		if ($line =~ /(\b$InitAttribute\b)/) {
  			my $attr = $1;
  			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
  				my $ptr = $1;
  				my $var = $2;
  				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
  				      ERROR("MISPLACED_INIT",
  					    "$attr should be placed after $var
  " . $herecurr)) ||
  				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
  				      WARN("MISPLACED_INIT",
  					   "$attr should be placed after $var
  " . $herecurr))) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5724
  					$fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
8716de383   Joe Perches   checkpatch: add t...
5725
5726
5727
  				}
  			}
  		}
e970b8846   Joe Perches   checkpatch: add r...
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
  # check for $InitAttributeData (ie: __initdata) with const
  		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
  			my $attr = $1;
  			$attr =~ /($InitAttributePrefix)(.*)/;
  			my $attr_prefix = $1;
  			my $attr_type = $2;
  			if (ERROR("INIT_ATTRIBUTE",
  				  "Use of const init definition must use ${attr_prefix}initconst
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5738
  				$fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
  				    s/$InitAttributeData/${attr_prefix}initconst/;
  			}
  		}
  
  # check for $InitAttributeConst (ie: __initconst) without const
  		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
  			my $attr = $1;
  			if (ERROR("INIT_ATTRIBUTE",
  				  "Use of $attr requires a separate use of const
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5750
  				my $lead = $fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
5751
5752
5753
5754
  				    /(^\+\s*(?:static\s+))/;
  				$lead = rtrim($1);
  				$lead = "$lead " if ($lead !~ /^\+$/);
  				$lead = "${lead}const ";
194f66fc9   Joe Perches   checkpatch: add a...
5755
  				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b8846   Joe Perches   checkpatch: add r...
5756
5757
  			}
  		}
c17893c74   Joe Perches   checkpatch: add a...
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
  # check for __read_mostly with const non-pointer (should just be const)
  		if ($line =~ /\b__read_mostly\b/ &&
  		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
  			if (ERROR("CONST_READ_MOSTLY",
  				  "Invalid use of __read_mostly with const type
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
  			}
  		}
fbdb8138c   Joe Perches   checkpatch: warn ...
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
  # don't use __constant_<foo> functions outside of include/uapi/
  		if ($realfile !~ m@^include/uapi/@ &&
  		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
  			my $constant_func = $1;
  			my $func = $constant_func;
  			$func =~ s/^__constant_//;
  			if (WARN("CONSTANT_CONVERSION",
  				 "$constant_func should be $func
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5778
  				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138c   Joe Perches   checkpatch: warn ...
5779
5780
  			}
  		}
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5781
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
5782
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c3   Joe Perches   checkpatch: add t...
5783
  			my $delay = $1;
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5784
  			# ignore udelay's < 10, however
43c1d77c3   Joe Perches   checkpatch: add t...
5785
  			if (! ($delay < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5786
  				CHK("USLEEP_RANGE",
43c1d77c3   Joe Perches   checkpatch: add t...
5787
5788
5789
5790
5791
5792
5793
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt
  " . $herecurr);
  			}
  			if ($delay > 2000) {
  				WARN("LONG_UDELAY",
  				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h
  " . $herecurr);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5794
5795
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
5796
5797
5798
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5799
  				WARN("MSLEEP",
43c1d77c3   Joe Perches   checkpatch: add t...
5800
5801
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $herecurr);
09ef87255   Patrick Pannuto   checkpatch: warn ...
5802
5803
  			}
  		}
36ec19390   Joe Perches   checkpatch: warn ...
5804
5805
5806
5807
5808
5809
  # check for comparisons of jiffies
  		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
  			WARN("JIFFIES_COMPARISON",
  			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends
  " . $herecurr);
  		}
9d7a34a51   Joe Perches   checkpatch: warn ...
5810
5811
5812
5813
5814
5815
  # check for comparisons of get_jiffies_64()
  		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
  			WARN("JIFFIES_COMPARISON",
  			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
5816
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
5817
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
5818
5819
5820
5821
5822
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5823
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
5824
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5825
5826
5827
5828
  			if (ERROR("SPACING",
  				  "exactly one space required after that #$1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5829
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5830
5831
  				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5832
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5833
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
5834
5835
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
5836
5837
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5838
5839
5840
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5841
5842
5843
  			}
  		}
  # check for memory barriers without a comment.
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
  
  		my $barriers = qr{
  			mb|
  			rmb|
  			wmb|
  			read_barrier_depends
  		}x;
  		my $barrier_stems = qr{
  			mb__before_atomic|
  			mb__after_atomic|
  			store_release|
  			load_acquire|
  			store_mb|
  			(?:$barriers)
  		}x;
  		my $all_barriers = qr{
  			(?:$barriers)|
43e361f23   Michael S. Tsirkin   checkpatch: add v...
5861
5862
  			smp_(?:$barrier_stems)|
  			virt_(?:$barrier_stems)
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
5863
5864
5865
  		}x;
  
  		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
5866
  			if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb99   Joe Perches   checkpatch: make ...
5867
5868
5869
  				WARN("MEMORY_BARRIER",
  				     "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5870
5871
  			}
  		}
3ad81779a   Paul E. McKenney   scripts: Make che...
5872

f4073b0f6   Michael S. Tsirkin   checkpatch: check...
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
  		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
  
  		if ($realfile !~ m@^include/asm-generic/@ &&
  		    $realfile !~ m@/barrier\.h$@ &&
  		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
  		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
  			WARN("MEMORY_BARRIER",
  			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic
  " . $herecurr);
  		}
cb426e99f   Joe Perches   checkpatch: check...
5883
5884
5885
5886
5887
5888
5889
5890
  # check for waitqueue_active without a comment.
  		if ($line =~ /\bwaitqueue_active\s*\(/) {
  			if (!ctx_has_comment($first_line, $linenr)) {
  				WARN("WAITQUEUE_ACTIVE",
  				     "waitqueue_active without comment
  " . $herecurr);
  			}
  		}
3ad81779a   Paul E. McKenney   scripts: Make che...
5891

91db2592e   Paul E. McKenney   checkpatch: Add w...
5892
5893
5894
5895
5896
5897
  # check for smp_read_barrier_depends and read_barrier_depends
  		if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) {
  			WARN("READ_BARRIER_DEPENDS",
  			     "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code
  " . $herecurr);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5898
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
5899
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5900
5901
5902
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
5903
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5904

596ed45b5   Joe Perches   checkpatch: impro...
5905
5906
5907
5908
5909
5910
  # check that the storage class is not after a type
  		if ($line =~ /\b($Type)\s+($Storage)\b/) {
  			WARN("STORAGE_CLASS",
  			     "storage class '$2' should be located before type '$1'
  " . $herecurr);
  		}
d4977c78e   Tobias Klauser   checkpatch: warn ...
5911
  # Check that the storage class is at the beginning of a declaration
596ed45b5   Joe Perches   checkpatch: impro...
5912
5913
5914
5915
  		if ($line =~ /\b$Storage\b/ &&
  		    $line !~ /^.\s*$Storage/ &&
  		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
  		    $1 !~ /[\,\)]\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5916
  			WARN("STORAGE_CLASS",
596ed45b5   Joe Perches   checkpatch: impro...
5917
5918
  			     "storage class should be at the beginning of the declaration
  " . $herecurr);
d4977c78e   Tobias Klauser   checkpatch: warn ...
5919
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
5920
5921
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5922
5923
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5924
5925
5926
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5927
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
5928
  # Check for __inline__ and __inline, prefer inline
2b7ab4539   Joe Perches   checkpatch: don't...
5929
5930
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5931
5932
5933
5934
  			if (WARN("INLINE",
  				 "plain inline is preferred over $1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5935
  				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc1   Joe Perches   checkpatch: add a...
5936
5937
  
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
5938
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
5939
  # Check for __attribute__ packed, prefer __packed
2b7ab4539   Joe Perches   checkpatch: don't...
5940
5941
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5942
5943
5944
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
5945
  		}
39b7e2878   Joe Perches   checkpatch: add a...
5946
  # Check for __attribute__ aligned, prefer __aligned
2b7ab4539   Joe Perches   checkpatch: don't...
5947
5948
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5949
5950
5951
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
5952
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
5953
  # Check for __attribute__ format(printf, prefer __printf
2b7ab4539   Joe Perches   checkpatch: don't...
5954
5955
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5956
5957
5958
5959
  			if (WARN("PREFER_PRINTF",
  				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5960
  				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
5961
5962
  
  			}
5f14d3bd8   Joe Perches   checkpatch: prefe...
5963
  		}
6061d949d   Joe Perches   include/ and chec...
5964
  # Check for __attribute__ format(scanf, prefer __scanf
2b7ab4539   Joe Perches   checkpatch: don't...
5965
5966
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5967
5968
5969
5970
  			if (WARN("PREFER_SCANF",
  				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5971
  				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
5972
  			}
6061d949d   Joe Perches   include/ and chec...
5973
  		}
619a908aa   Joe Perches   checkpatch: add e...
5974
  # Check for __attribute__ weak, or __weak declarations (may have link issues)
5b57980de   Joe Perches   checkpatch: impro...
5975
  		if ($perl_version_ok &&
619a908aa   Joe Perches   checkpatch: add e...
5976
5977
5978
5979
5980
5981
5982
  		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
  		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
  		     $line =~ /\b__weak\b/)) {
  			ERROR("WEAK_DECLARATION",
  			      "Using weak declarations can have unintended link defects
  " . $herecurr);
  		}
fd39f904b   Tomas Winkler   checkpatch: don't...
5983
  # check for c99 types like uint8_t used outside of uapi/ and tools/
e6176fa47   Joe Perches   checkpatch: add -...
5984
  		if ($realfile !~ m@\binclude/uapi/@ &&
fd39f904b   Tomas Winkler   checkpatch: don't...
5985
  		    $realfile !~ m@\btools/@ &&
e6176fa47   Joe Perches   checkpatch: add -...
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
  		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
  			my $type = $1;
  			if ($type =~ /\b($typeC99Typedefs)\b/) {
  				$type = $1;
  				my $kernel_type = 'u';
  				$kernel_type = 's' if ($type =~ /^_*[si]/);
  				$type =~ /(\d+)/;
  				$kernel_type .= $1;
  				if (CHK("PREFER_KERNEL_TYPES",
  					"Prefer kernel type '$kernel_type' over '$type'
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
  				}
  			}
  		}
938224b5e   Joe Perches   checkpatch: warn ...
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
  # check for cast of C90 native int or longer types constants
  		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
  			my $cast = $1;
  			my $const = $2;
  			if (WARN("TYPECAST_INT_CONSTANT",
  				 "Unnecessary typecast of c90 int constant
  " . $herecurr) &&
  			    $fix) {
  				my $suffix = "";
  				my $newconst = $const;
  				$newconst =~ s/${Int_type}$//;
  				$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
  				if ($cast =~ /\blong\s+long\b/) {
  					$suffix .= 'LL';
  				} elsif ($cast =~ /\blong\b/) {
  					$suffix .= 'L';
  				}
  				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
  			}
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
6022
6023
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6024
6025
6026
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
6027
  		}
66c80b607   Joe Perches   checkpatch: Add a...
6028
6029
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6030
6031
6032
6033
  			if (WARN("SIZEOF_PARENTHESIS",
  				 "sizeof $1 should be sizeof($1)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6034
  				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
6035
  			}
66c80b607   Joe Perches   checkpatch: Add a...
6036
  		}
88982fea5   Joe Perches   checkpatch: warn ...
6037
6038
6039
6040
6041
6042
  # check for struct spinlock declarations
  		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
  			WARN("USE_SPINLOCK_T",
  			     "struct spinlock should be spinlock_t
  " . $herecurr);
  		}
a6962d727   Joe Perches   checkpatch: Prefe...
6043
  # check for seq_printf uses that could be seq_puts
066687279   Joe Perches   checkpatch: updat...
6044
  		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d727   Joe Perches   checkpatch: Prefe...
6045
  			my $fmt = get_quoted_string($line, $rawline);
caac1d5fd   Heba Aamer   checkpatch: impro...
6046
6047
  			$fmt =~ s/%%//g;
  			if ($fmt !~ /%/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6048
6049
6050
6051
  				if (WARN("PREFER_SEQ_PUTS",
  					 "Prefer seq_puts to seq_printf
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6052
  					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc1   Joe Perches   checkpatch: add a...
6053
  				}
a6962d727   Joe Perches   checkpatch: Prefe...
6054
6055
  			}
  		}
478b17998   Joe Perches   checkpatch: impro...
6056
  # check for vsprintf extension %p<foo> misuses
5b57980de   Joe Perches   checkpatch: impro...
6057
  		if ($perl_version_ok &&
0b523769e   Joe Perches   checkpatch: add a...
6058
6059
6060
  		    defined $stat &&
  		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
  		    $1 !~ /^_*volatile_*$/) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6061
  			my $stat_real;
0b523769e   Joe Perches   checkpatch: add a...
6062
6063
6064
6065
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
  		        for (my $count = $linenr; $count <= $lc; $count++) {
ffe075132   Joe Perches   checkpatch: fix d...
6066
6067
6068
  				my $specifier;
  				my $extension;
  				my $bad_specifier = "";
0b523769e   Joe Perches   checkpatch: add a...
6069
6070
  				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
  				$fmt =~ s/%%//g;
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
  
  				while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
  					$specifier = $1;
  					$extension = $2;
  					if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) {
  						$bad_specifier = $specifier;
  						last;
  					}
  					if ($extension eq "x" && !defined($stat_real)) {
  						if (!defined($stat_real)) {
  							$stat_real = get_stat_real($linenr, $lc);
  						}
  						WARN("VSPRINTF_SPECIFIER_PX",
  						     "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.
  " . "$here
  $stat_real
  ");
  					}
1df7338ac   Sergey Senozhatsky   checkpatch: add p...
6089
  				}
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6090
6091
6092
6093
6094
6095
6096
6097
6098
  				if ($bad_specifier ne "") {
  					my $stat_real = get_stat_real($linenr, $lc);
  					my $ext_type = "Invalid";
  					my $use = "";
  					if ($bad_specifier =~ /p[Ff]/) {
  						$ext_type = "Deprecated";
  						$use = " - use %pS instead";
  						$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
  					}
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6099

e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6100
6101
6102
6103
6104
6105
  					WARN("VSPRINTF_POINTER_EXTENSION",
  					     "$ext_type vsprintf pointer extension '$bad_specifier'$use
  " . "$here
  $stat_real
  ");
  				}
0b523769e   Joe Perches   checkpatch: add a...
6106
6107
  			}
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
6108
  # Check for misused memsets
5b57980de   Joe Perches   checkpatch: impro...
6109
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6110
  		    defined $stat &&
9e20a8535   Mateusz Kulikowski   checkpatch: fix p...
6111
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6112
6113
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
6114
6115
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
6116

554e165cf   Andy Whitcroft   checkpatch: check...
6117
6118
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6119
6120
6121
6122
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
6123
6124
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6125
6126
6127
6128
6129
6130
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
98a9bba51   Joe Perches   checkpatch: prefe...
6131
  # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6132
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
  #		    defined $stat &&
  #		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
  #			if (WARN("PREFER_ETHER_ADDR_COPY",
  #				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)
  " . "$here
  $stat
  ") &&
  #			    $fix) {
  #				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
  #			}
  #		}
98a9bba51   Joe Perches   checkpatch: prefe...
6144

b6117d175   Mateusz Kulikowski   checkpatch: sugge...
6145
  # Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6146
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6147
6148
6149
6150
6151
6152
6153
6154
  #		    defined $stat &&
  #		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
  #			WARN("PREFER_ETHER_ADDR_EQUAL",
  #			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()
  " . "$here
  $stat
  ")
  #		}
b6117d175   Mateusz Kulikowski   checkpatch: sugge...
6155

8617cd09b   Mateusz Kulikowski   checkpatch: sugge...
6156
6157
  # check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
  # check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
5b57980de   Joe Perches   checkpatch: impro...
6158
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
  #		    defined $stat &&
  #		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
  #
  #			my $ms_val = $7;
  #
  #			if ($ms_val =~ /^(?:0x|)0+$/i) {
  #				if (WARN("PREFER_ETH_ZERO_ADDR",
  #					 "Prefer eth_zero_addr over memset()
  " . "$here
  $stat
  ") &&
  #				    $fix) {
  #					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
  #				}
  #			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
  #				if (WARN("PREFER_ETH_BROADCAST_ADDR",
  #					 "Prefer eth_broadcast_addr() over memset()
  " . "$here
  $stat
  ") &&
  #				    $fix) {
  #					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
  #				}
  #			}
  #		}
8617cd09b   Mateusz Kulikowski   checkpatch: sugge...
6184

d7c76ba7e   Joe Perches   checkpatch: impro...
6185
  # typecasts on min/max could be min_t/max_t
5b57980de   Joe Perches   checkpatch: impro...
6186
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6187
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
6188
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
6189
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6190
6191
6192
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
6193
6194
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
6195
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
6196
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
  					$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...
6208
6209
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
6210
  # check usleep_range arguments
5b57980de   Joe Perches   checkpatch: impro...
6211
  		if ($perl_version_ok &&
4a273195a   Joe Perches   checkpatch: check...
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
  		    defined $stat &&
  		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
  			my $min = $1;
  			my $max = $7;
  			if ($min eq $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
  				 $min > $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			}
  		}
823b794ce   Joe Perches   checkpatch: add c...
6231
  # check for naked sscanf
5b57980de   Joe Perches   checkpatch: impro...
6232
  		if ($perl_version_ok &&
823b794ce   Joe Perches   checkpatch: add c...
6233
  		    defined $stat &&
6c8bd7076   Joe Perches   checkpatch: avoid...
6234
  		    $line =~ /\bsscanf\b/ &&
823b794ce   Joe Perches   checkpatch: add c...
6235
6236
6237
6238
6239
6240
  		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
  		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
  		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6241
  			my $stat_real = get_stat_real($linenr, $lc);
823b794ce   Joe Perches   checkpatch: add c...
6242
6243
6244
6245
6246
6247
  			WARN("NAKED_SSCANF",
  			     "unchecked sscanf return value
  " . "$here
  $stat_real
  ");
  		}
afc819ab0   Joe Perches   checkpatch: prefe...
6248
  # check for simple sscanf that should be kstrto<foo>
5b57980de   Joe Perches   checkpatch: impro...
6249
  		if ($perl_version_ok &&
afc819ab0   Joe Perches   checkpatch: prefe...
6250
6251
6252
6253
6254
  		    defined $stat &&
  		    $line =~ /\bsscanf\b/) {
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6255
  			my $stat_real = get_stat_real($linenr, $lc);
afc819ab0   Joe Perches   checkpatch: prefe...
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
  			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
  				my $format = $6;
  				my $count = $format =~ tr@%@%@;
  				if ($count == 1 &&
  				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
  					WARN("SSCANF_TO_KSTRTO",
  					     "Prefer kstrto<type> to single variable sscanf
  " . "$here
  $stat_real
  ");
  				}
  			}
  		}
70dc8a483   Joe Perches   checkpatch: warn ...
6269
6270
6271
  # check for new externs in .h files.
  		if ($realfile =~ /\.h$/ &&
  		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780d   Joe Perches   checkpatch: make ...
6272
6273
6274
  			if (CHK("AVOID_EXTERNS",
  				"extern prototypes should be avoided in .h files
  " . $herecurr) &&
70dc8a483   Joe Perches   checkpatch: warn ...
6275
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6276
  				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a483   Joe Perches   checkpatch: warn ...
6277
6278
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6279
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
6280
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
6281
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
6282
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
6283
6284
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
6285
6286
6287
6288
6289
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
6290
6291
6292
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6293
6294
6295
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6296
6297
6298
6299
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6300
6301
6302
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6303
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6304
6305
6306
6307
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6308
6309
6310
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6311
  		}
a0ad75964   Joe Perches   checkpatch: impro...
6312
6313
  # check for function declarations that have arguments without identifier names
  		if (defined $stat &&
25bdda2bd   Miles Chen   checkpatch: suppo...
6314
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
ca0d8929e   Joe Perches   checkpatch: add w...
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
  		    $1 ne "void") {
  			my $args = trim($1);
  			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
  				my $arg = trim($1);
  				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
  					WARN("FUNCTION_ARGUMENTS",
  					     "function definition argument '$arg' should also have an identifier name
  " . $herecurr);
  				}
  			}
  		}
a0ad75964   Joe Perches   checkpatch: impro...
6326
  # check for function definitions
5b57980de   Joe Perches   checkpatch: impro...
6327
  		if ($perl_version_ok &&
a0ad75964   Joe Perches   checkpatch: impro...
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
  		    defined $stat &&
  		    $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
  			$context_function = $1;
  
  # check for multiline function definition with misplaced open brace
  			my $ok = 0;
  			my $cnt = statement_rawlines($stat);
  			my $herectx = $here . "
  ";
  			for (my $n = 0; $n < $cnt; $n++) {
  				my $rl = raw_line($linenr, $n);
  				$herectx .=  $rl . "
  ";
  				$ok = 1 if ($rl =~ /^[ \+]\{/);
  				$ok = 1 if ($rl =~ /\{/ && $n == 0);
  				last if $rl =~ /^[ \+].*\{/;
  			}
  			if (!$ok) {
  				ERROR("OPEN_BRACE",
  				      "open brace '{' following function definitions go on the next line
  " . $herectx);
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6351
6352
6353
6354
6355
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6356
  				CHK("UNDOCUMENTED_SETUP",
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
6357
6358
  				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6359
  			}
653d4876b   Andy Whitcroft   update checkpatch...
6360
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6361
6362
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
6363
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6364
6365
6366
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6367
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6368

a640d25ce   Joe Perches   checkpatch: add -...
6369
6370
  # alloc style
  # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
5b57980de   Joe Perches   checkpatch: impro...
6371
  		if ($perl_version_ok &&
a640d25ce   Joe Perches   checkpatch: add -...
6372
6373
6374
6375
6376
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
  			CHK("ALLOC_SIZEOF_STRUCT",
  			    "Prefer $3(sizeof(*$1)...) over $3($4...)
  " . $herecurr);
  		}
60a55369a   Joe Perches   checkpatch: add w...
6377
  # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
5b57980de   Joe Perches   checkpatch: impro...
6378
  		if ($perl_version_ok &&
1b4a2ed4c   Joe Perches   checkpatch: impro...
6379
6380
  		    defined $stat &&
  		    $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
60a55369a   Joe Perches   checkpatch: add w...
6381
6382
6383
6384
6385
  			my $oldfunc = $3;
  			my $a1 = $4;
  			my $a2 = $10;
  			my $newfunc = "kmalloc_array";
  			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a9   Joe Perches   checkpatch: emit ...
6386
6387
6388
6389
6390
6391
6392
6393
  			my $r1 = $a1;
  			my $r2 = $a2;
  			if ($a1 =~ /^sizeof\s*\S/) {
  				$r1 = $a2;
  				$r2 = $a1;
  			}
  			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
  			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
1b4a2ed4c   Joe Perches   checkpatch: impro...
6394
  				my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6395
  				my $herectx = get_stat_here($linenr, $cnt, $here);
60a55369a   Joe Perches   checkpatch: add w...
6396
  				if (WARN("ALLOC_WITH_MULTIPLY",
1b4a2ed4c   Joe Perches   checkpatch: impro...
6397
6398
6399
  					 "Prefer $newfunc over $oldfunc with multiply
  " . $herectx) &&
  				    $cnt == 1 &&
60a55369a   Joe Perches   checkpatch: add w...
6400
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6401
  					$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
60a55369a   Joe Perches   checkpatch: add w...
6402
6403
6404
  				}
  			}
  		}
972fdea2e   Joe Perches   checkpatch: add c...
6405
  # check for krealloc arg reuse
5b57980de   Joe Perches   checkpatch: impro...
6406
  		if ($perl_version_ok &&
4cab63cea   Joe Perches   checkpatch: fix k...
6407
6408
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
  		    $1 eq $3) {
972fdea2e   Joe Perches   checkpatch: add c...
6409
6410
6411
6412
  			WARN("KREALLOC_ARG_REUSE",
  			     "Reusing the krealloc arg is almost always a bug
  " . $herecurr);
  		}
5ce59ae0b   Joe Perches   checkpatch: Add c...
6413
6414
6415
6416
6417
6418
  # check for alloc argument mismatch
  		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
  			WARN("ALLOC_ARRAY_ARGS",
  			     "$1 uses number as first arg, sizeof is generally wrong
  " . $herecurr);
  		}
caf2a54f1   Joe Perches   scripts/checkpatc...
6419
6420
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6421
6422
6423
6424
  			if (WARN("ONE_SEMICOLON",
  				 "Statements terminations use 1 semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6425
  				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6426
  			}
d1e2ad07e   Joe Perches   checkpatch: add -...
6427
  		}
cec3aaa56   Tomas Winkler   checkpatch: don't...
6428
6429
6430
  # check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
  		if ($realfile !~ m@^include/uapi/@ &&
  		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
0ab901918   Joe Perches   checkpatch: add -...
6431
6432
6433
6434
6435
6436
6437
6438
6439
  			my $ull = "";
  			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
  			if (CHK("BIT_MACRO",
  				"Prefer using the BIT$ull macro
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
  			}
  		}
2d6327459   Joe Perches   checkpatch: add P...
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
  # check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
  		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
  			my $config = $1;
  			if (WARN("PREFER_IS_ENABLED",
  				 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
  			}
  		}
e81f239b4   Joe Perches   checkpatch: fix f...
6450
  # check for case / default statements not preceded by break/fallthrough/switch
c34c09a84   Joe Perches   checkpatch: attem...
6451
6452
6453
6454
6455
  		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
  			my $has_break = 0;
  			my $has_statement = 0;
  			my $count = 0;
  			my $prevline = $linenr;
e81f239b4   Joe Perches   checkpatch: fix f...
6456
  			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a84   Joe Perches   checkpatch: attem...
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
  				$prevline--;
  				my $rline = $rawlines[$prevline - 1];
  				my $fline = $lines[$prevline - 1];
  				last if ($fline =~ /^\@\@/);
  				next if ($fline =~ /^\-/);
  				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
  				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
  				next if ($fline =~ /^.[\s$;]*$/);
  				$has_statement = 1;
  				$count++;
258f79d5a   Heinrich Schuchardt   scripts/checkpatc...
6467
  				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/);
c34c09a84   Joe Perches   checkpatch: attem...
6468
6469
6470
  			}
  			if (!$has_break && $has_statement) {
  				WARN("MISSING_BREAK",
224236d9c   Andrew Morton   scripts/checkpatc...
6471
6472
  				     "Possible switch case/default not preceded by break or fallthrough comment
  " . $herecurr);
c34c09a84   Joe Perches   checkpatch: attem...
6473
6474
  			}
  		}
d1e2ad07e   Joe Perches   checkpatch: add -...
6475
  # check for switch/default statements without a break;
5b57980de   Joe Perches   checkpatch: impro...
6476
  		if ($perl_version_ok &&
d1e2ad07e   Joe Perches   checkpatch: add -...
6477
6478
  		    defined $stat &&
  		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
d1e2ad07e   Joe Perches   checkpatch: add -...
6479
  			my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6480
  			my $herectx = get_stat_here($linenr, $cnt, $here);
d1e2ad07e   Joe Perches   checkpatch: add -...
6481
6482
6483
  			WARN("DEFAULT_NO_BREAK",
  			     "switch default: should use break
  " . $herectx);
caf2a54f1   Joe Perches   scripts/checkpatc...
6484
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6485
  # check for gcc specific __FUNCTION__
d5e616fc1   Joe Perches   checkpatch: add a...
6486
6487
6488
6489
6490
  		if ($line =~ /\b__FUNCTION__\b/) {
  			if (WARN("USE_FUNC",
  				 "__func__ should be used instead of gcc specific __FUNCTION__
  "  . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6491
  				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6492
  			}
13214adf7   Andy Whitcroft   update checkpatch...
6493
  		}
773647a09   Andy Whitcroft   update checkpatch...
6494

62ec818f5   Joe Perches   checkpatch: emit ...
6495
6496
6497
6498
6499
6500
  # check for uses of __DATE__, __TIME__, __TIMESTAMP__
  		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
  			ERROR("DATE_TIME",
  			      "Use of the '$1' macro makes the build non-deterministic
  " . $herecurr);
  		}
2c92488ab   Joe Perches   checkpatch: warn ...
6501
6502
6503
6504
6505
6506
  # check for use of yield()
  		if ($line =~ /\byield\s*\(\s*\)/) {
  			WARN("YIELD",
  			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)
  "  . $herecurr);
  		}
179f8f40f   Joe Perches   checkpatch: add a...
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
  # check for comparisons against true and false
  		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
  			my $lead = $1;
  			my $arg = $2;
  			my $test = $3;
  			my $otype = $4;
  			my $trail = $5;
  			my $op = "!";
  
  			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
  
  			my $type = lc($otype);
  			if ($type =~ /^(?:true|false)$/) {
  				if (("$test" eq "==" && "$type" eq "true") ||
  				    ("$test" eq "!=" && "$type" eq "false")) {
  					$op = "";
  				}
  
  				CHK("BOOL_COMPARISON",
  				    "Using comparison to $otype is error prone
  " . $herecurr);
  
  ## maybe suggesting a correct construct would better
  ##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'
  " . $herecurr);
  
  			}
  		}
5d4309026   Joe Perches   checkpatch: whing...
6535
6536
6537
6538
6539
6540
  # check for bool bitfields
  		if ($sline =~ /^.\s+bool\s*$Ident\s*:\s*\d+\s*;/) {
  			WARN("BOOL_BITFIELD",
  			     "Avoid using bool as bitfield.  Prefer bool bitfields as unsigned int or u<8|16|32>
  " . $herecurr);
  		}
d729593e4   Joe Perches   checkpatch: add a...
6541
6542
6543
6544
6545
6546
6547
  # check for bool use in .h files
  		if ($realfile =~ /\.h$/ &&
  		    $sline =~ /^.\s+bool\s*$Ident\s*(?::\s*d+\s*)?;/) {
  			CHK("BOOL_MEMBER",
  			    "Avoid using bool structure members because of possible alignment issues - see: https://lkml.org/lkml/2017/11/21/384
  " . $herecurr);
  		}
4882720b2   Thomas Gleixner   semaphore: Remove...
6548
6549
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6550
6551
6552
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6553
  		}
6712d8585   Joe Perches   checkpatch: white...
6554

67d0a0754   Joe Perches   kernel.h/checkpat...
6555
6556
  # 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...
6557
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
6558
6559
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6560
  		}
6712d8585   Joe Perches   checkpatch: white...
6561

ae3ccc467   Fabian Frederick   scripts/checkpatc...
6562
  # check for __initcall(), use device_initcall() explicitly or more appropriate function please
f3db6639f   Michael Ellerman   checkpatch: add a...
6563
  		if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6564
  			WARN("USE_DEVICE_INITCALL",
ae3ccc467   Fabian Frederick   scripts/checkpatc...
6565
6566
  			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)
  " . $herecurr);
f3db6639f   Michael Ellerman   checkpatch: add a...
6567
  		}
6712d8585   Joe Perches   checkpatch: white...
6568

0f3c5aab5   Joe Perches   checkpatch: add o...
6569
  # check for various structs that are normally const (ops, kgdb, device_tree)
d9190e4e1   Joe Perches   checkpatch: avoid...
6570
  # and avoid what seem like struct definitions 'struct foo {'
6903ffb22   Andy Whitcroft   checkpatch: struc...
6571
  		if ($line !~ /\bconst\b/ &&
d9190e4e1   Joe Perches   checkpatch: avoid...
6572
  		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6573
  			WARN("CONST_STRUCT",
d9190e4e1   Joe Perches   checkpatch: avoid...
6574
6575
  			     "struct $1 should normally be const
  " . $herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
6576
  		}
773647a09   Andy Whitcroft   update checkpatch...
6577
6578
6579
6580
  
  # 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...
6581
6582
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
6583
6584
6585
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
6586
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6587
6588
6589
  			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...
6590
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6591

52ea85061   Joe Perches   checkpatch: add t...
6592
6593
6594
6595
6596
6597
  # Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
  		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
  			ERROR("DEFINE_ARCH_HAS",
  			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead
  " . $herecurr);
  		}
acd9362c2   Joe Perches   checkpatch: add l...
6598
  # likely/unlikely comparisons similar to "(likely(foo) > 0)"
5b57980de   Joe Perches   checkpatch: impro...
6599
  		if ($perl_version_ok &&
acd9362c2   Joe Perches   checkpatch: add l...
6600
6601
6602
6603
6604
  		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
  			WARN("LIKELY_MISUSE",
  			     "Using $1 should generally have parentheses around the comparison
  " . $herecurr);
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
6605
6606
6607
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6608
6609
6610
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
6611
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6612
6613
6614
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
6615
6616
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6617

0f5225b02   Peter Zijlstra   locking/mutex, dr...
6618
6619
6620
6621
6622
6623
  # check for mutex_trylock_recursive usage
  		if ($line =~ /mutex_trylock_recursive/) {
  			ERROR("LOCKING",
  			      "recursive locking is bad, do not use this ever.
  " . $herecurr);
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6624
6625
6626
6627
6628
6629
  # 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...
6630
6631
6632
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6633
6634
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
6635

b392c64f5   Joe Perches   checkpatch: match...
6636
6637
  		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
  		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6638
6639
6640
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
6641
  		}
2435880fe   Joe Perches   checkpatch: add c...
6642

001804689   Joe Perches   checkpatch: add a...
6643
6644
6645
  # check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
  # and whether or not function naming is typical and if
  # DEVICE_ATTR permissions uses are unusual too
5b57980de   Joe Perches   checkpatch: impro...
6646
  		if ($perl_version_ok &&
001804689   Joe Perches   checkpatch: add a...
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
  		    defined $stat &&
  		    $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
  			my $var = $1;
  			my $perms = $2;
  			my $show = $3;
  			my $store = $4;
  			my $octal_perms = perms_to_octal($perms);
  			if ($show =~ /^${var}_show$/ &&
  			    $store =~ /^${var}_store$/ &&
  			    $octal_perms eq "0644") {
  				if (WARN("DEVICE_ATTR_RW",
  					 "Use DEVICE_ATTR_RW
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
  				}
  			} elsif ($show =~ /^${var}_show$/ &&
  				 $store =~ /^NULL$/ &&
  				 $octal_perms eq "0444") {
  				if (WARN("DEVICE_ATTR_RO",
  					 "Use DEVICE_ATTR_RO
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
  				}
  			} elsif ($show =~ /^NULL$/ &&
  				 $store =~ /^${var}_store$/ &&
  				 $octal_perms eq "0200") {
  				if (WARN("DEVICE_ATTR_WO",
  					 "Use DEVICE_ATTR_WO
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
  				}
  			} elsif ($octal_perms eq "0644" ||
  				 $octal_perms eq "0444" ||
  				 $octal_perms eq "0200") {
  				my $newshow = "$show";
  				$newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
  				my $newstore = $store;
  				$newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
  				my $rename = "";
  				if ($show ne $newshow) {
  					$rename .= " '$show' to '$newshow'";
  				}
  				if ($store ne $newstore) {
  					$rename .= " '$store' to '$newstore'";
  				}
  				WARN("DEVICE_ATTR_FUNCTIONS",
  				     "Consider renaming function(s)$rename
  " . $herecurr);
  			} else {
  				WARN("DEVICE_ATTR_PERMS",
  				     "DEVICE_ATTR unusual permissions '$perms' used
  " . $herecurr);
  			}
  		}
515a235ef   Joe Perches   checkpatch: impro...
6704
6705
  # Mode permission misuses where it seems decimal should be octal
  # This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
73121534c   Joe Perches   checkpatch: ignor...
6706
6707
6708
6709
  # o Ignore module_param*(...) uses with a decimal 0 permission as that has a
  #   specific definition of not visible in sysfs.
  # o Ignore proc_create*(...) uses with a decimal 0 permission as that means
  #   use the default permissions
5b57980de   Joe Perches   checkpatch: impro...
6710
  		if ($perl_version_ok &&
459cf0ae5   Joe Perches   checkpatch: impro...
6711
  		    defined $stat &&
515a235ef   Joe Perches   checkpatch: impro...
6712
6713
6714
6715
  		    $line =~ /$mode_perms_search/) {
  			foreach my $entry (@mode_permission_funcs) {
  				my $func = $entry->[0];
  				my $arg_pos = $entry->[1];
459cf0ae5   Joe Perches   checkpatch: impro...
6716
6717
6718
  				my $lc = $stat =~ tr@
  @@;
  				$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6719
  				my $stat_real = get_stat_real($linenr, $lc);
459cf0ae5   Joe Perches   checkpatch: impro...
6720

515a235ef   Joe Perches   checkpatch: impro...
6721
6722
6723
6724
6725
  				my $skip_args = "";
  				if ($arg_pos > 1) {
  					$arg_pos--;
  					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
  				}
f90774e1f   Joe Perches   checkpatch: look ...
6726
  				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
459cf0ae5   Joe Perches   checkpatch: impro...
6727
  				if ($stat =~ /$test/) {
515a235ef   Joe Perches   checkpatch: impro...
6728
6729
  					my $val = $1;
  					$val = $6 if ($skip_args ne "");
73121534c   Joe Perches   checkpatch: ignor...
6730
6731
6732
  					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
  					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
  					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
515a235ef   Joe Perches   checkpatch: impro...
6733
  						ERROR("NON_OCTAL_PERMISSIONS",
459cf0ae5   Joe Perches   checkpatch: impro...
6734
6735
6736
  						      "Use 4 digit octal (0777) not decimal permissions
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
6737
6738
  					}
  					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
c0a5c8985   Joe Perches   checkpatch: impro...
6739
  						ERROR("EXPORTED_WORLD_WRITABLE",
459cf0ae5   Joe Perches   checkpatch: impro...
6740
6741
6742
  						      "Exporting writable files is usually an error. Consider more restrictive permissions.
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
6743
  					}
2435880fe   Joe Perches   checkpatch: add c...
6744
6745
6746
  				}
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
6747

459cf0ae5   Joe Perches   checkpatch: impro...
6748
  # check for uses of S_<PERMS> that could be octal for readability
bc22d9a7d   Joe Perches   checkpatch: test ...
6749
  		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
001804689   Joe Perches   checkpatch: add a...
6750
6751
  			my $oval = $1;
  			my $octal = perms_to_octal($oval);
459cf0ae5   Joe Perches   checkpatch: impro...
6752
6753
6754
6755
  			if (WARN("SYMBOLIC_PERMS",
  				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.
  " . $herecurr) &&
  			    $fix) {
001804689   Joe Perches   checkpatch: add a...
6756
  				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
459cf0ae5   Joe Perches   checkpatch: impro...
6757
6758
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
  # validate content of MODULE_LICENSE against list from include/linux/module.h
  		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
  			my $extracted_string = get_quoted_string($line, $rawline);
  			my $valid_licenses = qr{
  						GPL|
  						GPL\ v2|
  						GPL\ and\ additional\ rights|
  						Dual\ BSD/GPL|
  						Dual\ MIT/GPL|
  						Dual\ MPL/GPL|
  						Proprietary
  					}x;
  			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
  				WARN("MODULE_LICENSE",
  				     "unknown module license " . $extracted_string . "
  " . $herecurr);
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6777
6778
6779
6780
6781
6782
  	}
  
  	# 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...
6783
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
  	# 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);
  	}
a08ffbef4   Stafford Horne   checkpatch: fix i...
6795
  	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6796
6797
6798
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
6799
  	}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
  	if ($is_patch && $has_commit_log && $chk_signoff) {
  		if ($signoff == 0) {
  			ERROR("MISSING_SIGN_OFF",
  			      "Missing Signed-off-by: line(s)
  ");
  		} elsif (!$authorsignoff) {
  			WARN("NO_AUTHOR_SIGN_OFF",
  			     "Missing Signed-off-by: line by nominal patch author '$author'
  ");
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
6810
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6811
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
6812
6813
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
6814
6815
6816
6817
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
6818
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6819

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
6820
  	if ($quiet == 0) {
ef2121963   Joe Perches   checkpatch: adver...
6821
6822
6823
6824
6825
6826
6827
6828
  		# If there were any defects found and not already fixing them
  		if (!$clean and !$fix) {
  			print << "EOM"
  
  NOTE: For some of the reported defects, checkpatch may be able to
        mechanically convert to the typical style using --fix or --fix-inplace.
  EOM
  		}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
6829
6830
6831
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
b0781216e   Mike Frysinger   scripts/checkpatc...
6832
  			$rpt_cleaners = 0;
d8469f162   Joe Perches   checkpatch: impro...
6833
6834
6835
6836
6837
  			print << "EOM"
  
  NOTE: Whitespace errors detected.
        You may wish to use scripts/cleanpatch or scripts/cleanfile
  EOM
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
6838
6839
  		}
  	}
d752fcc88   Joe Perches   checkpatch: add a...
6840
6841
6842
  	if ($clean == 0 && $fix &&
  	    ("@rawlines" ne "@fixed" ||
  	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d65   Joe Perches   checkpatch: add a...
6843
6844
  		my $newfile = $filename;
  		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5bc   Joe Perches   checkpatch: creat...
6845
6846
  		my $linecount = 0;
  		my $f;
d752fcc88   Joe Perches   checkpatch: add a...
6847
  		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
3705ce5bc   Joe Perches   checkpatch: creat...
6848
6849
6850
6851
6852
6853
6854
6855
  		open($f, '>', $newfile)
  		    or die "$P: Can't open $newfile for write
  ";
  		foreach my $fixed_line (@fixed) {
  			$linecount++;
  			if ($file) {
  				if ($linecount > 3) {
  					$fixed_line =~ s/^\+//;
d752fcc88   Joe Perches   checkpatch: add a...
6856
6857
  					print $f $fixed_line . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
  				}
  			} else {
  				print $f $fixed_line . "
  ";
  			}
  		}
  		close($f);
  
  		if (!$quiet) {
  			print << "EOM";
d8469f162   Joe Perches   checkpatch: impro...
6868

3705ce5bc   Joe Perches   checkpatch: creat...
6869
6870
6871
6872
6873
6874
6875
  Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
  
  Do _NOT_ trust the results written to this file.
  Do _NOT_ submit these changes without inspecting them for correctness.
  
  This EXPERIMENTAL file is simply a convenience to help rewrite patches.
  No warranties, expressed or implied...
3705ce5bc   Joe Perches   checkpatch: creat...
6876
6877
6878
  EOM
  		}
  	}
d8469f162   Joe Perches   checkpatch: impro...
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
  	if ($quiet == 0) {
  		print "
  ";
  		if ($clean == 1) {
  			print "$vname has no obvious style problems and is ready for submission.
  ";
  		} else {
  			print "$vname has style problems, please review.
  ";
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
6889
6890
6891
  	}
  	return $clean;
  }