Blame view

scripts/checkpatch.pl 199 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";
98005e8c7   Vadim Bendebury   checkpatch: allow...
64
  my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
dbbf869da   Joe Perches   checkpatch: make ...
65
66
  # git output parsing needs US English output, so first set backtick child process LANGUAGE
  my $git_command ='export LANGUAGE=en_US.UTF-8; git';
77f5b10a8   Hannes Eder   checkpatch: make ...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  
  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 -...
82
    --showfile                 emit diffed file position, not input file position
4a593c344   Du, Changbin   checkpatch: add s...
83
84
85
86
87
88
89
90
91
92
    -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 ...
93
94
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
3beb42ece   Joe Perches   checkpatch: add -...
95
    --list-types               list the possible message types
91bfe4843   Joe Perches   checkpatch: add -...
96
    --types TYPE(,TYPE2...)    show only these comma separated message types
000d1cc18   Joe Perches   checkpatch.pl: ad...
97
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
3beb42ece   Joe Perches   checkpatch: add -...
98
    --show-types               show the specific message type in the output
6cd7f3869   Joe Perches   checkpatch: allow...
99
    --max-line-length=n        set the maximum line length, if exceeded, warn
56193274e   Vadim Bendebury   checkpatch: allow...
100
    --min-conf-desc-length=n   set the min description length, if shorter, warn
77f5b10a8   Hannes Eder   checkpatch: make ...
101
102
103
104
105
106
107
108
109
    --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...
110
111
112
113
114
    --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...
115
116
117
    --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...
118
119
    --ignore-perl-version      override checking of perl version.  expect
                               runtime errors.
ebfd7d623   Joe Perches   checkpatch: add o...
120
    --codespell                Use the codespell dictionary for spelling/typos
f1a636785   Maxim Uvarov   checkpatch: remov...
121
                               (default:/usr/share/codespell/dictionary.txt)
ebfd7d623   Joe Perches   checkpatch: add o...
122
    --codespellfile            Use this codespell dictionary
75ad8c575   Jerome Forissier   checkpatch: add -...
123
    --typedefsfile             Read additional types from this file
737c07677   John Brooks   checkpatch: chang...
124
125
    --color[=WHEN]             Use colors 'always', 'never', or only when output
                               is a terminal ('auto'). Default is 'auto'.
77f5b10a8   Hannes Eder   checkpatch: make ...
126
127
128
129
130
131
132
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
3beb42ece   Joe Perches   checkpatch: add -...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  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...
153
154
  	# 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 -...
155
156
157
158
159
160
161
162
163
164
165
166
167
  		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...
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
193
194
  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...
195
196
197
198
199
200
201
  # 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...
202
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
203
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
204
205
206
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
207
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
208
  	'terse!'	=> \$terse,
34d8815f9   Joe Perches   checkpatch: add -...
209
  	'showfile!'	=> \$showfile,
77f5b10a8   Hannes Eder   checkpatch: make ...
210
  	'f|file!'	=> \$file,
4a593c344   Du, Changbin   checkpatch: add s...
211
  	'g|git!'	=> \$git,
6c72ffaab   Andy Whitcroft   update checkpatch...
212
213
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
214
  	'ignore=s'	=> \@ignore,
91bfe4843   Joe Perches   checkpatch: add -...
215
  	'types=s'	=> \@use,
000d1cc18   Joe Perches   checkpatch.pl: ad...
216
  	'show-types!'	=> \$show_types,
3beb42ece   Joe Perches   checkpatch: add -...
217
  	'list-types!'	=> \$list_types,
6cd7f3869   Joe Perches   checkpatch: allow...
218
  	'max-line-length=i' => \$max_line_length,
56193274e   Vadim Bendebury   checkpatch: allow...
219
  	'min-conf-desc-length=i' => \$min_conf_desc_length,
6c72ffaab   Andy Whitcroft   update checkpatch...
220
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
221
222
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
223
  	'summary-file!'	=> \$summary_file,
3705ce5bc   Joe Perches   checkpatch: creat...
224
  	'fix!'		=> \$fix,
9624b8d65   Joe Perches   checkpatch: add a...
225
  	'fix-inplace!'	=> \$fix_inplace,
d62a201f2   Dave Hansen   checkpatch: enfor...
226
  	'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0df   Andy Whitcroft   update checkpatch...
227
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
228
  	'test-only=s'	=> \$tst_only,
ebfd7d623   Joe Perches   checkpatch: add o...
229
230
  	'codespell!'	=> \$codespell,
  	'codespellfile=s'	=> \$codespellfile,
75ad8c575   Jerome Forissier   checkpatch: add -...
231
  	'typedefsfile=s'	=> \$typedefsfile,
737c07677   John Brooks   checkpatch: chang...
232
233
234
  	'color=s'	=> \$color,
  	'no-color'	=> \$color,	#keep old behaviors of -nocolor
  	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
77f5b10a8   Hannes Eder   checkpatch: make ...
235
236
237
238
239
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
240

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
245
  my $exit = 0;
5b57980de   Joe Perches   checkpatch: impro...
246
  my $perl_version_ok = 1;
d62a201f2   Dave Hansen   checkpatch: enfor...
247
  if ($^V && $^V lt $minimum_perl_version) {
5b57980de   Joe Perches   checkpatch: impro...
248
  	$perl_version_ok = 0;
d62a201f2   Dave Hansen   checkpatch: enfor...
249
250
  	printf "$P: requires at least perl version %vd
  ", $minimum_perl_version;
5b57980de   Joe Perches   checkpatch: impro...
251
  	exit(1) if (!$ignore_perl_version);
d62a201f2   Dave Hansen   checkpatch: enfor...
252
  }
45107ff6d   Allen Hubbe   checkpatch: if no...
253
  #if no filenames are given, push '-' to read patch from stdin
0a920b5b6   Andy Whitcroft   add a trivial pat...
254
  if ($#ARGV < 0) {
45107ff6d   Allen Hubbe   checkpatch: if no...
255
  	push(@ARGV, '-');
0a920b5b6   Andy Whitcroft   add a trivial pat...
256
  }
737c07677   John Brooks   checkpatch: chang...
257
258
259
260
261
262
263
264
265
266
267
268
  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 -...
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
  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...
286

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

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

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

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

6d32f7a39   Joe Perches   checkpatch: impro...
451
  our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
691e669ba   Joe Perches   checkpatch.pl: al...
452
  our $logFunctions = qr{(?x:
758d7aada   Miles Chen   checkpatch: updat...
453
  	printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
7d0b6594e   Jacob Keller   checkpatch: allow...
454
  	(?:[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...
455
  	TP_printk|
6e60c02e9   Joe Perches   checkpatch.pl: up...
456
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
457
  	panic|
066687279   Joe Perches   checkpatch: updat...
458
459
  	MODULE_[A-Z_]+|
  	seq_vprintf|seq_printf|seq_puts
691e669ba   Joe Perches   checkpatch.pl: al...
460
  )};
e29a70f15   Joe Perches   checkpatch: add s...
461
462
463
464
465
466
467
468
469
  our $allocFunctions = qr{(?x:
  	(?:(?:devm_)?
  		(?:kv|k|v)[czm]alloc(?:_node|_array)? |
  		kstrdup(?:_const)? |
  		kmemdup(?:_nul)?) |
  	(?:\w+)?alloc_skb(?:ip_align)? |
  				# dev_alloc_skb/netdev_alloc_skb, et al
  	dma_alloc_coherent
  )};
201124755   Joe Perches   checkpatch: valid...
470
471
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
d499480cc   Jorge Ramirez-Ortiz   checkpatch: add C...
472
  	Co-developed-by:|
201124755   Joe Perches   checkpatch: valid...
473
474
475
476
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
8543ae129   Mugunthan V N   checkpatch: add S...
477
  	Suggested-by:|
201124755   Joe Perches   checkpatch: valid...
478
479
480
  	To:|
  	Cc:
  )};
1813087db   Joe Perches   checkpatch: add t...
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
  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...
499
500
  our @typeList = (
  	qr{void},
0c773d9d6   Joe Perches   checkpatch: add s...
501
502
503
504
505
506
507
508
509
  	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...
510
511
512
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
513
514
515
516
517
518
  	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...
519
  	@typeListMisordered,
8905a67c6   Andy Whitcroft   update checkpatch...
520
  );
938224b5e   Joe Perches   checkpatch: warn ...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
  
  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 ...
542
  our @typeListFile = ();
8716de383   Joe Perches   checkpatch: add t...
543
544
545
546
547
  our @typeListWithAttr = (
  	@typeList,
  	qr{struct\s+$InitAttribute\s+$Ident},
  	qr{union\s+$InitAttribute\s+$Ident},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
548
549
550
  our @modifierList = (
  	qr{fastcall},
  );
485ff23ed   Alex Dowad   checkpatch: make ...
551
  our @modifierListFile = ();
8905a67c6   Andy Whitcroft   update checkpatch...
552

2435880fe   Joe Perches   checkpatch: add c...
553
554
555
556
557
558
  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...
559
560
561
562
563
  	["(?: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...
564
  );
515a235ef   Joe Perches   checkpatch: impro...
565
566
567
568
569
570
  #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...
571
  $mode_perms_search = "(?:${mode_perms_search})";
515a235ef   Joe Perches   checkpatch: impro...
572

9189c7e70   Joe Perches   checkpatch: Creat...
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
  our %deprecated_apis = (
  	"synchronize_rcu_bh"			=> "synchronize_rcu",
  	"synchronize_rcu_bh_expedited"		=> "synchronize_rcu_expedited",
  	"call_rcu_bh"				=> "call_rcu",
  	"rcu_barrier_bh"			=> "rcu_barrier",
  	"synchronize_sched"			=> "synchronize_rcu",
  	"synchronize_sched_expedited"		=> "synchronize_rcu_expedited",
  	"call_rcu_sched"			=> "call_rcu",
  	"rcu_barrier_sched"			=> "rcu_barrier",
  	"get_state_synchronize_sched"		=> "get_state_synchronize_rcu",
  	"cond_synchronize_sched"		=> "cond_synchronize_rcu",
  );
  
  #Create a search pattern for all these strings to speed up a loop below
  our $deprecated_apis_search = "";
  foreach my $entry (keys %deprecated_apis) {
  	$deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
  	$deprecated_apis_search .= $entry;
  }
  $deprecated_apis_search = "(?:${deprecated_apis_search})";
b392c64f5   Joe Perches   checkpatch: match...
593
594
595
596
597
598
599
  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 ...
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
  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...
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
  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 ...
656

7840a94cd   Wolfram Sang   checkpatch: refac...
657
658
  our $allowed_asm_includes = qr{(?x:
  	irq|
cdcee686e   Sergey Ryazanov   checkpatch: updat...
659
660
661
  	memory|
  	time|
  	reboot
7840a94cd   Wolfram Sang   checkpatch: refac...
662
663
  )};
  # memory.h: ARM has a custom one
66b47b4a9   Kees Cook   checkpatch: look ...
664
665
  # Load common spelling mistakes and build regular expression list.
  my $misspellings;
66b47b4a9   Kees Cook   checkpatch: look ...
666
  my %spelling_fix;
66b47b4a9   Kees Cook   checkpatch: look ...
667

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

36061e380   Joe Perches   checkpatch: fix u...
672
673
674
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
66b47b4a9   Kees Cook   checkpatch: look ...
675

36061e380   Joe Perches   checkpatch: fix u...
676
677
678
679
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my ($suspect, $fix) = split(/\|\|/, $line);
66b47b4a9   Kees Cook   checkpatch: look ...
680

36061e380   Joe Perches   checkpatch: fix u...
681
682
683
  		$spelling_fix{$suspect} = $fix;
  	}
  	close($spelling);
36061e380   Joe Perches   checkpatch: fix u...
684
685
686
  } else {
  	warn "No typos will be found - file '$spelling_file': $!
  ";
66b47b4a9   Kees Cook   checkpatch: look ...
687
  }
66b47b4a9   Kees Cook   checkpatch: look ...
688

ebfd7d623   Joe Perches   checkpatch: add o...
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
  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 -...
716
717
  sub read_words {
  	my ($wordsRef, $file) = @_;
bf1fa1dae   Joe Perches   checkpatch: exter...
718

75ad8c575   Jerome Forissier   checkpatch: add -...
719
720
721
  	if (open(my $words, '<', $file)) {
  		while (<$words>) {
  			my $line = $_;
bf1fa1dae   Joe Perches   checkpatch: exter...
722

75ad8c575   Jerome Forissier   checkpatch: add -...
723
724
725
  			$line =~ s/\s*
  ?$//g;
  			$line =~ s/^\s*//g;
bf1fa1dae   Joe Perches   checkpatch: exter...
726

75ad8c575   Jerome Forissier   checkpatch: add -...
727
728
729
730
731
732
733
734
735
736
737
738
739
  			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...
740
  	}
75ad8c575   Jerome Forissier   checkpatch: add -...
741
742
743
744
745
746
747
748
749
750
751
752
753
754
  
  	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...
755
  }
75ad8c575   Jerome Forissier   checkpatch: add -...
756
  $typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
bf1fa1dae   Joe Perches   checkpatch: exter...
757

8905a67c6   Andy Whitcroft   update checkpatch...
758
  sub build_types {
485ff23ed   Alex Dowad   checkpatch: make ...
759
760
761
762
763
764
765
766
  	my $mods = "(?x:  
  " . join("|
    ", (@modifierList, @modifierListFile)) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", (@typeList, @typeListFile)) . "
  )";
1813087db   Joe Perches   checkpatch: add t...
767
768
769
770
  	my $Misordered = "(?x:  
  " . join("|
    ", @typeListMisordered) . "
  )";
8716de383   Joe Perches   checkpatch: add t...
771
772
773
774
  	my $allWithAttr = "(?x:  
  " . join("|
    ", @typeListWithAttr) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
775
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
ab7e23f34   Joe Perches   checkpatch: add t...
776
  	$BasicType	= qr{
ab7e23f34   Joe Perches   checkpatch: add t...
777
778
779
  				(?:$typeTypedefs\b)|
  				(?:${all}\b)
  		}x;
8905a67c6   Andy Whitcroft   update checkpatch...
780
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
781
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
782
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
783
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
784
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
785
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
786
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
787
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
788
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
789
790
791
792
793
794
795
  	$NonptrTypeMisordered	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:${Misordered}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8716de383   Joe Perches   checkpatch: add t...
796
797
798
799
800
801
802
803
804
  	$NonptrTypeWithAttr	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
  				(?:$typeTypedefs\b)|
  				(?:${allWithAttr}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
805
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
806
  			$NonptrType
1574a29f8   Joe Perches   checkpatch: allow...
807
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
808
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
809
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
810
811
812
813
814
  	$TypeMisordered	= qr{
  			$NonptrTypeMisordered
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
  			(?:\s+$Inline|\s+$Modifier)*
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
815
  	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087db   Joe Perches   checkpatch: add t...
816
  	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c6   Andy Whitcroft   update checkpatch...
817
818
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
819

7d2367af0   Joe Perches   checkpatch: sugge...
820
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
821
822
823
824
825
826
  
  # 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...
827
  our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
c0a5c8985   Joe Perches   checkpatch: impro...
828
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7d2367af0   Joe Perches   checkpatch: sugge...
829

f84223087   Joe Perches   checkpatch: updat...
830
  our $declaration_macros = qr{(?x:
3e838b6c4   Joe Perches   checkpatch: Allow...
831
  	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
fe658f94b   Steffen Maier   checkpatch: [HLP]...
832
  	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
3d102fc0e   Gilad Ben-Yossef   checkpatch: add C...
833
834
  	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|
  	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
f84223087   Joe Perches   checkpatch: updat...
835
  )};
7d2367af0   Joe Perches   checkpatch: sugge...
836
837
838
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
5b9553abf   Joe Perches   checkpatch: make ...
839
840
841
842
843
  
  	while ($string =~ /^\s*\(.*\)\s*$/) {
  		$string =~ s@^\s*\(\s*@@;
  		$string =~ s@\s*\)\s*$@@;
  	}
7d2367af0   Joe Perches   checkpatch: sugge...
844
  	$string =~ s@\s+@ @g;
5b9553abf   Joe Perches   checkpatch: make ...
845

7d2367af0   Joe Perches   checkpatch: sugge...
846
847
  	return $string;
  }
3445686af   Joe Perches   checkpatch: ignor...
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
  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 ...
868
869
870
  		} 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...
871
872
873
874
  			$camelcase{$1} = 1;
  		}
  	}
  }
85b0ee18b   Joe Perches   checkpatch: see i...
875
876
  sub is_maintained_obsolete {
  	my ($filename) = @_;
f2c19c2f3   Jerome Forissier   checkpatch: don't...
877
  	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
85b0ee18b   Joe Perches   checkpatch: see i...
878

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

562941127   Joe Perches   checkpatch: fix S...
887
888
  	my $root_path = abs_path($root);
  	my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
3b6e8ac9e   Joe Perches   checkpatch: valid...
889
890
891
  	return 0 if ($status ne "");
  	return 1;
  }
3445686af   Joe Perches   checkpatch: ignor...
892
893
894
895
896
  my $camelcase_seeded = 0;
  sub seed_camelcase_includes {
  	return if ($camelcase_seeded);
  
  	my $files;
c707a81de   Joe Perches   checkpatch: make ...
897
898
899
900
  	my $camelcase_cache = "";
  	my @include_files = ();
  
  	$camelcase_seeded = 1;
351b2a1fe   Joe Perches   checkpatch: cache...
901

3645e3283   Richard Genoud   checkpatch: fix d...
902
  	if (-e ".git") {
dbbf869da   Joe Perches   checkpatch: make ...
903
  		my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
351b2a1fe   Joe Perches   checkpatch: cache...
904
  		chomp $git_last_include_commit;
c707a81de   Joe Perches   checkpatch: make ...
905
  		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686af   Joe Perches   checkpatch: ignor...
906
  	} else {
c707a81de   Joe Perches   checkpatch: make ...
907
  		my $last_mod_date = 0;
3445686af   Joe Perches   checkpatch: ignor...
908
  		$files = `find $root/include -name "*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
  		@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...
930
  	}
c707a81de   Joe Perches   checkpatch: make ...
931

3645e3283   Richard Genoud   checkpatch: fix d...
932
  	if (-e ".git") {
dbbf869da   Joe Perches   checkpatch: make ...
933
  		$files = `${git_command} ls-files "include/*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
934
935
936
  		@include_files = split('
  ', $files);
  	}
3445686af   Joe Perches   checkpatch: ignor...
937
938
939
  	foreach my $file (@include_files) {
  		seed_camelcase_file($file);
  	}
351b2a1fe   Joe Perches   checkpatch: cache...
940

c707a81de   Joe Perches   checkpatch: make ...
941
  	if ($camelcase_cache ne "") {
351b2a1fe   Joe Perches   checkpatch: cache...
942
  		unlink glob ".checkpatch-camelcase.*";
c707a81de   Joe Perches   checkpatch: make ...
943
944
945
  		open(my $camelcase_file, '>', "$camelcase_cache")
  		    or warn "$P: Can't write '$camelcase_cache' $!
  ";
351b2a1fe   Joe Perches   checkpatch: cache...
946
947
948
949
950
951
  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
  			print $camelcase_file ("$_
  ");
  		}
  		close($camelcase_file);
  	}
3445686af   Joe Perches   checkpatch: ignor...
952
  }
d311cd445   Joe Perches   checkpatch: add t...
953
954
955
956
  sub git_commit_info {
  	my ($commit, $id, $desc) = @_;
  
  	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
dbbf869da   Joe Perches   checkpatch: make ...
957
  	my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
d311cd445   Joe Perches   checkpatch: add t...
958
959
960
  	$output =~ s/^\s*//gm;
  	my @lines = split("
  ", $output);
0d7835fca   Joe Perches   checkpatch: updat...
961
  	return ($id, $desc) if ($#lines < 0);
5a7f4455a   Sean Christopherson   checkpatch: remov...
962
  	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
d311cd445   Joe Perches   checkpatch: add t...
963
964
965
966
967
968
969
970
971
972
  # 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...
973
  		$id = undef;
d311cd445   Joe Perches   checkpatch: add t...
974
975
976
977
978
979
980
  	} else {
  		$id = substr($lines[0], 0, 12);
  		$desc = substr($lines[0], 41);
  	}
  
  	return ($id, $desc);
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
981
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
982
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
983
  my @lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
984
  my @fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
985
986
  my @fixed_inserted = ();
  my @fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
987
  my $fixlinenr = -1;
4a593c344   Du, Changbin   checkpatch: add s...
988
989
990
991
992
993
994
  # 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...
995
  	foreach my $commit_expr (@ARGV) {
4a593c344   Du, Changbin   checkpatch: add s...
996
  		my $git_range;
28898fd1a   Joe Perches   checkpatch: impro...
997
998
  		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
  			$git_range = "-$2 $1";
4a593c344   Du, Changbin   checkpatch: add s...
999
1000
  		} elsif ($commit_expr =~ m/\.\./) {
  			$git_range = "$commit_expr";
4a593c344   Du, Changbin   checkpatch: add s...
1001
  		} else {
0dea9f1ee   Joe Perches   checkpatch: reduc...
1002
1003
  			$git_range = "-1 $commit_expr";
  		}
dbbf869da   Joe Perches   checkpatch: make ...
1004
  		my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
0dea9f1ee   Joe Perches   checkpatch: reduc...
1005
1006
  		foreach my $line (split(/
  /, $lines)) {
28898fd1a   Joe Perches   checkpatch: impro...
1007
1008
  			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
  			next if (!defined($1) || !defined($2));
0dea9f1ee   Joe Perches   checkpatch: reduc...
1009
1010
1011
1012
  			my $sha1 = $1;
  			my $subject = $2;
  			unshift(@commits, $sha1);
  			$git_commits{$sha1} = $subject;
4a593c344   Du, Changbin   checkpatch: add s...
1013
1014
1015
1016
1017
1018
  		}
  	}
  	die "$P: no git commits after extraction!
  " if (@commits == 0);
  	@ARGV = @commits;
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1019
  my $vname;
98005e8c7   Vadim Bendebury   checkpatch: allow...
1020
  $allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
6c72ffaab   Andy Whitcroft   update checkpatch...
1021
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1022
  	my $FILE;
4a593c344   Du, Changbin   checkpatch: add s...
1023
1024
1025
1026
1027
  	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...
1028
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
1029
1030
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1031
1032
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
1033
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1034
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
1035
1036
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1037
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1038
1039
  	if ($filename eq '-') {
  		$vname = 'Your patch';
4a593c344   Du, Changbin   checkpatch: add s...
1040
  	} elsif ($git) {
0dea9f1ee   Joe Perches   checkpatch: reduc...
1041
  		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
c2fdda0df   Andy Whitcroft   update checkpatch...
1042
1043
1044
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1045
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1046
1047
1048
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1049
  	close($FILE);
d8469f162   Joe Perches   checkpatch: impro...
1050
1051
1052
1053
1054
1055
1056
1057
1058
  
  	if ($#ARGV > 0 && $quiet == 0) {
  		print '-' x length($vname) . "
  ";
  		print "$vname
  ";
  		print '-' x length($vname) . "
  ";
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1059
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1060
1061
1062
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
1063
  	@lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
1064
  	@fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
1065
1066
  	@fixed_inserted = ();
  	@fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
1067
  	$fixlinenr = -1;
485ff23ed   Alex Dowad   checkpatch: make ...
1068
1069
1070
  	@modifierListFile = ();
  	@typeListFile = ();
  	build_types();
0a920b5b6   Andy Whitcroft   add a trivial pat...
1071
  }
d8469f162   Joe Perches   checkpatch: impro...
1072
  if (!$quiet) {
3c816e490   Joe Perches   checkpatch: emit ...
1073
1074
  	hash_show_words(\%use_type, "Used");
  	hash_show_words(\%ignore_type, "Ignored");
5b57980de   Joe Perches   checkpatch: impro...
1075
  	if (!$perl_version_ok) {
d8469f162   Joe Perches   checkpatch: impro...
1076
1077
1078
  		print << "EOM"
  
  NOTE: perl $^V is not modern enough to detect all possible issues.
5b57980de   Joe Perches   checkpatch: impro...
1079
        An upgrade to at least perl $minimum_perl_version is suggested.
d8469f162   Joe Perches   checkpatch: impro...
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
  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...
1090
1091
1092
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
  	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...
1105
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1106
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
1107
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1108

201124755   Joe Perches   checkpatch: valid...
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
  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...
1126
  		$formatted_email =~ s/\Q$address\E.*$//;
201124755   Joe Perches   checkpatch: valid...
1127
  		$name = $formatted_email;
3705ce5bc   Joe Perches   checkpatch: creat...
1128
  		$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
  		$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...
1142
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1143
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
1144
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
  	$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...
1159
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1160
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
1161
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
  
  	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...
1176
  sub which {
bd474ca07   Joe Perches   checkpatch: use t...
1177
  	my ($bin) = @_;
d311cd445   Joe Perches   checkpatch: add t...
1178

bd474ca07   Joe Perches   checkpatch: use t...
1179
1180
1181
1182
  	foreach my $path (split(/:/, $ENV{PATH})) {
  		if (-e "$path/$bin") {
  			return "$path/$bin";
  		}
d311cd445   Joe Perches   checkpatch: add t...
1183
  	}
d311cd445   Joe Perches   checkpatch: add t...
1184

bd474ca07   Joe Perches   checkpatch: use t...
1185
  	return "";
d311cd445   Joe Perches   checkpatch: add t...
1186
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
  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...
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
  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...
1218
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
1219
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
1220
1221
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1222

4a0df2ef4   Andy Whitcroft   update checkpatch...
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
  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...
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
1246
1247
1248
1249
1250
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
1251
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
1252
1253
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
1254

773647a09   Andy Whitcroft   update checkpatch...
1255
1256
1257
1258
1259
  	# 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...
1260
  		# Comments we are whacking completely including the begin
773647a09   Andy Whitcroft   update checkpatch...
1261
1262
1263
1264
1265
1266
1267
  		# 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...
1268
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
1269
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
1270
1271
1272
1273
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
1274
  		}
113f04a83   Daniel Walker   checkpatch: handl...
1275
1276
1277
1278
1279
1280
1281
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
1282
1283
1284
1285
1286
1287
1288
  
  		# 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...
1289
  		}
773647a09   Andy Whitcroft   update checkpatch...
1290
1291
1292
1293
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
1294

773647a09   Andy Whitcroft   update checkpatch...
1295
1296
1297
1298
1299
1300
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1301

fae17daed   Andy Whitcroft   checkpatch: comme...
1302
1303
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1304
1305
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
1306
1307
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
1308
1309
1310
1311
1312
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
1313
  	}
113f04a83   Daniel Walker   checkpatch: handl...
1314
1315
1316
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1317
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
1318
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1319
1320
1321
1322
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
1323
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1324
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
1325
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
1326
  	}
dadf680de   Joe Perches   checkpatch: allow...
1327
1328
1329
1330
  	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
  		my $match = $1;
  		$res =~ s/\Q$match\E/"$;" x length($match)/e;
  	}
00df344fd   Andy Whitcroft   update checkpatch...
1331
1332
  	return $res;
  }
a6962d727   Joe Perches   checkpatch: Prefe...
1333
1334
  sub get_quoted_string {
  	my ($line, $rawline) = @_;
478b17998   Joe Perches   checkpatch: impro...
1335
  	return "" if (!defined($line) || !defined($rawline));
33acb54a4   Joe Perches   checkpatch: use $...
1336
  	return "" if ($line !~ m/($String)/g);
a6962d727   Joe Perches   checkpatch: Prefe...
1337
1338
  	return substr($rawline, $-[0], $+[0] - $-[0]);
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1339
1340
1341
1342
1343
1344
  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...
1345
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1346

13214adf7   Andy Whitcroft   update checkpatch...
1347
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1348
1349
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
1350
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
1351
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
1352
1353
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1354
1355
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
1356
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
1357
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
1358
1359
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1360
1361
1362
1363
  		# 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...
1364
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
1365
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
1366
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
1367
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
1368
1369
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1370
1371
1372
1373
1374
1375
1376
  				$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...
1377
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
1378
1379
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1380
1381
1382
1383
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1384
  		}
cf655043d   Andy Whitcroft   update checkpatch...
1385
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
1386
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
1387
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
1388

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

f0a594c1c   Andy Whitcroft   update checkpatch...
1588
1589
1590
1591
1592
1593
1594
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1595

f0a594c1c   Andy Whitcroft   update checkpatch...
1596
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
1597
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1598
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1599
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1600
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1601
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1602
1603
1604
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1605
1606
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1607
1608
1609
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1610
1611
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
1612
1613
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
1614
1615
1616
1617
1618
1619
  	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...
1620
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1621
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1622
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1623
1624
1625
1626
1627
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1628
1629
1630
1631
1632
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
1633
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1634
1635
1636
1637
1638
1639
1640
  	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...
1641
1642
1643
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
  		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...
1666
1667
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1668
1669
1670
1671
1672
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
  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...
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
  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...
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
  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...
1711
1712
1713
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1714

6c72ffaab   Andy Whitcroft   update checkpatch...
1715
1716
1717
1718
1719
1720
  	$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...
1721
1722
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1723
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1724

6c72ffaab   Andy Whitcroft   update checkpatch...
1725
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1726
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1727
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1728
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
1729
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1730
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
1731
1732
1733
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1734
1735
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1736
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1737
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1738
1739
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1740

6c72ffaab   Andy Whitcroft   update checkpatch...
1741
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1742
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1743
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1744
1745
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1746

6c72ffaab   Andy Whitcroft   update checkpatch...
1747
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1748
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1749
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1750
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1751
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1752
1753
1754
1755
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1756
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1757
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1758
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1759
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1760
1761
1762
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1763
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1764

e91b6e263   Andy Whitcroft   checkpatch: types...
1765
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1766
1767
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1768
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1769
1770
1771
1772
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1773
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1774
1775
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1776
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1777
1778
1779
1780
1781
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1782
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1783
1784
1785
1786
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1787

c45dcabd2   Andy Whitcroft   update checkpatch...
1788
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1789
1790
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1791
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1792
1793
1794
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1795
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1796

c45dcabd2   Andy Whitcroft   update checkpatch...
1797
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1798
1799
1800
1801
1802
  			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...
1803
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1804

c45dcabd2   Andy Whitcroft   update checkpatch...
1805
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1806
1807
1808
1809
1810
1811
1812
1813
1814
  			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...
1815
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1816
1817
1818
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1819
1820
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1821

171ae1a49   Andy Whitcroft   update checkpatch...
1822
1823
1824
1825
1826
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1827
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1828
1829
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1830
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1831
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1832
1833
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1834
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1835
1836
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1837
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1838
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1839
1840
1841
1842
1843
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1844
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1845
1846
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1847
1848
1849
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1850
1851
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1852
1853
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1854
1855
1856
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1857
1858
1859
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1860
1861
1862
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1863
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1864
1865
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1866
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1867
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1868
1869
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1870
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1871
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1872

8e761b04a   Andy Whitcroft   checkpatch: detec...
1873
1874
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1875
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1876
1877
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1878
1879
1880
1881
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1882
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1883
1884
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1885
1886
1887
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1888
1889
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1890
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1891
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1892
1893
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1894
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1895
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1896
1897
1898
1899
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
  		} 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...
1916

8e761b04a   Andy Whitcroft   checkpatch: detec...
1917
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1918
1919
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1920
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1921
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
  			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...
1934
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1935
1936
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1937
1938
1939
1940
1941
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1942
1943
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1944
1945
1946
1947
1948
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1949
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1950

1f65f947a   Andy Whitcroft   checkpatch: add c...
1951
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1952
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1953
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1954
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1955
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1956
1957
1958
1959
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1960
1961
1962
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1963
1964
1965
1966
1967
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1968
1969
1970
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1971
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1972
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1973
1974
1975
1976
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1977
1978
1979
1980
1981
1982
1983
  		# 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...
1984
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1985
1986
1987
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
1988
  					push(@modifierListFile, $modifier);
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1989
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1990
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1991
1992
1993
1994
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
1995
  			push(@typeListFile, $possible);
c45dcabd2   Andy Whitcroft   update checkpatch...
1996
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1997
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1998
1999
2000
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
2001
2002
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
2003
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
2004
  sub show_type {
cbec18afc   Joe Perches   checkpatch: use a...
2005
  	my ($type) = @_;
91bfe4843   Joe Perches   checkpatch: add -...
2006

522b837c6   Alexey Dobriyan   checkpatch: warn ...
2007
  	$type =~ tr/[a-z]/[A-Z]/;
cbec18afc   Joe Perches   checkpatch: use a...
2008
2009
2010
  	return defined $use_type{$type} if (scalar keys %use_type > 0);
  
  	return !defined $ignore_type{$type};
000d1cc18   Joe Perches   checkpatch.pl: ad...
2011
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
2012
  sub report {
cbec18afc   Joe Perches   checkpatch: use a...
2013
2014
2015
2016
  	my ($level, $type, $msg) = @_;
  
  	if (!show_type($type) ||
  	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
2017
2018
  		return 0;
  	}
572302971   Joe Perches   checkpatch: color...
2019
  	my $output = '';
737c07677   John Brooks   checkpatch: chang...
2020
  	if ($color) {
572302971   Joe Perches   checkpatch: color...
2021
2022
2023
2024
2025
2026
2027
2028
2029
  		if ($level eq 'ERROR') {
  			$output .= RED;
  		} elsif ($level eq 'WARNING') {
  			$output .= YELLOW;
  		} else {
  			$output .= GREEN;
  		}
  	}
  	$output .= $prefix . $level . ':';
000d1cc18   Joe Perches   checkpatch.pl: ad...
2030
  	if ($show_types) {
737c07677   John Brooks   checkpatch: chang...
2031
  		$output .= BLUE if ($color);
572302971   Joe Perches   checkpatch: color...
2032
  		$output .= "$type:";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2033
  	}
737c07677   John Brooks   checkpatch: chang...
2034
  	$output .= RESET if ($color);
572302971   Joe Perches   checkpatch: color...
2035
2036
  	$output .= ' ' . $msg . "
  ";
34d8815f9   Joe Perches   checkpatch: add -...
2037
2038
2039
2040
2041
2042
2043
2044
  
  	if ($showfile) {
  		my @lines = split("
  ", $output, -1);
  		splice(@lines, 1, 1);
  		$output = join("
  ", @lines);
  	}
572302971   Joe Perches   checkpatch: color...
2045
2046
2047
  	$output = (split('
  ', $output))[0] . "
  " if ($terse);
8905a67c6   Andy Whitcroft   update checkpatch...
2048

572302971   Joe Perches   checkpatch: color...
2049
  	push(our @report, $output);
773647a09   Andy Whitcroft   update checkpatch...
2050
2051
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
2052
  }
cbec18afc   Joe Perches   checkpatch: use a...
2053

f0a594c1c   Andy Whitcroft   update checkpatch...
2054
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
2055
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
2056
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
2057

d752fcc88   Joe Perches   checkpatch: add a...
2058
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
2088
2089
  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 -...
2090
  		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
d752fcc88   Joe Perches   checkpatch: add a...
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
  			$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...
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
  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...
2140
  sub ERROR {
cbec18afc   Joe Perches   checkpatch: use a...
2141
2142
2143
  	my ($type, $msg) = @_;
  
  	if (report("ERROR", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2144
2145
  		our $clean = 0;
  		our $cnt_error++;
3705ce5bc   Joe Perches   checkpatch: creat...
2146
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2147
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2148
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2149
2150
  }
  sub WARN {
cbec18afc   Joe Perches   checkpatch: use a...
2151
2152
2153
  	my ($type, $msg) = @_;
  
  	if (report("WARNING", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2154
2155
  		our $clean = 0;
  		our $cnt_warn++;
3705ce5bc   Joe Perches   checkpatch: creat...
2156
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2157
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2158
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2159
2160
  }
  sub CHK {
cbec18afc   Joe Perches   checkpatch: use a...
2161
2162
2163
  	my ($type, $msg) = @_;
  
  	if ($check && report("CHECK", $type, $msg)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2164
2165
  		our $clean = 0;
  		our $cnt_chk++;
3705ce5bc   Joe Perches   checkpatch: creat...
2166
  		return 1;
6c72ffaab   Andy Whitcroft   update checkpatch...
2167
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2168
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2169
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
  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...
2196
2197
2198
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
2199
2200
  	}
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2201
2202
  sub trim {
  	my ($string) = @_;
b34c648bb   Joe Perches   checkpatch: bette...
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
  	$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...
2220
2221
2222
  
  	return $string;
  }
52ea85061   Joe Perches   checkpatch: add t...
2223
2224
2225
2226
2227
2228
2229
  sub string_find_replace {
  	my ($string, $find, $replace) = @_;
  
  	$string =~ s/$find/$replace/g;
  
  	return $string;
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
  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...
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
  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...
2270
  	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c099   Joe Perches   checkpatch: add s...
2271
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
2272
2273
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2274
2275
2276
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2277
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2278
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2279
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2280

4a0df2ef4   Andy Whitcroft   update checkpatch...
2281
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2282
2283
2284
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2285
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2286
  	my $signoff = 0;
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2287
2288
  	my $author = '';
  	my $authorsignoff = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2289
  	my $is_patch = 0;
133712a2e   Rob Herring   checkpatch: DT bi...
2290
  	my $is_binding_patch = -1;
29ee1b0c6   Joe Perches   checkpatch: ignor...
2291
  	my $in_header_lines = $file ? 0 : 1;
15662b3e8   Joe Perches   checkpatch: add a...
2292
  	my $in_commit_log = 0;		#Scanning lines before patch
ed43c4e58   Allen Hubbe   checkpatch: check...
2293
  	my $has_commit_log = 0;		#Encountered lines before patch
490b292c8   Joe Perches   checkpatch: warn ...
2294
  	my $commit_log_lines = 0;	#Number of commit log lines
77cb8546b   Joe Perches   checkpatch: warn ...
2295
  	my $commit_log_possible_stack_dump = 0;
2a076f40d   Joe Perches   checkpatch, Submi...
2296
  	my $commit_log_long_line = 0;
e518e9a59   Joe Perches   checkpatch: emit ...
2297
  	my $commit_log_has_diff = 0;
13f1937ef   Joe Perches   checkpatch: emit ...
2298
  	my $reported_maintainer_file = 0;
fa64205df   Pasi Savanainen   checkpatch: check...
2299
  	my $non_utf8_charset = 0;
365dd4eaa   Joe Perches   checkpatch: add a...
2300
  	my $last_blank_line = 0;
5e4f6ba5e   Joe Perches   checkpatch: add a...
2301
  	my $last_coalesced_string_linenr = -1;
365dd4eaa   Joe Perches   checkpatch: add a...
2302

13214adf7   Andy Whitcroft   update checkpatch...
2303
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
2304
2305
2306
2307
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2308
2309
2310
2311
2312
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
77cb8546b   Joe Perches   checkpatch: warn ...
2313
  	my $context_function;		#undef'd unless there's a known function
0a920b5b6   Andy Whitcroft   add a trivial pat...
2314
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
2315
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2316
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2317
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2318

13214adf7   Andy Whitcroft   update checkpatch...
2319
2320
2321
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
2322
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
2323
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2324
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2325
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
2326

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

c2fdda0df   Andy Whitcroft   update checkpatch...
2329
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
2330
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
2331
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
2332
2333
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
2334

d8b077101   Joe Perches   checkpatch: exten...
2335
  	my $camelcase_file_seeded = 0;
9f3a89926   Rob Herring   checkpatch.pl: ad...
2336
  	my $checklicenseline = 1;
773647a09   Andy Whitcroft   update checkpatch...
2337
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
2338
2339
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
2340
2341
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
2342

3705ce5bc   Joe Perches   checkpatch: creat...
2343
  		push(@fixed, $rawline) if ($fix);
773647a09   Andy Whitcroft   update checkpatch...
2344
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2345
  			$setup_docs = 0;
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
2346
  			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2347
2348
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
2349
2350
  			#next;
  		}
74fd4f347   Joe Perches   checkpatch: impro...
2351
  		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
773647a09   Andy Whitcroft   update checkpatch...
2352
2353
2354
2355
2356
2357
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2358
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
2359
2360
2361
2362
2363
2364
  
  			# 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...
2365
2366
2367
2368
2369
2370
2371
  			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...
2372
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
2373
2374
2375
2376
2377
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
2378
2379
2380
2381
2382
2383
2384
2385
2386
  			}
  			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...
2387
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
2388
2389
2390
2391
2392
2393
2394
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
2395
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
2396
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
2397
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
2398
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2399
  		}
773647a09   Andy Whitcroft   update checkpatch...
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2412
2413
2414
2415
2416
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
2417
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
2418
2419
  	$realcnt = 0;
  	$linenr = 0;
194f66fc9   Joe Perches   checkpatch: add a...
2420
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2421
2422
  	foreach my $line (@lines) {
  		$linenr++;
194f66fc9   Joe Perches   checkpatch: add a...
2423
  		$fixlinenr++;
1b5539b1f   Joe Perches   checkpatch: reduc...
2424
2425
  		my $sline = $line;	#copy of $line
  		$sline =~ s/$;/ /g;	#with comments as spaces
0a920b5b6   Andy Whitcroft   add a trivial pat...
2426

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

12c253abb   Joe Perches   checkpatch: impro...
2429
2430
2431
2432
2433
2434
2435
  # 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...
2436
  #extract the line range in the file after the patch is applied
e518e9a59   Joe Perches   checkpatch: emit ...
2437
  		if (!$in_commit_log &&
74fd4f347   Joe Perches   checkpatch: impro...
2438
2439
  		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
  			my $context = $4;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2440
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
2441
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2442
2443
2444
2445
2446
2447
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2448
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
2449
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
2450
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
2451
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2452
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2453
  			$suppress_statement = 0;
74fd4f347   Joe Perches   checkpatch: impro...
2454
2455
2456
2457
2458
  			if ($context =~ /\b(\w+)\s*\(/) {
  				$context_function = $1;
  			} else {
  				undef $context_function;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2459
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2460

4a0df2ef4   Andy Whitcroft   update checkpatch...
2461
2462
2463
  # 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...
2464
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2465
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
2466
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2467

4a0df2ef4   Andy Whitcroft   update checkpatch...
2468
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
2469
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2470
2471
2472
2473
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
2474
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
2475
2476
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
2477

d8aaf1214   Andy Whitcroft   update checkpatch...
2478
2479
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2480
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
2481
  		my $hunk_line = ($realcnt != 0);
6c72ffaab   Andy Whitcroft   update checkpatch...
2482
2483
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
2484

2ac73b4f6   Joe Perches   checkpatch: make ...
2485
  		my $found_file = 0;
773647a09   Andy Whitcroft   update checkpatch...
2486
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
2487
2488
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2489
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2490
  			$in_commit_log = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
2491
  			$found_file = 1;
3bf9a009f   Rabin Vincent   checkpatch: check...
2492
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
2493
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2494
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2495
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2496
2497
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
2498
2499
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2500
2501
2502
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
2503
  			}
773647a09   Andy Whitcroft   update checkpatch...
2504

c1ab33269   Andy Whitcroft   checkpatch: inclu...
2505
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2506
2507
2508
2509
  				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...
2510
  			}
2ac73b4f6   Joe Perches   checkpatch: make ...
2511
2512
  			$found_file = 1;
  		}
34d8815f9   Joe Perches   checkpatch: add -...
2513
2514
2515
2516
  #make up the handle for any error we report on this line
  		if ($showfile) {
  			$prefix = "$realfile:$realline: "
  		} elsif ($emacs) {
7d3a9f673   Joe Perches   checkpatch: repor...
2517
2518
2519
2520
2521
  			if ($file) {
  				$prefix = "$filename:$realline: ";
  			} else {
  				$prefix = "$filename:$linenr: ";
  			}
34d8815f9   Joe Perches   checkpatch: add -...
2522
  		}
2ac73b4f6   Joe Perches   checkpatch: make ...
2523
  		if ($found_file) {
85b0ee18b   Joe Perches   checkpatch: see i...
2524
2525
2526
2527
2528
  			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 ...
2529
  			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2ac73b4f6   Joe Perches   checkpatch: make ...
2530
2531
2532
2533
  				$check = 1;
  			} else {
  				$check = $check_orig;
  			}
9f3a89926   Rob Herring   checkpatch.pl: ad...
2534
  			$checklicenseline = 1;
133712a2e   Rob Herring   checkpatch: DT bi...
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
  
  			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...
2548
2549
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
2550
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2551

c2fdda0df   Andy Whitcroft   update checkpatch...
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2562

6c72ffaab   Andy Whitcroft   update checkpatch...
2563
  		$cnt_lines++ if ($realcnt != 0);
490b292c8   Joe Perches   checkpatch: warn ...
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
  # 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 ...
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
  # 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...
2587
2588
2589
2590
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
04db4d25d   Joe Perches   checkpatch: compl...
2591
2592
  			if ($realfile !~ m@scripts/@ &&
  			    $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2593
2594
2595
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
2596
2597
  			}
  		}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2598
2599
2600
2601
2602
2603
  # 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...
2604
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
2605
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2606
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
2607
  			$in_commit_log = 0;
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2608
2609
2610
2611
2612
2613
2614
  			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...
2615
  		}
e0d975b1b   Joe Perches   checkpatch: reduc...
2616
2617
2618
2619
2620
  # 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...
2621
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
2622
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
2623
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
2624
2625
2626
2627
2628
  			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 ...
2629
2630
2631
2632
2633
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
2634
  			if (defined $space_before && $space_before ne "") {
3705ce5bc   Joe Perches   checkpatch: creat...
2635
2636
2637
2638
  				if (WARN("BAD_SIGN_OFF",
  					 "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2639
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2640
2641
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2642
2643
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5bc   Joe Perches   checkpatch: creat...
2644
2645
2646
2647
  				if (WARN("BAD_SIGN_OFF",
  					 "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2648
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2649
2650
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2651
2652
  			}
  			if (!defined $space_after || $space_after ne " ") {
3705ce5bc   Joe Perches   checkpatch: creat...
2653
2654
2655
2656
  				if (WARN("BAD_SIGN_OFF",
  					 "Use a single space after $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2657
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2658
2659
  					    "$ucfirst_sign_off $email";
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2660
  			}
201124755   Joe Perches   checkpatch: valid...
2661
2662
2663
2664
  
  			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...
2665
2666
2667
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2668
2669
2670
2671
2672
2673
2674
2675
2676
  			} 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...
2677
2678
2679
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2680
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2681
  			}
7e51f1979   Joe Perches   checkpatch: check...
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
  
  # 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;
  			}
6c5d24eef   Sean Christopherson   checkpatch: Warn ...
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
  
  # Check Co-developed-by: immediately followed by Signed-off-by: with same name and email
  			if ($sign_off =~ /^co-developed-by:$/i) {
  				if ($email eq $author) {
  					WARN("BAD_SIGN_OFF",
  					      "Co-developed-by: should not be used to attribute nominal patch author '$author'
  " . "$here
  " . $rawline);
  				}
  				if (!defined $lines[$linenr]) {
  					WARN("BAD_SIGN_OFF",
                                               "Co-developed-by: must be immediately followed by Signed-off-by:
  " . "$here
  " . $rawline);
  				} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {
  					WARN("BAD_SIGN_OFF",
  					     "Co-developed-by: must be immediately followed by Signed-off-by:
  " . "$here
  " . $rawline . "
  " .$rawlines[$linenr]);
  				} elsif ($1 ne $email) {
  					WARN("BAD_SIGN_OFF",
  					     "Co-developed-by and Signed-off-by: name/email do not match 
  " . "$here
  " . $rawline . "
  " .$rawlines[$linenr]);
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2722
  		}
a2fe16b9d   Joe Perches   checkpatch: try t...
2723
2724
2725
2726
2727
2728
2729
  # 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...
2730
2731
2732
2733
2734
2735
  # 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...
2736
2737
2738
2739
2740
  # 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
634cffcc9   Joe Perches   checkpatch: don't...
2741
2742
2743
2744
  		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||
  		     $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
  		     $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
  					# stack dump address styles
369c8dd39   Joe Perches   checkpatch: impro...
2745
2746
  			$commit_log_possible_stack_dump = 1;
  		}
2a076f40d   Joe Perches   checkpatch, Submi...
2747
2748
  # Check for line lengths > 75 in commit log, warn once
  		if ($in_commit_log && !$commit_log_long_line &&
369c8dd39   Joe Perches   checkpatch: impro...
2749
2750
2751
2752
2753
2754
2755
2756
  		    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...
2757
2758
2759
2760
2761
  			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...
2762
  # Reset possible stack dump if a blank line is found
369c8dd39   Joe Perches   checkpatch: impro...
2763
2764
2765
2766
  		if ($in_commit_log && $commit_log_possible_stack_dump &&
  		    $line =~ /^\s*$/) {
  			$commit_log_possible_stack_dump = 0;
  		}
bf4daf12a   Joe Perches   checkpatch: avoid...
2767

0d7835fca   Joe Perches   checkpatch: updat...
2768
  # Check for git id commit length and improperly formed commit descriptions
369c8dd39   Joe Perches   checkpatch: impro...
2769
  		if ($in_commit_log && !$commit_log_possible_stack_dump &&
aab38f516   Joe Perches   checkpatch: yet a...
2770
  		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
e882dbfc2   Wei Wang   checkpatch: speci...
2771
  		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
fe043ea12   Joe Perches   checkpatch: warn ...
2772
  		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
aab38f516   Joe Perches   checkpatch: yet a...
2773
  		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
369c8dd39   Joe Perches   checkpatch: impro...
2774
2775
  		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
  		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
fe043ea12   Joe Perches   checkpatch: warn ...
2776
2777
  			my $init_char = "c";
  			my $orig_commit = "";
0d7835fca   Joe Perches   checkpatch: updat...
2778
2779
2780
2781
2782
  			my $short = 1;
  			my $long = 0;
  			my $case = 1;
  			my $space = 1;
  			my $hasdesc = 0;
19c146a64   Joe Perches   checkpatch: make ...
2783
  			my $hasparens = 0;
0d7835fca   Joe Perches   checkpatch: updat...
2784
2785
2786
  			my $id = '0123456789ab';
  			my $orig_desc = "commit description";
  			my $description = "";
fe043ea12   Joe Perches   checkpatch: warn ...
2787
2788
2789
2790
2791
2792
  			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...
2793
2794
2795
2796
2797
2798
  			$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 ...
2799
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2800
2801
2802
2803
  			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
  				 defined $rawlines[$linenr] &&
  				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
  				$orig_desc = $1;
19c146a64   Joe Perches   checkpatch: make ...
2804
  				$hasparens = 1;
b671fde05   Joe Perches   checkpatch: add a...
2805
2806
2807
2808
2809
2810
2811
  			} 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 ...
2812
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2813
2814
2815
2816
  			}
  
  			($id, $description) = git_commit_info($orig_commit,
  							      $id, $orig_desc);
948b133a1   Heinrich Schuchardt   checkpatch: remov...
2817
2818
  			if (defined($id) &&
  			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
0d7835fca   Joe Perches   checkpatch: updat...
2819
2820
2821
2822
  				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...
2823
  		}
13f1937ef   Joe Perches   checkpatch: emit ...
2824
2825
2826
2827
2828
2829
  # 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...
2830
  			$is_patch = 1;
13f1937ef   Joe Perches   checkpatch: emit ...
2831
2832
2833
2834
2835
  			$reported_maintainer_file = 1;
  			WARN("FILE_PATH_CHANGES",
  			     "added, moved or deleted file(s), does MAINTAINERS need updating?
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2836
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
2837
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2838
2839
2840
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
2841
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2842
2843
2844
2845
  		}
  
  # 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...
2846
2847
2848
2849
2850
2851
2852
  		    $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 ...
2853
2854
2855
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
2856
  		}
15662b3e8   Joe Perches   checkpatch: add a...
2857
2858
2859
  # 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...
2860
2861
  		    !($rawline =~ /^\s+(?:\S|$)/ ||
  		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
15662b3e8   Joe Perches   checkpatch: add a...
2862
2863
  			$in_header_lines = 0;
  			$in_commit_log = 1;
ed43c4e58   Allen Hubbe   checkpatch: check...
2864
  			$has_commit_log = 1;
15662b3e8   Joe Perches   checkpatch: add a...
2865
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
2866
2867
2868
2869
2870
2871
2872
2873
2874
  # 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...
2875
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
2876
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
2877
2878
2879
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
d6430f718   Joe Perches   checkpatch: don't...
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
  # 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 ...
2893
  # Check for various typo / spelling mistakes
66d7a382c   Joe Perches   checkpatch: add s...
2894
2895
  		if (defined($misspellings) &&
  		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
ebfd7d623   Joe Perches   checkpatch: add o...
2896
  			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
66b47b4a9   Kees Cook   checkpatch: look ...
2897
2898
2899
2900
  				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...
2901
2902
2903
2904
2905
  				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 ...
2906
2907
2908
2909
2910
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
  				}
  			}
  		}
a8dd86bf7   Matteo Croce   checkpatch.pl: wa...
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
  # check for invalid commit id
  		if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
  			my $id;
  			my $description;
  			($id, $description) = git_commit_info($2, undef, undef);
  			if (!defined($id)) {
  				WARN("UNKNOWN_COMMIT_ID",
  				     "Unknown commit id '$2', maybe rebased or not pulled?
  " . $herecurr);
  			}
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
2922
2923
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2924

0a920b5b6   Andy Whitcroft   add a trivial pat...
2925
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2926
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2927
2928
2929
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d5e616fc1   Joe Perches   checkpatch: add a...
2930
2931
2932
2933
  			if (ERROR("DOS_LINE_ENDINGS",
  				  "DOS line endings
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2934
  				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
2935
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2936
2937
2938
2939
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2940
2941
2942
2943
  			if (ERROR("TRAILING_WHITESPACE",
  				  "trailing whitespace
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2944
  				$fixed[$fixlinenr] =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
2945
  			}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2946
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2947
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2948

4783f894d   Josh Triplett   checkpatch.pl: ch...
2949
  # Check for FSF mailing addresses.
109d8cb20   Alexander Duyck   checkpatch: only ...
2950
  		if ($rawline =~ /\bwrite to the Free/i ||
1bde561e4   Matthew Wilcox   checkpatch: add a...
2951
  		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
3e2232f2d   Joe Perches   checkpatch: updat...
2952
2953
  		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
  		    $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894d   Josh Triplett   checkpatch.pl: ch...
2954
2955
2956
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
0675a8fbd   Jean Delvare   checkpatch: renam...
2957
2958
2959
2960
2961
  			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...
2962
  		}
3354957a4   Andi Kleen   checkpatch: add c...
2963
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2964
2965
  # 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...
2966
  		if ($realfile =~ /Kconfig/ &&
678ae162d   Ulf Magnusson   checkpatch: kconf...
2967
2968
2969
2970
  		    # '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...
2971
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2972
2973
2974
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
2975
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2976
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
2977
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2978
2979
2980
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2981
2982
  
  				next if ($f =~ /^-/);
8d73e0e7d   Joe Perches   checkpatch: quiet...
2983
  				last if (!$file && $f =~ /^\@\@/);
a13858033   Andy Whitcroft   checkpatch: only ...
2984

86adf1a07   Ulf Magnusson   checkpatch: kconf...
2985
  				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2986
  					$is_start = 1;
84af7a619   Ulf Magnusson   checkpatch: kconf...
2987
2988
2989
2990
2991
2992
  				} 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 ...
2993
2994
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2995
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
2996
2997
2998
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
678ae162d   Ulf Magnusson   checkpatch: kconf...
2999
3000
3001
3002
3003
3004
3005
  
  				# 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...
3006
3007
3008
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
3009
3010
  				$length++;
  			}
56193274e   Vadim Bendebury   checkpatch: allow...
3011
3012
3013
3014
3015
  			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 ...
3016
3017
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
3018
  		}
628f91a28   Joe Perches   checkpatch: warn ...
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
  # 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...
3030
3031
3032
3033
3034
3035
3036
  # 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...
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
  		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...
3051
  # check for DT compatible documentation
7dd05b38e   Florian Vaussard   checkpatch: check...
3052
3053
3054
  		if (defined $root &&
  			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
  			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
bff5da433   Rob Herring   checkpatch: add D...
3055
  			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
cc93319b5   Florian Vaussard   checkpatch: impro...
3056
  			my $dt_path = $root . "/Documentation/devicetree/bindings/";
852d095d1   Rob Herring   checkpatch.pl: Up...
3057
  			my $vp_file = $dt_path . "vendor-prefixes.yaml";
cc93319b5   Florian Vaussard   checkpatch: impro...
3058

bff5da433   Rob Herring   checkpatch: add D...
3059
3060
  			foreach my $compat (@compats) {
  				my $compat2 = $compat;
185d566bc   Rob Herring   checkpatch: fix w...
3061
3062
3063
3064
  				$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...
3065
3066
3067
3068
3069
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
  					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path
  " . $herecurr);
  				}
4fbf32a69   Florian Vaussard   checkpatch: fix s...
3070
3071
  				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
  				my $vendor = $1;
852d095d1   Rob Herring   checkpatch.pl: Up...
3072
  				`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
bff5da433   Rob Herring   checkpatch: add D...
3073
3074
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
cc93319b5   Florian Vaussard   checkpatch: impro...
3075
3076
  					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file
  " . $herecurr);
bff5da433   Rob Herring   checkpatch: add D...
3077
3078
3079
  				}
  			}
  		}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
  # 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 = '..';
  				}
fdf13693d   Joe Perches   checkpatch: verif...
3095
3096
3097
  # check SPDX comment style for .[chsS] files
  				if ($realfile =~ /\.[chsS]$/ &&
  				    $rawline =~ /SPDX-License-Identifier:/ &&
ffbce8974   Joe Perches   checkpatch: impro...
3098
  				    $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
fdf13693d   Joe Perches   checkpatch: verif...
3099
3100
3101
3102
  					WARN("SPDX_LICENSE_TAG",
  					     "Improper SPDX comment style for '$realfile', please use '$comment' instead
  " . $herecurr);
  				}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3103
  				if ($comment !~ /^$/ &&
ffbce8974   Joe Perches   checkpatch: impro...
3104
3105
3106
3107
  				    $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {
  					WARN("SPDX_LICENSE_TAG",
  					     "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline
  " . $herecurr);
3b6e8ac9e   Joe Perches   checkpatch: valid...
3108
  				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
ffbce8974   Joe Perches   checkpatch: impro...
3109
3110
3111
3112
3113
3114
  					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...
3115
3116
3117
  				}
  			}
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
3118
  # check we are in a valid source file if not then ignore this hunk
d6430f718   Joe Perches   checkpatch: don't...
3119
  		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
5368df20f   Andy Whitcroft   checkpatch: check...
3120

a8da38a9c   Joe Perches   checkpatch: add t...
3121
3122
3123
3124
3125
3126
3127
3128
  # check for using SPDX-License-Identifier on the wrong line number
  		if ($realline != $checklicenseline &&
  		    $rawline =~ /\bSPDX-License-Identifier:/ &&
  		    substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
  			WARN("SPDX_LICENSE_TAG",
  			     "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead
  " . $herecurr);
  		}
47e0c88b3   Joe Perches   checkpatch: categ...
3129
3130
3131
3132
3133
3134
  # 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...
3135
  #	lines with an RFC3986 like URL
47e0c88b3   Joe Perches   checkpatch: categ...
3136
3137
  #
  # There are 3 different line length message types:
ab1ecabf4   Jean Delvare   checkpatch: fix t...
3138
  # LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
47e0c88b3   Joe Perches   checkpatch: categ...
3139
3140
3141
3142
3143
  # 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...
3144
  		if ($line =~ /^\+/ && $length > $max_line_length) {
47e0c88b3   Joe Perches   checkpatch: categ...
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
  			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...
3160
3161
3162
  			# More special cases
  			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
  				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
d560a5f8a   Joe Perches   checkpatch: skip ...
3163
  				$msg_type = "";
2e4bbbc55   Andreas Brauchli   checkpatch: allow...
3164
3165
3166
  			# 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...
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
  			# 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...
3186
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
3187
3188
  # 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...
3189
3190
3191
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
3192
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3193
  # check we are in a valid source file C or perl if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
3194
  		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3195
3196
3197
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
3198
3199
3200
3201
3202
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3203
  			$rpt_cleaners = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3204
3205
3206
3207
  			if (ERROR("CODE_INDENT",
  				  "code indent should use tabs where possible
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3208
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3209
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3210
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3211
3212
3213
3214
3215
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3216
3217
3218
3219
  			if (WARN("SPACE_BEFORE_TAB",
  				"please, no space before tabs
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3220
  				while ($fixed[$fixlinenr] =~
d2207ccbc   Joe Perches   checkpatch: remov...
3221
  					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc9   Joe Perches   checkpatch: add a...
3222
  				while ($fixed[$fixlinenr] =~
c76f4cb3d   Joe Perches   checkpatch: impro...
3223
  					   s/(^\+.*) +\t/$1\t/) {}
3705ce5bc   Joe Perches   checkpatch: creat...
3224
  			}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3225
  		}
6a487211e   Joe Perches   checkpatch: add t...
3226
3227
3228
3229
3230
3231
3232
  
  # 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...
3233

d1fe9c099   Joe Perches   checkpatch: add s...
3234
3235
3236
3237
3238
3239
  # 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...
3240
  # check indentation starts on a tab stop
5b57980de   Joe Perches   checkpatch: impro...
3241
  		if ($perl_version_ok &&
bd49111f7   Joe Perches   checkpatch: avoid...
3242
  		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
a91e8994f   Joe Perches   checkpatch: add t...
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
  			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...
3253
  # check multi-line statement indentation matches previous line
5b57980de   Joe Perches   checkpatch: impro...
3254
  		if ($perl_version_ok &&
fd71f6326   Joe Perches   checkpatch: impro...
3255
  		    $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...
3256
3257
3258
3259
3260
3261
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
3262
3263
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
3264
3265
3266
3267
3268
3269
3270
3271
  
  				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...
3272
3273
3274
3275
3276
  
  					if (CHK("PARENTHESIS_ALIGNMENT",
  						"Alignment should match open parenthesis
  " . $hereprev) &&
  					    $fix && $line =~ /^\+/) {
194f66fc9   Joe Perches   checkpatch: add a...
3277
  						$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3278
3279
  						    s/^\+[ \t]*/\+$goodtabindent/;
  					}
d1fe9c099   Joe Perches   checkpatch: add s...
3280
3281
3282
  				}
  			}
  		}
6ab3a9701   Joe Perches   checkpatch: impro...
3283
3284
3285
3286
3287
3288
3289
3290
3291
  # 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...
3292
  			if (CHK("SPACING",
f27c95db1   Joe Perches   checkpatch: impro...
3293
3294
  				"No space is necessary after a cast
  " . $herecurr) &&
3705ce5bc   Joe Perches   checkpatch: creat...
3295
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3296
  				$fixed[$fixlinenr] =~
f27c95db1   Joe Perches   checkpatch: impro...
3297
  				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5bc   Joe Perches   checkpatch: creat...
3298
  			}
aad4f6149   Joe Perches   checkpatch: add -...
3299
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3300
3301
  # Block comment styles
  # Networking with an initial /*
058806007   Joe Perches   checkpatch: check...
3302
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd61   Joe Perches   checkpatch: impro...
3303
  		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c6   Joe Perches   checkpatch: ignor...
3304
3305
  		    $rawline =~ /^\+[ \t]*\*/ &&
  		    $realline > 2) {
058806007   Joe Perches   checkpatch: check...
3306
3307
3308
3309
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments don't use an empty /* line, use /* Comment...
  " . $hereprev);
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3310
3311
3312
  # Block comments use * on subsequent lines
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
  		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
a605e32eb   Joe Perches   checkpatch: warn ...
3313
  		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
61135e966   Joe Perches   checkpatch: fix n...
3314
  		    $rawline =~ /^\+/ &&			#line is new
a605e32eb   Joe Perches   checkpatch: warn ...
3315
  		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
86406b1cb   Joe Perches   checkpatch: alway...
3316
3317
3318
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use * on subsequent lines
  " . $hereprev);
a605e32eb   Joe Perches   checkpatch: warn ...
3319
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3320
3321
  # Block comments use */ on trailing lines
  		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
c24f9f195   Joe Perches   checkpatch: impro...
3322
3323
3324
  		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
  		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
  		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
86406b1cb   Joe Perches   checkpatch: alway...
3325
3326
3327
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use a trailing */ on a separate line
  " . $herecurr);
058806007   Joe Perches   checkpatch: check...
3328
  		}
08eb9b801   Joe Perches   checkpatch: test ...
3329
3330
  # Block comment * alignment
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
af207524a   Joe Perches   checkpatch: impro...
3331
3332
3333
  		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
  		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
  		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
08eb9b801   Joe Perches   checkpatch: test ...
3334
  		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
af207524a   Joe Perches   checkpatch: impro...
3335
3336
  		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
  			my $oldindent;
08eb9b801   Joe Perches   checkpatch: test ...
3337
  			$prevrawline =~ m@^\+([ \t]*/?)\*@;
af207524a   Joe Perches   checkpatch: impro...
3338
3339
3340
3341
3342
3343
  			if (defined($1)) {
  				$oldindent = expand_tabs($1);
  			} else {
  				$prevrawline =~ m@^\+(.*/?)\*@;
  				$oldindent = expand_tabs($1);
  			}
08eb9b801   Joe Perches   checkpatch: test ...
3344
3345
  			$rawline =~ m@^\+([ \t]*)\*@;
  			my $newindent = $1;
08eb9b801   Joe Perches   checkpatch: test ...
3346
  			$newindent = expand_tabs($newindent);
af207524a   Joe Perches   checkpatch: impro...
3347
  			if (length($oldindent) ne length($newindent)) {
08eb9b801   Joe Perches   checkpatch: test ...
3348
3349
3350
3351
3352
  				WARN("BLOCK_COMMENT_STYLE",
  				     "Block comments should align the * on each line
  " . $hereprev);
  			}
  		}
7f6191914   Joe Perches   checkpatch: add t...
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
  # 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...
3364
  		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
7f6191914   Joe Perches   checkpatch: add t...
3365
  		      $line =~ /^\+\s*__setup/)) {
d752fcc88   Joe Perches   checkpatch: add a...
3366
3367
3368
3369
  			if (CHK("LINE_SPACING",
  				"Please use a blank line after function/struct/union/enum declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3370
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3371
  			}
7f6191914   Joe Perches   checkpatch: add t...
3372
  		}
365dd4eaa   Joe Perches   checkpatch: add a...
3373
3374
3375
3376
  # check for multiple consecutive blank lines
  		if ($prevline =~ /^[\+ ]\s*$/ &&
  		    $line =~ /^\+\s*$/ &&
  		    $last_blank_line != ($linenr - 1)) {
d752fcc88   Joe Perches   checkpatch: add a...
3377
3378
3379
3380
  			if (CHK("LINE_SPACING",
  				"Please don't use multiple blank lines
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3381
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3382
  			}
365dd4eaa   Joe Perches   checkpatch: add a...
3383
3384
  			$last_blank_line = $linenr;
  		}
3b617e3b8   Joe Perches   checkpatch: net a...
3385
  # check for missing blank lines after declarations
3f7bac031   Joe Perches   checkpatch: alway...
3386
3387
3388
  		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
  			# actual declarations
  		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
3389
3390
  			# function pointer declarations
  		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
  			# 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...
3403
3404
  			# function pointer declarations
  		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3405
3406
3407
3408
3409
  			# 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...
3410
  		      $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3411
3412
3413
3414
3415
3416
3417
3418
  			# 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...
3419
3420
3421
3422
  			if (WARN("LINE_SPACING",
  				 "Missing a blank line after declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3423
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3424
  			}
3b617e3b8   Joe Perches   checkpatch: net a...
3425
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3426
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
3427
3428
3429
3430
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
3705ce5bc   Joe Perches   checkpatch: creat...
3431
  		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3432
3433
3434
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3435
3436
3437
3438
  			if (WARN("LEADING_SPACE",
  				 "please, no spaces at the start of a line
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3439
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3440
  			}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3441
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3442
3443
  # 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 -...
3444
3445
3446
3447
3448
3449
  # 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...
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
  # 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 ...
3460
  # check indentation of any line with a bare else
840080a08   Joe Perches   checkpatch: add e...
3461
  # (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f9   Joe Perches   checkpatch: warn ...
3462
3463
3464
  # 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...
3465
3466
3467
3468
  			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 ...
3469
3470
3471
3472
3473
  				WARN("UNNECESSARY_ELSE",
  				     "else is not generally useful after a break or return
  " . $hereprev);
  			}
  		}
c00df19a5   Joe Perches   checkpatch: warn ...
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
  # 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...
3484
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
3485
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3486
3487
3488
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
3489
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3490

56e77d709   Joe Perches   checkpatch: warn ...
3491
3492
3493
3494
3495
3496
  # 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...
3497
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3498
3499
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3500
3501
  #print "LINE<$line>
  ";
ca8198640   Joe Perches   checkpatch: fix s...
3502
  		if ($linenr > $suppress_statement &&
1b5539b1f   Joe Perches   checkpatch: reduc...
3503
  		    $realcnt && $sline =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
3504
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
3505
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
3506
3507
3508
3509
3510
3511
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
  #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...
3523

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3524
3525
3526
3527
3528
3529
3530
  			# 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...
3531
3532
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
3533

c2fdda0df   Andy Whitcroft   update checkpatch...
3534
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
3535
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3536
3537
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
3538
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3539

463f28648   Andy Whitcroft   checkpatch: possi...
3540
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3541
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
3542
  			} 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...
3543
3544
3545
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3546
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
3547
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3548
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
3549
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3550
3551
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
3552
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3553
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3554
3555
3556
3557
3558
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
3559
  			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...
3560
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
3561

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
3569
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3570
3571
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3572
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3573

9c0ca6f9a   Andy Whitcroft   update checkpatch...
3574
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3575
3576
3577
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
3578

653d4876b   Andy Whitcroft   update checkpatch...
3579
3580
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
  		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...
3599
3600
3601
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
3602
3603
3604
3605
3606
  			}
  		}
  
  # 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...
3607
  		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...
3608
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3609
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
3610
3611
3612
3613
3614
3615
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3616
3617
3618
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
3619
3620
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
3621

548596d52   Andy Whitcroft   checkpatch: trail...
3622
3623
3624
3625
3626
3627
  			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...
3628
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
3629
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
3630

53210168f   Andy Whitcroft   checkpatch: tough...
3631
3632
3633
3634
3635
3636
3637
  			#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...
3638

d752fcc88   Joe Perches   checkpatch: add a...
3639
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3640
3641
3642
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3643
3644
3645
3646
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
3647
  			}
773647a09   Andy Whitcroft   update checkpatch...
3648
3649
3650
3651
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3652
3653
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3654
3655
3656
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3657
3658
3659
3660
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3661
3662
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
3663
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3664
  # Check relative indent for conditionals and blocks.
f6950a735   Joe Perches   checkpatch: impro...
3665
  		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...
3666
3667
3668
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3669
3670
3671
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
9f5af480f   Joe Perches   checkpatch: impro...
3672
3673
3674
  			# remove inline comments
  			$s =~ s/$;/ /g;
  			$c =~ s/$;/ /g;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3675
3676
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
3677
3678
3679
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3680

9f5af480f   Joe Perches   checkpatch: impro...
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
  			# 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...
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
  			# 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...
3707
3708
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
  				$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...
3719
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
3720
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3721
3722
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
3723
3724
3725
3726
3727
  				# 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...
3728
3729
3730
3731
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
3732
3733
3734
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3735
3736
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
3737
3738
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
3739
3740
3741
3742
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3743
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
  			}
  
  			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...
3759
3760
  			#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...
3761

9f5af480f   Joe Perches   checkpatch: impro...
3762
3763
3764
  			if ($check && $s ne '' &&
  			    (($sindent % 8) != 0 ||
  			     ($sindent < $indent) ||
f6950a735   Joe Perches   checkpatch: impro...
3765
3766
  			     ($sindent == $indent &&
  			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
9f5af480f   Joe Perches   checkpatch: impro...
3767
  			     ($sindent > $indent + 8))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3768
3769
3770
3771
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3772
3773
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3774
3775
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
3776
3777
3778
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
3779
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
3780
3781
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
3782
3783
3784
3785
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
3786
3787
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
3788
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3789
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
3790
  #ignore lines not being added
3705ce5bc   Joe Perches   checkpatch: creat...
3791
  		next if ($line =~ /^[^\+]/);
00df344fd   Andy Whitcroft   update checkpatch...
3792

11ca40a0f   Joe Perches   checkpatch: avoid...
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
  # 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 ...
3805
  # check for declarations of signed or unsigned without int
c84471157   Joe Perches   checkpatch: impro...
3806
  		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
3807
3808
  			my $type = $1;
  			my $var = $2;
207a8e846   Joe Perches   checkpatch: impro...
3809
3810
  			$var = "" if (!defined $var);
  			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
  				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...
3821
3822
3823
3824
3825
  					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 ...
3826
3827
3828
  				}
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3829
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
3830
3831
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3832
3833
3834
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3835
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3836
3837
3838
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3839
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3840
3841
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3842
3843
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
3844
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3845
3846
3847
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
3848
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3849
3850
3851
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3852
3853
3854
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3855

f0a594c1c   Andy Whitcroft   update checkpatch...
3856
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
3857
3858
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc88   Joe Perches   checkpatch: add a...
3859
3860
3861
  			if (ERROR("OPEN_BRACE",
  				  "that open brace { should be on the previous line
  " . $hereprev) &&
f2d7e4d43   Joe Perches   checkpatch: add f...
3862
3863
3864
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3865
3866
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3867
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3868
  				$fixedline = $line;
8d81ae05d   Cyril Bur   checkpatch: silen...
3869
  				$fixedline =~ s/^(.\s*)\{\s*/$1/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3870
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3871
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3872
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3873
3874
3875
3876
3877
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
3878
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
3879
3880
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3881
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
3882
3883
3884
3885
3886
3887
3888
  				      "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...
3889
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3890
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3891

0a920b5b6   Andy Whitcroft   add a trivial pat...
3892
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
3893
  		if ($line =~ m{//}) {
3705ce5bc   Joe Perches   checkpatch: creat...
3894
3895
3896
3897
  			if (ERROR("C99_COMMENTS",
  				  "do not use C99 // comments
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3898
  				my $line = $fixed[$fixlinenr];
3705ce5bc   Joe Perches   checkpatch: creat...
3899
3900
  				if ($line =~ /\/\/(.*)$/) {
  					my $comment = trim($1);
194f66fc9   Joe Perches   checkpatch: add a...
3901
  					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5bc   Joe Perches   checkpatch: creat...
3902
3903
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3904
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3905
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3906
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
3907
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
3908

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3909
3910
3911
3912
3913
3914
3915
3916
3917
  # 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...
3918
3919
3920
3921
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
3922
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
3923
3924
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
3925
3926
3927
3928
3929
3930
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3931
3932
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
3933
3934
3935
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3936
3937
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
3938
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3939
3940
3941
3942
3943
  #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...
3944
3945
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
  		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...
3956
3957
3958
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3959
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3960

5150bda43   Joe Eloff   checkpatch: chang...
3961
  # check for global initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
3962
  		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3963
  			if (ERROR("GLOBAL_INITIALISERS",
6d32f7a39   Joe Perches   checkpatch: impro...
3964
3965
  				  "do not initialise globals to $1
  " . $herecurr) &&
d5e616fc1   Joe Perches   checkpatch: add a...
3966
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
3967
  				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3968
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3969
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3970
  # check for static initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
3971
  		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3972
  			if (ERROR("INITIALISED_STATIC",
6d32f7a39   Joe Perches   checkpatch: impro...
3973
3974
  				  "do not initialise statics to $1
  " .
d5e616fc1   Joe Perches   checkpatch: add a...
3975
3976
  				      $herecurr) &&
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
3977
  				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3978
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3979
  		}
1813087db   Joe Perches   checkpatch: add t...
3980
3981
3982
3983
3984
3985
3986
  # 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 ...
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
  # 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...
4007
4008
  # 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...
4009
4010
4011
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
4012
  				$herecurr);
77b8c0a8e   Joe Perches   checkpatch: warn ...
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
  		}
  
  # check for initialized const char arrays that should be static const
  		if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
  			if (WARN("STATIC_CONST_CHAR_ARRAY",
  				 "const array should probably be static const
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
  			}
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
4024
4025
4026
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4027
4028
4029
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
4030
  				$herecurr);
77b8c0a8e   Joe Perches   checkpatch: warn ...
4031
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
4032

ab7e23f34   Joe Perches   checkpatch: add t...
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
  # 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...
4046
4047
4048
4049
4050
4051
4052
  # 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 '...
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
  # 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...
4066
4067
4068
4069
4070
4071
  # 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...
4072
  				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5f   Joe Perches   checkpatch.pl: ch...
4073
4074
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4075
4076
4077
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
4078
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4079
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
4080
  		    $line !~ /\b$typeTypedefs\b/ &&
46d832f5e   Michael S. Tsirkin   checkpatch: repla...
4081
  		    $line !~ /\b__bitwise\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4082
4083
4084
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
4085
4086
4087
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
4088
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
4089
4090
4091
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
4092
  			my ($ident, $from, $to) = ($1, $2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
4093
4094
4095
4096
4097
4098
  
  			# 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/...
4099
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4100
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
4101

3705ce5bc   Joe Perches   checkpatch: creat...
4102
4103
  ##			print "1: from<$from> to<$to> ident<$ident>
  ";
65863862b   Andy Whitcroft   checkpatch: dissa...
4104
  			if ($from ne $to) {
3705ce5bc   Joe Perches   checkpatch: creat...
4105
4106
4107
4108
4109
4110
4111
  				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...
4112
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4113
4114
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4115
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
4116
4117
4118
4119
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
4120
  			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
4121
4122
4123
4124
4125
4126
  
  			# 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/...
4127
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4128
4129
4130
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
4131

3705ce5bc   Joe Perches   checkpatch: creat...
4132
4133
  ##			print "2: from<$from> to<$to> ident<$ident>
  ";
667026e7b   Andy Whitcroft   checkpatch: a mod...
4134
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4135
4136
4137
4138
4139
4140
4141
4142
  				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...
4143
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4144
4145
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4146
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4147
  		}
9d3e3c705   Joe Perches   checkpatch: add w...
4148
4149
  # avoid BUG() or BUG_ON()
  		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4150
4151
4152
4153
4154
  			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...
4155
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4156

9d3e3c705   Joe Perches   checkpatch: add w...
4157
  # avoid LINUX_VERSION_CODE
8905a67c6   Andy Whitcroft   update checkpatch...
4158
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4159
4160
4161
  			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...
4162
  		}
17441227f   Joe Perches   checkpatch: add w...
4163
4164
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4165
  			WARN("PRINTK_RATELIMITED",
101ee6802   Joe Perches   checkpatch: neate...
4166
4167
  			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
4168
  		}
eeef5733e   Joe Perches   checkpatch: print...
4169
4170
4171
4172
4173
  # 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...
4174
  		}
243f3803c   Joe Perches   checkpatch: sugge...
4175
4176
4177
4178
  		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...
4179
4180
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
4181
  			WARN("PREFER_PR_LEVEL",
daa8b0592   Yogesh Chaudhari   checkpatch.pl: mo...
4182
4183
  			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
4184
4185
4186
  		}
  
  		if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4187
4188
4189
4190
  			if (WARN("PREFER_PR_LEVEL",
  				 "Prefer pr_warn(... to pr_warning(...
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4191
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4192
4193
  				    s/\bpr_warning\b/pr_warn/;
  			}
243f3803c   Joe Perches   checkpatch: sugge...
4194
  		}
dc1393130   Joe Perches   checkpatch: prefe...
4195
4196
4197
4198
4199
4200
4201
4202
4203
  		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...
4204
4205
4206
4207
4208
4209
4210
4211
  # 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...
4212
4213
  # 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...
4214
  		if ($perl_version_ok &&
2d453e3b4   Joe Perches   checkpatch: impro...
4215
4216
4217
  		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
  		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
  		    $sline !~ /}/) {
8d1824780   Joe Perches   checkpatch: add -...
4218
  			if (ERROR("OPEN_BRACE",
2d453e3b4   Joe Perches   checkpatch: impro...
4219
4220
  				  "open brace '{' following function definitions go on the next line
  " . $herecurr) &&
8d1824780   Joe Perches   checkpatch: add -...
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
  			    $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...
4233
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4234

8905a67c6   Andy Whitcroft   update checkpatch...
4235
4236
4237
  # 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 -...
4238
4239
4240
4241
4242
4243
4244
4245
4246
  			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...
4247
  				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
8d1824780   Joe Perches   checkpatch: add -...
4248
4249
4250
4251
  				if ($fixedline !~ /^\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
4252
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4253
  # missing space after union, struct or enum definition
3705ce5bc   Joe Perches   checkpatch: creat...
4254
4255
4256
4257
4258
  		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...
4259
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4260
4261
  				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
  			}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4262
  		}
31070b5d4   Joe Perches   checkpatch: add t...
4263
4264
4265
  # Function pointer declarations
  # check spacing between type, funcptr, and args
  # canonical declaration is "type (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4266
  		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d4   Joe Perches   checkpatch: add t...
4267
4268
4269
4270
4271
4272
  			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...
4273
4274
4275
4276
4277
4278
4279
4280
4281
  # 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...
4282
4283
4284
  				WARN("SPACING",
  				     "missing space after return type
  " . $herecurr);
91f72e9c6   Joe Perches   checkpatch: don't...
4285
  				$post_declare_space = " ";
31070b5d4   Joe Perches   checkpatch: add t...
4286
4287
4288
  			}
  
  # unnecessary space "type  (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
  # 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...
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
  
  # 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...
4333
  				$fixed[$fixlinenr] =~
91f72e9c6   Joe Perches   checkpatch: don't...
4334
  				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d4   Joe Perches   checkpatch: add t...
4335
4336
  			}
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4337
4338
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4339
4340
  #  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...
4341
4342
4343
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4344
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
38dca988b   Heinrich Schuchardt   checkpatch: allow...
4345
  			    $prefix !~ /[{,:]\s+$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4346
4347
4348
4349
  				if (ERROR("BRACKET_SPACE",
  					  "space prohibited before open square bracket '['
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4350
  				    $fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4351
4352
  					s/^(\+.*?)\s+\[/$1\[/;
  				}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4353
4354
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4355
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
4356
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4357
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
4358
4359
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
4360
4361
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
4362
4363
4364
4365
4366
4367
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
4368
4369
4370
  			# 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...
4371
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
4372
4373
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
4374
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4375
4376
4377
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
4378
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4379
4380
  
  			} else {
3705ce5bc   Joe Perches   checkpatch: creat...
4381
4382
4383
4384
  				if (WARN("SPACING",
  					 "space prohibited between function name and open parenthesis '('
  " . $herecurr) &&
  					     $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4385
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4386
4387
  					    s/\b$name\s+\(/$name\(/;
  				}
6c72ffaab   Andy Whitcroft   update checkpatch...
4388
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
4389
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
4390

653d4876b   Andy Whitcroft   update checkpatch...
4391
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4392
  		if (!($line=~/\#\s*include/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4393
4394
  			my $fixed_line = "";
  			my $line_fixed = 0;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4395
4396
4397
4398
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
4399
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
847316231   Joe Perches   checkpatch: repor...
4400
  				\?:|\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4401
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
4402
  			my @elements = split(/($ops|;)/, $opline);
3705ce5bc   Joe Perches   checkpatch: creat...
4403
4404
4405
4406
4407
4408
4409
4410
4411
  
  ##			print("element count: <" . $#elements . ">
  ");
  ##			foreach my $el (@elements) {
  ##				print("el: <$el>
  ");
  ##			}
  
  			my @fix_elements = ();
00df344fd   Andy Whitcroft   update checkpatch...
4412
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4413

3705ce5bc   Joe Perches   checkpatch: creat...
4414
4415
4416
4417
4418
4419
  			foreach my $el (@elements) {
  				push(@fix_elements, substr($rawline, $off, length($el)));
  				$off += length($el);
  			}
  
  			$off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4420
  			my $blank = copy_spacing($opline);
b34c648bb   Joe Perches   checkpatch: bette...
4421
  			my $last_after = -1;
6c72ffaab   Andy Whitcroft   update checkpatch...
4422

0a920b5b6   Andy Whitcroft   add a trivial pat...
4423
  			for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5bc   Joe Perches   checkpatch: creat...
4424
4425
4426
4427
4428
  
  				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
  
  ##				print("n: <$n> good: <$good>
  ");
4a0df2ef4   Andy Whitcroft   update checkpatch...
4429
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
4430
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
4431
4432
4433
4434
4435
4436
  				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...
4437
4438
4439
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
4440
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4441
4442
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
4443
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4444

0a920b5b6   Andy Whitcroft   add a trivial pat...
4445
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
4446
4447
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4448
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4449
4450
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
4451
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4452
4453
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
4454
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4455
4456
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4457
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4458
4459
4460
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
4461
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
4462
4463
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
4464

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

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

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

d8aaf1214   Andy Whitcroft   update checkpatch...
4477
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
4478
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
4479
4480
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4481
4482
4483
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4484
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4485
4486
  							$line_fixed = 1;
  						}
d8aaf1214   Andy Whitcroft   update checkpatch...
4487
4488
4489
4490
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
4491

b00e48148   Joe Perches   checkpatch: don't...
4492
4493
4494
  				#   :   when part of a bitfield
  				} elsif ($opv eq ':B') {
  					# skip the bitfield test for now
1f65f947a   Andy Whitcroft   checkpatch: add c...
4495
4496
  				# No spaces for:
  				#   ->
b00e48148   Joe Perches   checkpatch: don't...
4497
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4498
  					if ($ctx =~ /Wx.|.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4499
4500
4501
  						if (ERROR("SPACING",
  							  "spaces prohibited around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4502
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4503
4504
4505
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4506
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4507
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4508
  					}
2381097b6   Joe Perches   checkpatch: add a...
4509
  				# , must not have a space before and must have a space on the right.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4510
  				} elsif ($op eq ',') {
2381097b6   Joe Perches   checkpatch: add a...
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
  					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...
4521
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4522
4523
4524
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4525
  							$line_fixed = 1;
b34c648bb   Joe Perches   checkpatch: bette...
4526
  							$last_after = $n;
2381097b6   Joe Perches   checkpatch: add a...
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
  							$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...
4538
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4539
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4540
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
4541
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4542
4543
4544
4545
4546
4547
4548
  					#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...
4549
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
4550
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
4551
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4552
4553
4554
  						if (ERROR("SPACING",
  							  "space required before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4555
4556
4557
4558
  							if ($n != $last_after + 2) {
  								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
4559
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4560
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
4561
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4562
4563
4564
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4565
4566
4567
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4568
  							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4569
4570
4571
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4572
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4573
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4574
4575
4576
4577
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
4578
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4579
4580
4581
  						if (ERROR("SPACING",
  							  "space required one side of that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4582
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4583
4584
  							$line_fixed = 1;
  						}
773647a09   Andy Whitcroft   update checkpatch...
4585
4586
4587
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4588
4589
4590
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4591
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4592
4593
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4594
  					}
773647a09   Andy Whitcroft   update checkpatch...
4595
  					if ($ctx =~ /ExW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4596
4597
4598
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4599
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4600
4601
4602
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4603
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4604
  						}
653d4876b   Andy Whitcroft   update checkpatch...
4605
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4606

0a920b5b6   Andy Whitcroft   add a trivial pat...
4607
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4608
4609
4610
  				} 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...
4611
4612
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
4613
  				{
d2e025f36   Joe Perches   checkpatch: add -...
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
  					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...
4632
4633
4634
  						if (ERROR("SPACING",
  							  "need consistent spacing around '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4635
4636
4637
4638
  							$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...
4639
4640
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4641
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4642
4643
4644
4645
  				# 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...
4646
4647
4648
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4649
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4650
4651
  							$line_fixed = 1;
  						}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4652
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4653
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
4654
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
4655
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
4656
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
4657
4658
4659
4660
4661
4662
4663
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
e0df7e1fa   Joe Perches   checkpatch: avoid...
4664
4665
4666
4667
4668
4669
4670
  					# 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...
4671
  					# messages are ERROR, but ?: are CHK
1f65f947a   Andy Whitcroft   checkpatch: add c...
4672
  					if ($ok == 0) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4673
4674
  						my $msg_level = \&ERROR;
  						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
847316231   Joe Perches   checkpatch: repor...
4675

0675a8fbd   Jean Delvare   checkpatch: renam...
4676
4677
4678
  						if (&{$msg_level}("SPACING",
  								  "spaces required around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4679
4680
4681
4682
  							$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...
4683
4684
  							$line_fixed = 1;
  						}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4685
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4686
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4687
  				$off += length($elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4688
4689
4690
4691
4692
4693
4694
4695
4696
  
  ##				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...
4697
  			}
3705ce5bc   Joe Perches   checkpatch: creat...
4698

194f66fc9   Joe Perches   checkpatch: add a...
4699
4700
  			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
  				$fixed[$fixlinenr] = $fixed_line;
3705ce5bc   Joe Perches   checkpatch: creat...
4701
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4702
  		}
786b63262   Joe Perches   checkpatch: move ...
4703
  # check for whitespace before a non-naked semicolon
d2e248e7b   Joe Perches   checkpatch: warn ...
4704
  		if ($line =~ /^\+.*\S\s+;\s*$/) {
786b63262   Joe Perches   checkpatch: move ...
4705
4706
4707
4708
  			if (WARN("SPACING",
  				 "space prohibited before semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4709
  				1 while $fixed[$fixlinenr] =~
786b63262   Joe Perches   checkpatch: move ...
4710
4711
4712
  				    s/^(\+.*\S)\s+;/$1;/;
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4713
4714
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4715
4716
4717
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
4718
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
  ## # 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...
4730
4731
4732
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
4733
4734
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4735

0a920b5b6   Andy Whitcroft   add a trivial pat...
4736
  #need space before brace following if, while, etc
6b8c69e43   Geyslan G. Bem   checkpatch: fix a...
4737
  		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
6ad724e2a   Michal Zylowski   checkpatch: check...
4738
  		    $line =~ /\b(?:else|do)\{/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4739
4740
4741
4742
  			if (ERROR("SPACING",
  				  "space required before the open brace '{'
  " . $herecurr) &&
  			    $fix) {
6ad724e2a   Michal Zylowski   checkpatch: check...
4743
  				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
3705ce5bc   Joe Perches   checkpatch: creat...
4744
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4745
  		}
c4a62ef91   Joe Perches   checkpatch: add a...
4746
4747
4748
4749
4750
4751
4752
4753
  ## # 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...
4754
4755
  # closing brace should have a space following it when it has anything
  # on the line
94fb98450   Joe Perches   checkpatch: allow...
4756
  		if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4757
4758
4759
4760
  			if (ERROR("SPACING",
  				  "space required after that close brace '}'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4761
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4762
4763
  				    s/}((?!(?:,|;|\)))\S)/} $1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4764
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4765
4766
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4767
4768
4769
4770
  			if (ERROR("SPACING",
  				  "space prohibited after that open square bracket '['
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4771
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4772
4773
  				    s/\[\s+/\[/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4774
4775
  		}
  		if ($line =~ /\s\]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4776
4777
4778
4779
  			if (ERROR("SPACING",
  				  "space prohibited before that close square bracket ']'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4780
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4781
4782
  				    s/\s+\]/\]/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4783
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4784
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4785
4786
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4787
4788
4789
4790
  			if (ERROR("SPACING",
  				  "space prohibited after that open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4791
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4792
4793
  				    s/\(\s+/\(/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4794
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4795
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4796
4797
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4798
4799
4800
4801
  			if (ERROR("SPACING",
  				  "space prohibited before that close parenthesis ')'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4802
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4803
4804
  				    s/\s+\)/\)/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4805
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
4806
4807
4808
4809
  # 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 -...
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
  			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 ...
4833

63b7c73ec   Joe Perches   checkpatch: add -...
4834
  # check for unnecessary parentheses around comparisons in if uses
a032aa4c4   Joe Perches   checkpatch: exclu...
4835
4836
  # when !drivers/staging or command-line uses --strict
  		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
5b57980de   Joe Perches   checkpatch: impro...
4837
  		    $perl_version_ok && defined($stat) &&
63b7c73ec   Joe Perches   checkpatch: add -...
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
  		    $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...
4862
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
4863
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
4864
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4865
4866
4867
4868
  			if (WARN("INDENTED_LABEL",
  				 "labels should not be indented
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4869
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4870
4871
  				    s/^(.)\s+/$1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4872
  		}
5b9553abf   Joe Perches   checkpatch: make ...
4873
  # return is not a function
507e51418   Joe Perches   checkpatch: impro...
4874
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
4875
  			my $spacing = $1;
5b57980de   Joe Perches   checkpatch: impro...
4876
  			if ($perl_version_ok &&
5b9553abf   Joe Perches   checkpatch: make ...
4877
4878
4879
4880
4881
4882
4883
4884
  			    $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...
4885
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4886
4887
4888
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
4889
4890
  			}
  		}
507e51418   Joe Perches   checkpatch: impro...
4891

b43ae21bd   Joe Perches   checkpatch: reduc...
4892
4893
4894
4895
4896
4897
4898
4899
  # 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 ...
4900
  			WARN("RETURN_VOID",
b43ae21bd   Joe Perches   checkpatch: reduc...
4901
4902
4903
  			     "void function return statements are not generally useful
  " . $hereprev);
                 }
9819cf252   Joe Perches   checkpatch: warn ...
4904

189248d8f   Joe Perches   checkpatch: check...
4905
  # if statements using unnecessary parentheses - ie: if ((foo == bar))
5b57980de   Joe Perches   checkpatch: impro...
4906
  		if ($perl_version_ok &&
189248d8f   Joe Perches   checkpatch: check...
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
  		    $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...
4919
4920
4921
4922
  # 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...
4923
  		if ($perl_version_ok &&
c5595fa2f   Joe Perches   checkpatch: add c...
4924
4925
4926
4927
4928
4929
  		    $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...
4930
  			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
c5595fa2f   Joe Perches   checkpatch: add c...
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
  			    $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...
4948
4949
  # 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...
4950
4951
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4952
  				WARN("USE_NEGATIVE_ERRNO",
f34e4a4f9   Joe Perches   checkpatch: impro...
4953
4954
  				     "return of an errno should typically be negative (ie: return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
4955
4956
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4957

0a920b5b6   Andy Whitcroft   add a trivial pat...
4958
  # Need a space before open parenthesis after if, while etc
3705ce5bc   Joe Perches   checkpatch: creat...
4959
4960
4961
4962
4963
  		if ($line =~ /\b(if|while|for|switch)\(/) {
  			if (ERROR("SPACING",
  				  "space required before the open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4964
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4965
4966
  				    s/\b(if|while|for|switch)\(/$1 \(/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4967
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
4968
4969
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
4970
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
4971
4972
4973
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
  			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 "...
4996
  		    defined($stat) && defined($cond) &&
170d3a226   Andy Whitcroft   checkpatch: handl...
4997
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4998
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
4999

b53c8e104   Andy Whitcroft   checkpatch: ensur...
5000
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5001
5002
5003
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
5004
5005
5006
5007
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
5008
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
5009
5010
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
5011
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
5012
5013
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
5014
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5015
5016
5017
5018
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
5019
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5020

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
5021
5022
5023
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5024
5025
5026
5027
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
5028
5029
5030
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
5031
5032
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
  # 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...
5045
5046
5047
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
5048
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
5049
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
5050
5051
5052
5053
  		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...
5054
5055
5056
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
5057
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5058
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
5059
5060
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5061
  			ERROR("TRAILING_STATEMENTS",
048b123fa   Rasmus Villemoes   checkpatch.pl: al...
5062
5063
  			      "trailing statements should be on next line (or did you mean 'else if'?)
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
5064
5065
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
5066
5067
5068
  # 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...
5069
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
5070
5071
5072
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5073
5074
5075
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
5076
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5077
5078
5079
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
8b8856f4b   Joe Perches   checkpatch: fix b...
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
  		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...
5097
  		}
8b8856f4b   Joe Perches   checkpatch: fix b...
5098
5099
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
  		    $previndent == $indent) {
c2fdda0df   Andy Whitcroft   update checkpatch...
5100
5101
5102
5103
  			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...
5104
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
5105
5106
5107
5108
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
8b8856f4b   Joe Perches   checkpatch: fix b...
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
  				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...
5122
5123
  			}
  		}
95e2c6023   Joe Perches   checkpatch: warn ...
5124
  #Specific variable tests
323c1260b   Joe Perches   checkpatch: warn ...
5125
5126
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
95e2c6023   Joe Perches   checkpatch: warn ...
5127

95e2c6023   Joe Perches   checkpatch: warn ...
5128
  #CamelCase
807bd26c4   Joe Perches   checkpatch: remov...
5129
  			if ($var !~ /^$Constant$/ &&
be79794bc   Joe Perches   checkpatch: chang...
5130
  			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
5131
  #Ignore Page<foo> variants
807bd26c4   Joe Perches   checkpatch: remov...
5132
  			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
5133
  #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
f51235764   Julius Werner   checkpatch: allow...
5134
5135
5136
  			    $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...
5137
5138
5139
  				while ($var =~ m{($Ident)}g) {
  					my $word = $1;
  					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b077101   Joe Perches   checkpatch: exten...
5140
5141
5142
5143
5144
5145
5146
  					if ($check) {
  						seed_camelcase_includes();
  						if (!$file && !$camelcase_file_seeded) {
  							seed_camelcase_file($realfile);
  							$camelcase_file_seeded = 1;
  						}
  					}
7e781f67d   Joe Perches   checkpatch: check...
5147
5148
5149
5150
5151
5152
  					if (!defined $camelcase{$word}) {
  						$camelcase{$word} = 1;
  						CHK("CAMELCASE",
  						    "Avoid CamelCase: <$word>
  " . $herecurr);
  					}
3445686af   Joe Perches   checkpatch: ignor...
5153
  				}
323c1260b   Joe Perches   checkpatch: warn ...
5154
5155
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5156
5157
  
  #no spaces allowed after \ in define
d5e616fc1   Joe Perches   checkpatch: add a...
5158
5159
5160
5161
5162
  		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...
5163
  				$fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
5164
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5165
  		}
0e212e0a7   Fabian Frederick   checkpatch: don't...
5166
5167
  # 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...
5168
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
5169
5170
5171
5172
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
5173
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
5174
  			{
0e212e0a7   Fabian Frederick   checkpatch: don't...
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
  				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...
5186
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5187
5188
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5189
5190
  # 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...
5191
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
5192
5193
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
5194
5195
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
5196
5197
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
08a2843e7   Joe Perches   checkpatch: warn ...
5198
5199
  			my $has_flow_statement = 0;
  			my $has_arg_concat = 0;
c45dcabd2   Andy Whitcroft   update checkpatch...
5200
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
5201
5202
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
5203
5204
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
5205
5206
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
5207

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

f59b64bff   Joe Perches   checkpatch: add -...
5211
5212
5213
5214
5215
5216
5217
5218
  			$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...
5219
  				$define_args =~ s/\\\+?//g;
f59b64bff   Joe Perches   checkpatch: add -...
5220
5221
  				@def_args = split(",", $define_args);
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
5222
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5223
5224
5225
5226
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
5227

c45dcabd2   Andy Whitcroft   update checkpatch...
5228
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
5229
5230
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
6b10df425   Vladimir Zapolskiy   checkpatch: fix a...
5231
  			       $dstat =~ s/.\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
5232
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
5233
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
5234

e45bab8eb   Andy Whitcroft   checkpatch: handl...
5235
  			# Flatten any obvious string concatentation.
33acb54a4   Joe Perches   checkpatch: use $...
5236
5237
  			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*($String)/$1/)
e45bab8eb   Andy Whitcroft   checkpatch: handl...
5238
5239
  			{
  			}
42e152931   Joe Perches   checkpatch: exclu...
5240
5241
  			# Make asm volatile uses seem like a generic function
  			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5242
5243
5244
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
5245
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
5246
5247
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
5248
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
5249
5250
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
5251
  				\.$Ident\s*=\s*|
6b10df425   Vladimir Zapolskiy   checkpatch: fix a...
5252
5253
  				^\"|\"$|
  				^\[
c45dcabd2   Andy Whitcroft   update checkpatch...
5254
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
5255
5256
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f59b64bff   Joe Perches   checkpatch: add -...
5257
5258
5259
  
  			$ctx =~ s/
  *$//;
f59b64bff   Joe Perches   checkpatch: add -...
5260
  			my $stmt_cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5261
  			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
f59b64bff   Joe Perches   checkpatch: add -...
5262

f74bd1942   Andy Whitcroft   checkpatch: corre...
5263
5264
5265
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
3cc4b1c3f   Joe Perches   checkpatch: reduc...
5266
  			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd3981   Joe Perches   checkpatch: fix c...
5267
  			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
5268
5269
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
e942e2c3f   Joe Perches   checkpatch: fix s...
5270
  			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
72f115f94   Andy Whitcroft   checkpatch: compl...
5271
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
5272
5273
5274
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
4e5d56bdf   Eddie Kovsky   checkpatch: fix l...
5275
  			    $dstat !~ /^\(\{/ &&						# ({...
f95a7e6a4   Joe Perches   checkpatch: ignor...
5276
  			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd1942   Andy Whitcroft   checkpatch: corre...
5277
  			{
e795556a5   Joe Perches   checkpatch: impro...
5278
5279
5280
5281
5282
  				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...
5283
5284
5285
5286
  					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...
5287
  					ERROR("COMPLEX_MACRO",
388982b55   Andrew Morton   checkpatch: fix s...
5288
5289
  					      "Macros with complex values should be enclosed in parentheses
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
5290
  				}
f59b64bff   Joe Perches   checkpatch: add -...
5291
5292
  
  			}
5207649b7   Joe Perches   checkpatch: impro...
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
  
  			# 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 -...
5311
5312
5313
  # check if any macro arguments are reused (ignore '...' and 'type')
  			foreach my $arg (@def_args) {
  			        next if ($arg =~ /\.\.\./);
9192d41a3   Joe Perches   checkpatch: add -...
5314
  			        next if ($arg =~ /^type$/i);
7fe528a27   Joe Perches   checkpatch: impro...
5315
  				my $tmp_stmt = $define_stmt;
6dba824e9   Brendan Jackman   checkpatch: exclu...
5316
  				$tmp_stmt =~ s/\b(sizeof|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
7fe528a27   Joe Perches   checkpatch: impro...
5317
5318
  				$tmp_stmt =~ s/\#+\s*$arg\b//g;
  				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
d41362ed1   Joe Perches   checkpatch: fix m...
5319
  				my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
f59b64bff   Joe Perches   checkpatch: add -...
5320
5321
5322
5323
  				if ($use_cnt > 1) {
  					CHK("MACRO_ARG_REUSE",
  					    "Macro argument reuse '$arg' - possible side-effects?
  " . "$herectx");
9192d41a3   Joe Perches   checkpatch: add -...
5324
5325
  				    }
  # check if any macro arguments may have other precedence issues
7fe528a27   Joe Perches   checkpatch: impro...
5326
  				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
9192d41a3   Joe Perches   checkpatch: add -...
5327
5328
5329
5330
5331
  				    ((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 -...
5332
  				}
653d4876b   Andy Whitcroft   update checkpatch...
5333
  			}
5023d3472   Joe Perches   checkpatch: warn ...
5334

08a2843e7   Joe Perches   checkpatch: warn ...
5335
5336
5337
  # 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 ...
5338
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5339
  				my $herectx = get_stat_here($linenr, $cnt, $here);
08a2843e7   Joe Perches   checkpatch: warn ...
5340

08a2843e7   Joe Perches   checkpatch: warn ...
5341
5342
5343
5344
  				WARN("MACRO_WITH_FLOW_CONTROL",
  				     "Macros with flow control statements should be avoided
  " . "$herectx");
  			}
481eb486a   Joe Perches   checkpatch: exten...
5345
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
5346
5347
5348
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
5349
5350
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
5351
5352
5353
5354
5355
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5356
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
5357
5358
5359
  # 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...
5360
  		if ($perl_version_ok &&
b13edf7ff   Joe Perches   checkpatch: add c...
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
  		    $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...
5373
  			$dstat =~ s/$;/ /g;
b13edf7ff   Joe Perches   checkpatch: add c...
5374
5375
5376
5377
5378
5379
5380
5381
  
  			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...
5382
  				my $herectx = get_stat_here($linenr, $cnt, $here);
b13edf7ff   Joe Perches   checkpatch: add c...
5383

ac8e97f8a   Joe Perches   checkpatch: add c...
5384
5385
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
5386
5387
5388
5389
5390
5391
5392
5393
5394
  					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 ...
5395
5396
5397
5398
  			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5399
  				my $herectx = get_stat_here($linenr, $cnt, $here);
f5ef95b12   Joe Perches   checkpatch: warn ...
5400
5401
5402
5403
  
  				WARN("TRAILING_SEMICOLON",
  				     "macros should not use a trailing semicolon
  " . "$herectx");
b13edf7ff   Joe Perches   checkpatch: add c...
5404
5405
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5406
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
5407
5408
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
5409
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
5410
5411
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5412
5413
5414
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
5415
5416
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
5417
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
5418
5419
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5420
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
5421
5422
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
5423
5424
5425
5426
  					# 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 -...
5427
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
5428
5429
5430
5431
5432
5433
5434
5435
5436
  					#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...
5437
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
5438
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
5439
5440
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
5441
5442
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5443
5444
5445
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5446
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5447
5448
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5449
5450
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5451
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5452
  					}
cf655043d   Andy Whitcroft   update checkpatch...
5453
5454
5455
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5456
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5457
  					}
aad4f6149   Joe Perches   checkpatch: add -...
5458
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
5459
  				}
aad4f6149   Joe Perches   checkpatch: add -...
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
  				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...
5475
5476
5477
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
5478
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
5479
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5480
5481
5482
5483
5484
5485
5486
5487
  			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...
5488
5489
5490
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
5491
5492
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
5493
5494
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5495
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
5496
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
  			}
  			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...
5517
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5518
5519
5520
5521
5522
5523
5524
5525
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
f055663c5   Andy Whitcroft   checkpatch: repor...
5526
  				my $cnt = statement_rawlines($block);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5527
  				my $herectx = get_stat_here($linenr, $cnt, $here);
cf655043d   Andy Whitcroft   update checkpatch...
5528

000d1cc18   Joe Perches   checkpatch.pl: ad...
5529
5530
5531
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
5532
5533
  			}
  		}
e4c5babd3   Joe Perches   checkpatch: notic...
5534
  # check for single line unbalanced braces
953304736   Sven Eckelmann   checkpatch: remov...
5535
5536
  		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
  		    $sline =~ /^.\s*else\s*\{\s*$/) {
e4c5babd3   Joe Perches   checkpatch: notic...
5537
5538
5539
  			CHK("BRACES", "Unbalanced braces around else statement
  " . $herecurr);
  		}
0979ae664   Joe Perches   checkpatch: Add -...
5540
  # check for unnecessary blank lines around braces
77b9a53a6   Joe Perches   checkpatch: don't...
5541
  		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5542
5543
5544
5545
5546
5547
  			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 -...
5548
  		}
77b9a53a6   Joe Perches   checkpatch: don't...
5549
  		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5550
5551
5552
5553
5554
5555
  			if (CHK("BRACES",
  				"Blank lines aren't necessary after an open brace '{'
  " . $hereprev) &&
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  			}
0979ae664   Joe Perches   checkpatch: Add -...
5556
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5557
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
5558
5559
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5560
  			WARN("VOLATILE",
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
5561
5562
  			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5563
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5564
5565
5566
5567
  # 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 $...
5568
  		if ($line =~ /^\+\s*$String/ &&
5e4f6ba5e   Joe Perches   checkpatch: add a...
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
  		    $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...
5604
5605
5606
5607
  # 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 ...
5608
5609
  		if ($line =~ /^\+.*$String/ &&
  		    defined($context_function) &&
e4b7d3091   Joe Perches   checkpatch: clari...
5610
5611
  		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
  		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
77cb8546b   Joe Perches   checkpatch: warn ...
5612
  			WARN("EMBEDDED_FUNCTION_NAME",
e4b7d3091   Joe Perches   checkpatch: clari...
5613
5614
  			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string
  " . $herecurr);
77cb8546b   Joe Perches   checkpatch: warn ...
5615
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
  # 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 -...
5629
  # concatenated string without spaces between elements
79682c0c0   Joe Perches   checkpatch: add -...
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
  		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 -...
5641
  		}
90ad30e5b   Joe Perches   checkpatch: add t...
5642
  # uncoalesced string fragments
33acb54a4   Joe Perches   checkpatch: use $...
5643
  		if ($line =~ /$String\s*"/) {
79682c0c0   Joe Perches   checkpatch: add -...
5644
5645
5646
5647
5648
5649
5650
5651
5652
  			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...
5653
  		}
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5654
5655
5656
  # 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...
5657
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5658
  			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5e4f6ba5e   Joe Perches   checkpatch: add a...
5659
  			$string =~ s/%%/__/g;
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5660
5661
  			# check for %L
  			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5662
  				WARN("PRINTF_L",
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
  				     "\%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 ...
5677
5678
5679
  				      "Prefixing 0x with decimal output is defective
  " . $herecurr);
  			}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5680
5681
5682
  		}
  
  # check for line continuations in quoted strings with odd counts of "
3f7f335db   Joe Perches   checkpatch: impro...
5683
  		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5684
5685
5686
5687
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
5688
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
5689
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
60f890105   Prakruthi Deepak Heragu   checkpatch: check...
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
  			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...
5700
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
5701
5702
  # check for needless "if (<foo>) fn(<foo>)" uses
  		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
100425dee   Joe Perches   checkpatch: add s...
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
  			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...
5732
5733
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5734

ebfdc4096   Joe Perches   checkpatch: attem...
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
  # 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>
  
  
  ");
e29a70f15   Joe Perches   checkpatch: add s...
5751
5752
5753
  			if ($s =~ /(?:^|
  )[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
  			    $s !~ /\b__GFP_NOWARN\b/ ) {
ebfdc4096   Joe Perches   checkpatch: attem...
5754
5755
5756
5757
5758
  				WARN("OOM_MESSAGE",
  				     "Possible unnecessary 'out of memory' message
  " . $hereprev);
  			}
  		}
f78d98f6c   Joe Perches   checkpatch: warn ...
5759
  # check for logging functions with KERN_<LEVEL>
dcaf11236   Paolo Bonzini   checkpatch: fix U...
5760
  		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6c   Joe Perches   checkpatch: warn ...
5761
5762
5763
5764
5765
5766
5767
5768
5769
  		    $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 ...
5770
5771
5772
5773
5774
5775
  # 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...
5776
  # check for mask then right shift without a parentheses
5b57980de   Joe Perches   checkpatch: impro...
5777
  		if ($perl_version_ok &&
abb08a538   Joe Perches   checkpatch: try t...
5778
5779
5780
5781
5782
5783
  		    $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 -...
5784
  # check for pointer comparisons to NULL
5b57980de   Joe Perches   checkpatch: impro...
5785
  		if ($perl_version_ok) {
b75ac618d   Joe Perches   checkpatch: add -...
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
  			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...
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
  # 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...
5813
  					$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...
5814
5815
5816
  				}
  			}
  		}
e970b8846   Joe Perches   checkpatch: add r...
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
  # 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...
5827
  				$fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
  				    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...
5839
  				my $lead = $fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
5840
5841
5842
5843
  				    /(^\+\s*(?:static\s+))/;
  				$lead = rtrim($1);
  				$lead = "$lead " if ($lead !~ /^\+$/);
  				$lead = "${lead}const ";
194f66fc9   Joe Perches   checkpatch: add a...
5844
  				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b8846   Joe Perches   checkpatch: add r...
5845
5846
  			}
  		}
c17893c74   Joe Perches   checkpatch: add a...
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
  # 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 ...
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
  # 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...
5867
  				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138c   Joe Perches   checkpatch: warn ...
5868
5869
  			}
  		}
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5870
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
5871
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c3   Joe Perches   checkpatch: add t...
5872
  			my $delay = $1;
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5873
  			# ignore udelay's < 10, however
43c1d77c3   Joe Perches   checkpatch: add t...
5874
  			if (! ($delay < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5875
  				CHK("USLEEP_RANGE",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
5876
5877
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst
  " . $herecurr);
43c1d77c3   Joe Perches   checkpatch: add t...
5878
5879
5880
5881
5882
  			}
  			if ($delay > 2000) {
  				WARN("LONG_UDELAY",
  				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h
  " . $herecurr);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5883
5884
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
5885
5886
5887
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5888
  				WARN("MSLEEP",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
5889
5890
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst
  " . $herecurr);
09ef87255   Patrick Pannuto   checkpatch: warn ...
5891
5892
  			}
  		}
36ec19390   Joe Perches   checkpatch: warn ...
5893
5894
5895
5896
5897
5898
  # 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 ...
5899
5900
5901
5902
5903
5904
  # 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...
5905
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
5906
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
5907
5908
5909
5910
5911
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5912
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
5913
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5914
5915
5916
5917
  			if (ERROR("SPACING",
  				  "exactly one space required after that #$1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5918
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5919
5920
  				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5921
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5922
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
5923
5924
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
5925
5926
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5927
5928
5929
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5930
5931
5932
  			}
  		}
  # check for memory barriers without a comment.
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
  
  		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...
5950
5951
  			smp_(?:$barrier_stems)|
  			virt_(?:$barrier_stems)
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
5952
5953
5954
  		}x;
  
  		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
5955
  			if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb99   Joe Perches   checkpatch: make ...
5956
5957
5958
  				WARN("MEMORY_BARRIER",
  				     "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5959
5960
  			}
  		}
3ad81779a   Paul E. McKenney   scripts: Make che...
5961

f4073b0f6   Michael S. Tsirkin   checkpatch: check...
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
  		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...
5972
5973
5974
5975
5976
5977
5978
5979
  # 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...
5980

91db2592e   Paul E. McKenney   checkpatch: Add w...
5981
5982
5983
5984
5985
5986
  # 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...
5987
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
5988
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5989
5990
5991
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
5992
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5993

596ed45b5   Joe Perches   checkpatch: impro...
5994
5995
5996
5997
5998
5999
  # 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 ...
6000
  # Check that the storage class is at the beginning of a declaration
596ed45b5   Joe Perches   checkpatch: impro...
6001
6002
6003
6004
  		if ($line =~ /\b$Storage\b/ &&
  		    $line !~ /^.\s*$Storage/ &&
  		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
  		    $1 !~ /[\,\)]\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6005
  			WARN("STORAGE_CLASS",
596ed45b5   Joe Perches   checkpatch: impro...
6006
6007
  			     "storage class should be at the beginning of the declaration
  " . $herecurr);
d4977c78e   Tobias Klauser   checkpatch: warn ...
6008
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6009
6010
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6011
6012
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6013
6014
6015
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6016
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
6017
  # Check for __inline__ and __inline, prefer inline
2b7ab4539   Joe Perches   checkpatch: don't...
6018
6019
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6020
6021
6022
6023
  			if (WARN("INLINE",
  				 "plain inline is preferred over $1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6024
  				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc1   Joe Perches   checkpatch: add a...
6025
6026
  
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
6027
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
6028
  # Check for __attribute__ packed, prefer __packed
2b7ab4539   Joe Perches   checkpatch: don't...
6029
6030
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6031
6032
6033
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
6034
  		}
39b7e2878   Joe Perches   checkpatch: add a...
6035
  # Check for __attribute__ aligned, prefer __aligned
2b7ab4539   Joe Perches   checkpatch: don't...
6036
6037
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6038
6039
6040
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
6041
  		}
462811d9d   Joe Perches   checkpatch: prefe...
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
  # Check for __attribute__ section, prefer __section
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) {
  			my $old = substr($rawline, $-[1], $+[1] - $-[1]);
  			my $new = substr($old, 1, -1);
  			if (WARN("PREFER_SECTION",
  				 "__section($new) is preferred over __attribute__((section($old)))
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/;
  			}
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
6054
  # Check for __attribute__ format(printf, prefer __printf
2b7ab4539   Joe Perches   checkpatch: don't...
6055
6056
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6057
6058
6059
6060
  			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...
6061
  				$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...
6062
6063
  
  			}
5f14d3bd8   Joe Perches   checkpatch: prefe...
6064
  		}
6061d949d   Joe Perches   include/ and chec...
6065
  # Check for __attribute__ format(scanf, prefer __scanf
2b7ab4539   Joe Perches   checkpatch: don't...
6066
6067
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6068
6069
6070
6071
  			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...
6072
  				$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...
6073
  			}
6061d949d   Joe Perches   include/ and chec...
6074
  		}
619a908aa   Joe Perches   checkpatch: add e...
6075
  # Check for __attribute__ weak, or __weak declarations (may have link issues)
5b57980de   Joe Perches   checkpatch: impro...
6076
  		if ($perl_version_ok &&
619a908aa   Joe Perches   checkpatch: add e...
6077
6078
6079
6080
6081
6082
6083
  		    $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...
6084
  # check for c99 types like uint8_t used outside of uapi/ and tools/
e6176fa47   Joe Perches   checkpatch: add -...
6085
  		if ($realfile !~ m@\binclude/uapi/@ &&
fd39f904b   Tomas Winkler   checkpatch: don't...
6086
  		    $realfile !~ m@\btools/@ &&
e6176fa47   Joe Perches   checkpatch: add -...
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
  		    $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 ...
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
  # 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...
6123
6124
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6125
6126
6127
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
6128
  		}
66c80b607   Joe Perches   checkpatch: Add a...
6129
6130
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6131
6132
6133
6134
  			if (WARN("SIZEOF_PARENTHESIS",
  				 "sizeof $1 should be sizeof($1)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6135
  				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
6136
  			}
66c80b607   Joe Perches   checkpatch: Add a...
6137
  		}
88982fea5   Joe Perches   checkpatch: warn ...
6138
6139
6140
6141
6142
6143
  # 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...
6144
  # check for seq_printf uses that could be seq_puts
066687279   Joe Perches   checkpatch: updat...
6145
  		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d727   Joe Perches   checkpatch: Prefe...
6146
  			my $fmt = get_quoted_string($line, $rawline);
caac1d5fd   Heba Aamer   checkpatch: impro...
6147
6148
  			$fmt =~ s/%%//g;
  			if ($fmt !~ /%/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6149
6150
6151
6152
  				if (WARN("PREFER_SEQ_PUTS",
  					 "Prefer seq_puts to seq_printf
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6153
  					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc1   Joe Perches   checkpatch: add a...
6154
  				}
a6962d727   Joe Perches   checkpatch: Prefe...
6155
6156
  			}
  		}
478b17998   Joe Perches   checkpatch: impro...
6157
  # check for vsprintf extension %p<foo> misuses
5b57980de   Joe Perches   checkpatch: impro...
6158
  		if ($perl_version_ok &&
0b523769e   Joe Perches   checkpatch: add a...
6159
6160
6161
  		    defined $stat &&
  		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
  		    $1 !~ /^_*volatile_*$/) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6162
  			my $stat_real;
0b523769e   Joe Perches   checkpatch: add a...
6163
6164
6165
6166
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
  		        for (my $count = $linenr; $count <= $lc; $count++) {
ffe075132   Joe Perches   checkpatch: fix d...
6167
6168
6169
  				my $specifier;
  				my $extension;
  				my $bad_specifier = "";
0b523769e   Joe Perches   checkpatch: add a...
6170
6171
  				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
  				$fmt =~ s/%%//g;
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6172
6173
6174
6175
  
  				while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
  					$specifier = $1;
  					$extension = $2;
4462996ea   Alexandre Belloni   checkpatch: add %...
6176
  					if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxt]/) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
  						$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...
6190
  				}
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6191
6192
6193
6194
6195
6196
6197
6198
6199
  				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...
6200

e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6201
6202
6203
6204
6205
6206
  					WARN("VSPRINTF_POINTER_EXTENSION",
  					     "$ext_type vsprintf pointer extension '$bad_specifier'$use
  " . "$here
  $stat_real
  ");
  				}
0b523769e   Joe Perches   checkpatch: add a...
6207
6208
  			}
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
6209
  # Check for misused memsets
5b57980de   Joe Perches   checkpatch: impro...
6210
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6211
  		    defined $stat &&
9e20a8535   Mateusz Kulikowski   checkpatch: fix p...
6212
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6213
6214
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
6215
6216
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
6217

554e165cf   Andy Whitcroft   checkpatch: check...
6218
6219
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6220
6221
6222
6223
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
6224
6225
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6226
6227
6228
6229
6230
6231
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
98a9bba51   Joe Perches   checkpatch: prefe...
6232
  # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6233
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
  #		    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...
6245

b6117d175   Mateusz Kulikowski   checkpatch: sugge...
6246
  # Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6247
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6248
6249
6250
6251
6252
6253
6254
6255
  #		    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...
6256

8617cd09b   Mateusz Kulikowski   checkpatch: sugge...
6257
6258
  # 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...
6259
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
  #		    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...
6285

d7c76ba7e   Joe Perches   checkpatch: impro...
6286
  # typecasts on min/max could be min_t/max_t
5b57980de   Joe Perches   checkpatch: impro...
6287
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6288
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
6289
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
6290
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6291
6292
6293
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
6294
6295
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
6296
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
6297
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
  					$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...
6309
6310
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
6311
  # check usleep_range arguments
5b57980de   Joe Perches   checkpatch: impro...
6312
  		if ($perl_version_ok &&
4a273195a   Joe Perches   checkpatch: check...
6313
6314
6315
6316
6317
6318
  		    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",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
6319
6320
6321
6322
  				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst
  " . "$here
  $stat
  ");
4a273195a   Joe Perches   checkpatch: check...
6323
6324
6325
  			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
  				 $min > $max) {
  				WARN("USLEEP_RANGE",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
6326
6327
6328
6329
  				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst
  " . "$here
  $stat
  ");
4a273195a   Joe Perches   checkpatch: check...
6330
6331
  			}
  		}
823b794ce   Joe Perches   checkpatch: add c...
6332
  # check for naked sscanf
5b57980de   Joe Perches   checkpatch: impro...
6333
  		if ($perl_version_ok &&
823b794ce   Joe Perches   checkpatch: add c...
6334
  		    defined $stat &&
6c8bd7076   Joe Perches   checkpatch: avoid...
6335
  		    $line =~ /\bsscanf\b/ &&
823b794ce   Joe Perches   checkpatch: add c...
6336
6337
6338
6339
6340
6341
  		    ($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...
6342
  			my $stat_real = get_stat_real($linenr, $lc);
823b794ce   Joe Perches   checkpatch: add c...
6343
6344
6345
6346
6347
6348
  			WARN("NAKED_SSCANF",
  			     "unchecked sscanf return value
  " . "$here
  $stat_real
  ");
  		}
afc819ab0   Joe Perches   checkpatch: prefe...
6349
  # check for simple sscanf that should be kstrto<foo>
5b57980de   Joe Perches   checkpatch: impro...
6350
  		if ($perl_version_ok &&
afc819ab0   Joe Perches   checkpatch: prefe...
6351
6352
6353
6354
6355
  		    defined $stat &&
  		    $line =~ /\bsscanf\b/) {
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6356
  			my $stat_real = get_stat_real($linenr, $lc);
afc819ab0   Joe Perches   checkpatch: prefe...
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
  			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 ...
6370
6371
6372
  # check for new externs in .h files.
  		if ($realfile =~ /\.h$/ &&
  		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780d   Joe Perches   checkpatch: make ...
6373
6374
6375
  			if (CHK("AVOID_EXTERNS",
  				"extern prototypes should be avoided in .h files
  " . $herecurr) &&
70dc8a483   Joe Perches   checkpatch: warn ...
6376
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6377
  				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a483   Joe Perches   checkpatch: warn ...
6378
6379
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6380
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
6381
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
6382
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
6383
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
6384
6385
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
6386
6387
6388
6389
6390
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
6391
6392
6393
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6394
6395
6396
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6397
6398
6399
6400
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6401
6402
6403
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6404
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6405
6406
6407
6408
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6409
6410
6411
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6412
  		}
a0ad75964   Joe Perches   checkpatch: impro...
6413
6414
  # check for function declarations that have arguments without identifier names
  		if (defined $stat &&
25bdda2bd   Miles Chen   checkpatch: suppo...
6415
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
ca0d8929e   Joe Perches   checkpatch: add w...
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
  		    $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...
6427
  # check for function definitions
5b57980de   Joe Perches   checkpatch: impro...
6428
  		if ($perl_version_ok &&
a0ad75964   Joe Perches   checkpatch: impro...
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
  		    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...
6452
6453
6454
6455
6456
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6457
  				CHK("UNDOCUMENTED_SETUP",
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
6458
6459
  				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6460
  			}
653d4876b   Andy Whitcroft   update checkpatch...
6461
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6462

e29a70f15   Joe Perches   checkpatch: add s...
6463
6464
  # check for pointless casting of alloc functions
  		if ($line =~ /\*\s*\)\s*$allocFunctions\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6465
6466
6467
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6468
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6469

a640d25ce   Joe Perches   checkpatch: add -...
6470
6471
  # alloc style
  # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
5b57980de   Joe Perches   checkpatch: impro...
6472
  		if ($perl_version_ok &&
e29a70f15   Joe Perches   checkpatch: add s...
6473
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
a640d25ce   Joe Perches   checkpatch: add -...
6474
6475
6476
6477
  			CHK("ALLOC_SIZEOF_STRUCT",
  			    "Prefer $3(sizeof(*$1)...) over $3($4...)
  " . $herecurr);
  		}
60a55369a   Joe Perches   checkpatch: add w...
6478
  # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
5b57980de   Joe Perches   checkpatch: impro...
6479
  		if ($perl_version_ok &&
1b4a2ed4c   Joe Perches   checkpatch: impro...
6480
6481
  		    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...
6482
6483
6484
6485
6486
  			my $oldfunc = $3;
  			my $a1 = $4;
  			my $a2 = $10;
  			my $newfunc = "kmalloc_array";
  			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a9   Joe Perches   checkpatch: emit ...
6487
6488
6489
6490
6491
6492
6493
6494
  			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...
6495
  				my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6496
  				my $herectx = get_stat_here($linenr, $cnt, $here);
60a55369a   Joe Perches   checkpatch: add w...
6497
  				if (WARN("ALLOC_WITH_MULTIPLY",
1b4a2ed4c   Joe Perches   checkpatch: impro...
6498
6499
6500
  					 "Prefer $newfunc over $oldfunc with multiply
  " . $herectx) &&
  				    $cnt == 1 &&
60a55369a   Joe Perches   checkpatch: add w...
6501
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6502
  					$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...
6503
6504
6505
  				}
  			}
  		}
972fdea2e   Joe Perches   checkpatch: add c...
6506
  # check for krealloc arg reuse
5b57980de   Joe Perches   checkpatch: impro...
6507
  		if ($perl_version_ok &&
4cab63cea   Joe Perches   checkpatch: fix k...
6508
6509
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
  		    $1 eq $3) {
972fdea2e   Joe Perches   checkpatch: add c...
6510
6511
6512
6513
  			WARN("KREALLOC_ARG_REUSE",
  			     "Reusing the krealloc arg is almost always a bug
  " . $herecurr);
  		}
5ce59ae0b   Joe Perches   checkpatch: Add c...
6514
6515
6516
6517
6518
6519
  # 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...
6520
6521
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6522
6523
6524
6525
  			if (WARN("ONE_SEMICOLON",
  				 "Statements terminations use 1 semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6526
  				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6527
  			}
d1e2ad07e   Joe Perches   checkpatch: add -...
6528
  		}
cec3aaa56   Tomas Winkler   checkpatch: don't...
6529
6530
6531
  # 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 -...
6532
6533
6534
6535
6536
6537
6538
6539
6540
  			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...
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
  # 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...
6551
  # check for case / default statements not preceded by break/fallthrough/switch
c34c09a84   Joe Perches   checkpatch: attem...
6552
6553
6554
6555
6556
  		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...
6557
  			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a84   Joe Perches   checkpatch: attem...
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
  				$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...
6568
  				$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...
6569
6570
6571
  			}
  			if (!$has_break && $has_statement) {
  				WARN("MISSING_BREAK",
224236d9c   Andrew Morton   scripts/checkpatc...
6572
6573
  				     "Possible switch case/default not preceded by break or fallthrough comment
  " . $herecurr);
c34c09a84   Joe Perches   checkpatch: attem...
6574
6575
  			}
  		}
d1e2ad07e   Joe Perches   checkpatch: add -...
6576
  # check for switch/default statements without a break;
5b57980de   Joe Perches   checkpatch: impro...
6577
  		if ($perl_version_ok &&
d1e2ad07e   Joe Perches   checkpatch: add -...
6578
6579
  		    defined $stat &&
  		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
d1e2ad07e   Joe Perches   checkpatch: add -...
6580
  			my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6581
  			my $herectx = get_stat_here($linenr, $cnt, $here);
d1e2ad07e   Joe Perches   checkpatch: add -...
6582
6583
6584
  			WARN("DEFAULT_NO_BREAK",
  			     "switch default: should use break
  " . $herectx);
caf2a54f1   Joe Perches   scripts/checkpatc...
6585
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6586
  # check for gcc specific __FUNCTION__
d5e616fc1   Joe Perches   checkpatch: add a...
6587
6588
6589
6590
6591
  		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...
6592
  				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6593
  			}
13214adf7   Andy Whitcroft   update checkpatch...
6594
  		}
773647a09   Andy Whitcroft   update checkpatch...
6595

62ec818f5   Joe Perches   checkpatch: emit ...
6596
6597
6598
6599
6600
6601
  # 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 ...
6602
6603
6604
6605
6606
6607
  # 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...
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
  # 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);
  
  			}
  		}
4882720b2   Thomas Gleixner   semaphore: Remove...
6636
6637
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6638
6639
6640
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6641
  		}
6712d8585   Joe Perches   checkpatch: white...
6642

67d0a0754   Joe Perches   kernel.h/checkpat...
6643
6644
  # 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...
6645
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
6646
6647
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6648
  		}
6712d8585   Joe Perches   checkpatch: white...
6649

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

3d709ab5a   Paul E. McKenney   checkpatch.pl: Su...
6657
6658
6659
6660
6661
6662
  # check for spin_is_locked(), suggest lockdep instead
  		if ($line =~ /\bspin_is_locked\(/) {
  			WARN("USE_LOCKDEP",
  			     "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked
  " . $herecurr);
  		}
9189c7e70   Joe Perches   checkpatch: Creat...
6663
6664
6665
6666
6667
6668
6669
6670
  # check for deprecated apis
  		if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
  			my $deprecated_api = $1;
  			my $new_api = $deprecated_apis{$deprecated_api};
  			WARN("DEPRECATED_API",
  			     "Deprecated use of '$deprecated_api', prefer '$new_api' instead
  " . $herecurr);
  		}
0f3c5aab5   Joe Perches   checkpatch: add o...
6671
  # check for various structs that are normally const (ops, kgdb, device_tree)
d9190e4e1   Joe Perches   checkpatch: avoid...
6672
  # and avoid what seem like struct definitions 'struct foo {'
6903ffb22   Andy Whitcroft   checkpatch: struc...
6673
  		if ($line !~ /\bconst\b/ &&
d9190e4e1   Joe Perches   checkpatch: avoid...
6674
  		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6675
  			WARN("CONST_STRUCT",
d9190e4e1   Joe Perches   checkpatch: avoid...
6676
6677
  			     "struct $1 should normally be const
  " . $herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
6678
  		}
773647a09   Andy Whitcroft   update checkpatch...
6679
6680
6681
6682
  
  # 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...
6683
6684
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
6685
6686
6687
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
6688
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6689
6690
6691
  			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...
6692
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6693

52ea85061   Joe Perches   checkpatch: add t...
6694
6695
6696
6697
6698
6699
  # 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...
6700
  # likely/unlikely comparisons similar to "(likely(foo) > 0)"
5b57980de   Joe Perches   checkpatch: impro...
6701
  		if ($perl_version_ok &&
acd9362c2   Joe Perches   checkpatch: add l...
6702
6703
6704
6705
6706
  		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
  			WARN("LIKELY_MISUSE",
  			     "Using $1 should generally have parentheses around the comparison
  " . $herecurr);
  		}
de3f186f8   Denis Efremov   checkpatch: check...
6707
6708
6709
6710
6711
6712
  # nested likely/unlikely calls
  		if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
  			WARN("LIKELY_MISUSE",
  			     "nested (un)?likely() calls, $1 already uses unlikely() internally
  " . $herecurr);
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
6713
6714
6715
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6716
6717
6718
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
6719
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6720
6721
6722
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
6723
6724
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6725

0f5225b02   Peter Zijlstra   locking/mutex, dr...
6726
6727
6728
6729
6730
6731
  # 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...
6732
6733
6734
6735
6736
6737
  # 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...
6738
6739
6740
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6741
6742
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
6743

b392c64f5   Joe Perches   checkpatch: match...
6744
6745
  		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...
6746
6747
6748
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
6749
  		}
2435880fe   Joe Perches   checkpatch: add c...
6750

001804689   Joe Perches   checkpatch: add a...
6751
6752
6753
  # 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...
6754
  		if ($perl_version_ok &&
001804689   Joe Perches   checkpatch: add a...
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
  		    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...
6812
6813
  # 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...
6814
6815
6816
6817
  # 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...
6818
  		if ($perl_version_ok &&
459cf0ae5   Joe Perches   checkpatch: impro...
6819
  		    defined $stat &&
515a235ef   Joe Perches   checkpatch: impro...
6820
6821
6822
6823
  		    $line =~ /$mode_perms_search/) {
  			foreach my $entry (@mode_permission_funcs) {
  				my $func = $entry->[0];
  				my $arg_pos = $entry->[1];
459cf0ae5   Joe Perches   checkpatch: impro...
6824
6825
6826
  				my $lc = $stat =~ tr@
  @@;
  				$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6827
  				my $stat_real = get_stat_real($linenr, $lc);
459cf0ae5   Joe Perches   checkpatch: impro...
6828

515a235ef   Joe Perches   checkpatch: impro...
6829
6830
6831
6832
6833
  				my $skip_args = "";
  				if ($arg_pos > 1) {
  					$arg_pos--;
  					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
  				}
f90774e1f   Joe Perches   checkpatch: look ...
6834
  				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
459cf0ae5   Joe Perches   checkpatch: impro...
6835
  				if ($stat =~ /$test/) {
515a235ef   Joe Perches   checkpatch: impro...
6836
6837
  					my $val = $1;
  					$val = $6 if ($skip_args ne "");
73121534c   Joe Perches   checkpatch: ignor...
6838
6839
6840
  					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
  					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
  					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
515a235ef   Joe Perches   checkpatch: impro...
6841
  						ERROR("NON_OCTAL_PERMISSIONS",
459cf0ae5   Joe Perches   checkpatch: impro...
6842
6843
6844
  						      "Use 4 digit octal (0777) not decimal permissions
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
6845
6846
  					}
  					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
c0a5c8985   Joe Perches   checkpatch: impro...
6847
  						ERROR("EXPORTED_WORLD_WRITABLE",
459cf0ae5   Joe Perches   checkpatch: impro...
6848
6849
6850
  						      "Exporting writable files is usually an error. Consider more restrictive permissions.
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
6851
  					}
2435880fe   Joe Perches   checkpatch: add c...
6852
6853
6854
  				}
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
6855

459cf0ae5   Joe Perches   checkpatch: impro...
6856
  # check for uses of S_<PERMS> that could be octal for readability
bc22d9a7d   Joe Perches   checkpatch: test ...
6857
  		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
001804689   Joe Perches   checkpatch: add a...
6858
6859
  			my $oval = $1;
  			my $octal = perms_to_octal($oval);
459cf0ae5   Joe Perches   checkpatch: impro...
6860
6861
6862
6863
  			if (WARN("SYMBOLIC_PERMS",
  				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.
  " . $herecurr) &&
  			    $fix) {
001804689   Joe Perches   checkpatch: add a...
6864
  				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
459cf0ae5   Joe Perches   checkpatch: impro...
6865
6866
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
  # 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);
  			}
  		}
6a8d76cbd   Matteo Croce   checkpatch.pl: wa...
6885
6886
6887
6888
6889
6890
6891
  
  # check for sysctl duplicate constants
  		if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
  			WARN("DUPLICATED_SYSCTL_CONST",
  				"duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h
  " . $herecurr);
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6892
6893
6894
6895
6896
6897
  	}
  
  	# 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...
6898
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
  	# 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...
6910
  	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6911
6912
6913
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
6914
  	}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
  	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...
6925
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6926
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
6927
6928
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
6929
6930
6931
6932
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
6933
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
6934

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
6935
  	if ($quiet == 0) {
ef2121963   Joe Perches   checkpatch: adver...
6936
6937
6938
6939
6940
6941
6942
6943
  		# 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...
6944
6945
6946
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
b0781216e   Mike Frysinger   scripts/checkpatc...
6947
  			$rpt_cleaners = 0;
d8469f162   Joe Perches   checkpatch: impro...
6948
6949
6950
6951
6952
  			print << "EOM"
  
  NOTE: Whitespace errors detected.
        You may wish to use scripts/cleanpatch or scripts/cleanfile
  EOM
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
6953
6954
  		}
  	}
d752fcc88   Joe Perches   checkpatch: add a...
6955
6956
6957
  	if ($clean == 0 && $fix &&
  	    ("@rawlines" ne "@fixed" ||
  	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d65   Joe Perches   checkpatch: add a...
6958
6959
  		my $newfile = $filename;
  		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5bc   Joe Perches   checkpatch: creat...
6960
6961
  		my $linecount = 0;
  		my $f;
d752fcc88   Joe Perches   checkpatch: add a...
6962
  		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
3705ce5bc   Joe Perches   checkpatch: creat...
6963
6964
6965
6966
6967
6968
6969
6970
  		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...
6971
6972
  					print $f $fixed_line . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
  				}
  			} else {
  				print $f $fixed_line . "
  ";
  			}
  		}
  		close($f);
  
  		if (!$quiet) {
  			print << "EOM";
d8469f162   Joe Perches   checkpatch: impro...
6983

3705ce5bc   Joe Perches   checkpatch: creat...
6984
6985
6986
6987
6988
6989
6990
  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...
6991
6992
6993
  EOM
  		}
  	}
d8469f162   Joe Perches   checkpatch: impro...
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
  	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...
7004
7005
7006
  	}
  	return $clean;
  }