Blame view

scripts/checkpatch.pl 210 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;
0f7f635b0   Joe Perches   checkpatch: enabl...
46
47
  my $gitroot = $ENV{'GIT_DIR'};
  $gitroot = ".git" if !defined($gitroot);
c2fdda0df   Andy Whitcroft   update checkpatch...
48
  my %debug;
3445686af   Joe Perches   checkpatch: ignor...
49
  my %camelcase = ();
91bfe4843   Joe Perches   checkpatch: add -...
50
51
52
  my %use_type = ();
  my @use = ();
  my %ignore_type = ();
000d1cc18   Joe Perches   checkpatch.pl: ad...
53
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
54
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
55
  my $configuration_file = ".checkpatch.conf";
bdc48fa11   Joe Perches   checkpatch/coding...
56
  my $max_line_length = 100;
d62a201f2   Dave Hansen   checkpatch: enfor...
57
58
  my $ignore_perl_version = 0;
  my $minimum_perl_version = 5.10.0;
56193274e   Vadim Bendebury   checkpatch: allow...
59
  my $min_conf_desc_length = 4;
66b47b4a9   Kees Cook   checkpatch: look ...
60
  my $spelling_file = "$D/spelling.txt";
ebfd7d623   Joe Perches   checkpatch: add o...
61
  my $codespell = 0;
f1a636785   Maxim Uvarov   checkpatch: remov...
62
  my $codespellfile = "/usr/share/codespell/dictionary.txt";
bf1fa1dae   Joe Perches   checkpatch: exter...
63
  my $conststructsfile = "$D/const_structs.checkpatch";
ced69da1d   Quentin Monnet   checkpatch: fix C...
64
  my $typedefsfile;
737c07677   John Brooks   checkpatch: chang...
65
  my $color = "auto";
98005e8c7   Vadim Bendebury   checkpatch: allow...
66
  my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
dbbf869da   Joe Perches   checkpatch: make ...
67
68
  # git output parsing needs US English output, so first set backtick child process LANGUAGE
  my $git_command ='export LANGUAGE=en_US.UTF-8; git';
713a09de9   Antonio Borneo   checkpatch: add c...
69
  my $tabsize = 8;
3e89ad850   Jerome Forissier   checkpatch: add -...
70
  my ${CONFIG_} = "CONFIG_";
77f5b10a8   Hannes Eder   checkpatch: make ...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  
  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 -...
86
    --showfile                 emit diffed file position, not input file position
4a593c344   Du, Changbin   checkpatch: add s...
87
88
89
90
91
92
93
94
95
96
    -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 ...
97
98
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
3beb42ece   Joe Perches   checkpatch: add -...
99
    --list-types               list the possible message types
91bfe4843   Joe Perches   checkpatch: add -...
100
    --types TYPE(,TYPE2...)    show only these comma separated message types
000d1cc18   Joe Perches   checkpatch.pl: ad...
101
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
3beb42ece   Joe Perches   checkpatch: add -...
102
    --show-types               show the specific message type in the output
bdc48fa11   Joe Perches   checkpatch/coding...
103
104
105
    --max-line-length=n        set the maximum line length, (default $max_line_length)
                               if exceeded, warn on patches
                               requires --strict for use with --file
56193274e   Vadim Bendebury   checkpatch: allow...
106
    --min-conf-desc-length=n   set the min description length, if shorter, warn
bdc48fa11   Joe Perches   checkpatch/coding...
107
    --tab-size=n               set the number of spaces for tab (default $tabsize)
77f5b10a8   Hannes Eder   checkpatch: make ...
108
109
110
111
112
113
114
115
116
    --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...
117
118
119
120
121
    --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...
122
123
124
    --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...
125
126
    --ignore-perl-version      override checking of perl version.  expect
                               runtime errors.
ebfd7d623   Joe Perches   checkpatch: add o...
127
    --codespell                Use the codespell dictionary for spelling/typos
f1a636785   Maxim Uvarov   checkpatch: remov...
128
                               (default:/usr/share/codespell/dictionary.txt)
ebfd7d623   Joe Perches   checkpatch: add o...
129
    --codespellfile            Use this codespell dictionary
75ad8c575   Jerome Forissier   checkpatch: add -...
130
    --typedefsfile             Read additional types from this file
737c07677   John Brooks   checkpatch: chang...
131
132
    --color[=WHEN]             Use colors 'always', 'never', or only when output
                               is a terminal ('auto'). Default is 'auto'.
3e89ad850   Jerome Forissier   checkpatch: add -...
133
134
    --kconfig-prefix=WORD      use WORD as a prefix for Kconfig symbols (default
                               ${CONFIG_})
77f5b10a8   Hannes Eder   checkpatch: make ...
135
136
137
138
139
140
141
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
3beb42ece   Joe Perches   checkpatch: add -...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  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...
162
163
  	# 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 -...
164
165
166
167
168
169
170
171
172
173
174
175
176
  		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...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
  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...
204
205
206
207
208
209
210
  # 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...
211
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
212
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
213
214
215
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
216
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
217
  	'terse!'	=> \$terse,
34d8815f9   Joe Perches   checkpatch: add -...
218
  	'showfile!'	=> \$showfile,
77f5b10a8   Hannes Eder   checkpatch: make ...
219
  	'f|file!'	=> \$file,
4a593c344   Du, Changbin   checkpatch: add s...
220
  	'g|git!'	=> \$git,
6c72ffaab   Andy Whitcroft   update checkpatch...
221
222
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
223
  	'ignore=s'	=> \@ignore,
91bfe4843   Joe Perches   checkpatch: add -...
224
  	'types=s'	=> \@use,
000d1cc18   Joe Perches   checkpatch.pl: ad...
225
  	'show-types!'	=> \$show_types,
3beb42ece   Joe Perches   checkpatch: add -...
226
  	'list-types!'	=> \$list_types,
6cd7f3869   Joe Perches   checkpatch: allow...
227
  	'max-line-length=i' => \$max_line_length,
56193274e   Vadim Bendebury   checkpatch: allow...
228
  	'min-conf-desc-length=i' => \$min_conf_desc_length,
713a09de9   Antonio Borneo   checkpatch: add c...
229
  	'tab-size=i'	=> \$tabsize,
6c72ffaab   Andy Whitcroft   update checkpatch...
230
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
231
232
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
233
  	'summary-file!'	=> \$summary_file,
3705ce5bc   Joe Perches   checkpatch: creat...
234
  	'fix!'		=> \$fix,
9624b8d65   Joe Perches   checkpatch: add a...
235
  	'fix-inplace!'	=> \$fix_inplace,
d62a201f2   Dave Hansen   checkpatch: enfor...
236
  	'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0df   Andy Whitcroft   update checkpatch...
237
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
238
  	'test-only=s'	=> \$tst_only,
ebfd7d623   Joe Perches   checkpatch: add o...
239
240
  	'codespell!'	=> \$codespell,
  	'codespellfile=s'	=> \$codespellfile,
75ad8c575   Jerome Forissier   checkpatch: add -...
241
  	'typedefsfile=s'	=> \$typedefsfile,
737c07677   John Brooks   checkpatch: chang...
242
243
244
  	'color=s'	=> \$color,
  	'no-color'	=> \$color,	#keep old behaviors of -nocolor
  	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
3e89ad850   Jerome Forissier   checkpatch: add -...
245
  	'kconfig-prefix=s'	=> \${CONFIG_},
77f5b10a8   Hannes Eder   checkpatch: make ...
246
247
248
249
250
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
251

3beb42ece   Joe Perches   checkpatch: add -...
252
  list_types(0) if ($list_types);
9624b8d65   Joe Perches   checkpatch: add a...
253
  $fix = 1 if ($fix_inplace);
2ac73b4f6   Joe Perches   checkpatch: make ...
254
  $check_orig = $check;
9624b8d65   Joe Perches   checkpatch: add a...
255

32f30ca9f   Joe Perches   checkpatch: disal...
256
257
  die "$P: --git cannot be used with --file or --fix
  " if ($git && ($file || $fix));
0a920b5b6   Andy Whitcroft   add a trivial pat...
258
  my $exit = 0;
5b57980de   Joe Perches   checkpatch: impro...
259
  my $perl_version_ok = 1;
d62a201f2   Dave Hansen   checkpatch: enfor...
260
  if ($^V && $^V lt $minimum_perl_version) {
5b57980de   Joe Perches   checkpatch: impro...
261
  	$perl_version_ok = 0;
d62a201f2   Dave Hansen   checkpatch: enfor...
262
263
  	printf "$P: requires at least perl version %vd
  ", $minimum_perl_version;
5b57980de   Joe Perches   checkpatch: impro...
264
  	exit(1) if (!$ignore_perl_version);
d62a201f2   Dave Hansen   checkpatch: enfor...
265
  }
45107ff6d   Allen Hubbe   checkpatch: if no...
266
  #if no filenames are given, push '-' to read patch from stdin
0a920b5b6   Andy Whitcroft   add a trivial pat...
267
  if ($#ARGV < 0) {
45107ff6d   Allen Hubbe   checkpatch: if no...
268
  	push(@ARGV, '-');
0a920b5b6   Andy Whitcroft   add a trivial pat...
269
  }
737c07677   John Brooks   checkpatch: chang...
270
271
272
273
274
275
276
277
278
  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 {
32f30ca9f   Joe Perches   checkpatch: disal...
279
280
  	die "$P: Invalid color mode: $color
  ";
737c07677   John Brooks   checkpatch: chang...
281
  }
713a09de9   Antonio Borneo   checkpatch: add c...
282
  # skip TAB size 1 to avoid additional checks on $tabsize - 1
32f30ca9f   Joe Perches   checkpatch: disal...
283
284
  die "$P: Invalid TAB size: $tabsize
  " if ($tabsize < 2);
713a09de9   Antonio Borneo   checkpatch: add c...
285

91bfe4843   Joe Perches   checkpatch: add -...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
  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...
303

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

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

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

15662b3e8   Joe Perches   checkpatch: add a...
440
441
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
442
443
444
445
446
447
448
  	|  \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...
449
450
451
452
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
e6176fa47   Joe Perches   checkpatch: add -...
453
  our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
021158b4c   Joe Perches   checkpatch: add t...
454
455
456
457
  our $typeOtherOSTypedefs = qr{(?x:
  	u_(?:char|short|int|long) |          # bsd
  	u(?:nchar|short|int|long)            # sysv
  )};
e6176fa47   Joe Perches   checkpatch: add -...
458
  our $typeKernelTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
459
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
460
461
  	atomic_t
  )};
e6176fa47   Joe Perches   checkpatch: add -...
462
463
464
465
466
  our $typeTypedefs = qr{(?x:
  	$typeC99Typedefs\b|
  	$typeOtherOSTypedefs\b|
  	$typeKernelTypedefs\b
  )};
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
467

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

2435880fe   Joe Perches   checkpatch: add c...
570
571
572
573
574
575
  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...
576
577
578
579
580
  	["(?: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...
581
  );
1a3dcf2e6   Joe Perches   checkpatch: add t...
582
  my $word_pattern = '\b[A-Z]?[a-z]{2,}\b';
515a235ef   Joe Perches   checkpatch: impro...
583
584
585
586
587
588
  #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...
589
  $mode_perms_search = "(?:${mode_perms_search})";
515a235ef   Joe Perches   checkpatch: impro...
590

9189c7e70   Joe Perches   checkpatch: Creat...
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
  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...
611
612
613
614
615
616
617
  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 ...
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
  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...
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
  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 ...
674

7840a94cd   Wolfram Sang   checkpatch: refac...
675
676
  our $allowed_asm_includes = qr{(?x:
  	irq|
cdcee686e   Sergey Ryazanov   checkpatch: updat...
677
678
679
  	memory|
  	time|
  	reboot
7840a94cd   Wolfram Sang   checkpatch: refac...
680
681
  )};
  # memory.h: ARM has a custom one
66b47b4a9   Kees Cook   checkpatch: look ...
682
683
  # Load common spelling mistakes and build regular expression list.
  my $misspellings;
66b47b4a9   Kees Cook   checkpatch: look ...
684
  my %spelling_fix;
66b47b4a9   Kees Cook   checkpatch: look ...
685

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

36061e380   Joe Perches   checkpatch: fix u...
690
691
692
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
66b47b4a9   Kees Cook   checkpatch: look ...
693

36061e380   Joe Perches   checkpatch: fix u...
694
695
696
697
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my ($suspect, $fix) = split(/\|\|/, $line);
66b47b4a9   Kees Cook   checkpatch: look ...
698

36061e380   Joe Perches   checkpatch: fix u...
699
700
701
  		$spelling_fix{$suspect} = $fix;
  	}
  	close($spelling);
36061e380   Joe Perches   checkpatch: fix u...
702
703
704
  } else {
  	warn "No typos will be found - file '$spelling_file': $!
  ";
66b47b4a9   Kees Cook   checkpatch: look ...
705
  }
66b47b4a9   Kees Cook   checkpatch: look ...
706

ebfd7d623   Joe Perches   checkpatch: add o...
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
  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 -...
734
735
  sub read_words {
  	my ($wordsRef, $file) = @_;
bf1fa1dae   Joe Perches   checkpatch: exter...
736

75ad8c575   Jerome Forissier   checkpatch: add -...
737
738
739
  	if (open(my $words, '<', $file)) {
  		while (<$words>) {
  			my $line = $_;
bf1fa1dae   Joe Perches   checkpatch: exter...
740

75ad8c575   Jerome Forissier   checkpatch: add -...
741
742
743
  			$line =~ s/\s*
  ?$//g;
  			$line =~ s/^\s*//g;
bf1fa1dae   Joe Perches   checkpatch: exter...
744

75ad8c575   Jerome Forissier   checkpatch: add -...
745
746
747
748
749
750
751
  			next if ($line =~ m/^\s*#/);
  			next if ($line =~ m/^\s*$/);
  			if ($line =~ /\s/) {
  				print("$file: '$line' invalid - ignored
  ");
  				next;
  			}
ced69da1d   Quentin Monnet   checkpatch: fix C...
752
  			$$wordsRef .= '|' if (defined $$wordsRef);
75ad8c575   Jerome Forissier   checkpatch: add -...
753
754
755
756
  			$$wordsRef .= $line;
  		}
  		close($file);
  		return 1;
bf1fa1dae   Joe Perches   checkpatch: exter...
757
  	}
75ad8c575   Jerome Forissier   checkpatch: add -...
758
759
760
  
  	return 0;
  }
ced69da1d   Quentin Monnet   checkpatch: fix C...
761
762
763
764
765
766
  my $const_structs;
  if (show_type("CONST_STRUCT")) {
  	read_words(\$const_structs, $conststructsfile)
  	    or warn "No structs that should be const will be found - file '$conststructsfile': $!
  ";
  }
75ad8c575   Jerome Forissier   checkpatch: add -...
767

ced69da1d   Quentin Monnet   checkpatch: fix C...
768
769
  if (defined($typedefsfile)) {
  	my $typeOtherTypedefs;
75ad8c575   Jerome Forissier   checkpatch: add -...
770
771
772
  	read_words(\$typeOtherTypedefs, $typedefsfile)
  	    or warn "No additional types will be considered - file '$typedefsfile': $!
  ";
ced69da1d   Quentin Monnet   checkpatch: fix C...
773
  	$typeTypedefs .= '|' . $typeOtherTypedefs if (defined $typeOtherTypedefs);
bf1fa1dae   Joe Perches   checkpatch: exter...
774
  }
8905a67c6   Andy Whitcroft   update checkpatch...
775
  sub build_types {
485ff23ed   Alex Dowad   checkpatch: make ...
776
777
778
779
780
781
782
783
  	my $mods = "(?x:  
  " . join("|
    ", (@modifierList, @modifierListFile)) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", (@typeList, @typeListFile)) . "
  )";
1813087db   Joe Perches   checkpatch: add t...
784
785
786
787
  	my $Misordered = "(?x:  
  " . join("|
    ", @typeListMisordered) . "
  )";
8716de383   Joe Perches   checkpatch: add t...
788
789
790
791
  	my $allWithAttr = "(?x:  
  " . join("|
    ", @typeListWithAttr) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
792
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
ab7e23f34   Joe Perches   checkpatch: add t...
793
  	$BasicType	= qr{
ab7e23f34   Joe Perches   checkpatch: add t...
794
795
796
  				(?:$typeTypedefs\b)|
  				(?:${all}\b)
  		}x;
8905a67c6   Andy Whitcroft   update checkpatch...
797
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
798
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
799
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
800
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
801
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
802
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
803
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
804
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
805
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
806
807
808
809
810
811
812
  	$NonptrTypeMisordered	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:${Misordered}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8716de383   Joe Perches   checkpatch: add t...
813
814
815
816
817
818
819
820
821
  	$NonptrTypeWithAttr	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
  				(?:$typeTypedefs\b)|
  				(?:${allWithAttr}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
822
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
823
  			$NonptrType
7b18496cb   Antonio Borneo   checkpatch: fix m...
824
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
825
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
826
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
827
828
  	$TypeMisordered	= qr{
  			$NonptrTypeMisordered
7b18496cb   Antonio Borneo   checkpatch: fix m...
829
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
1813087db   Joe Perches   checkpatch: add t...
830
831
  			(?:\s+$Inline|\s+$Modifier)*
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
832
  	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087db   Joe Perches   checkpatch: add t...
833
  	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c6   Andy Whitcroft   update checkpatch...
834
835
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
836

7d2367af0   Joe Perches   checkpatch: sugge...
837
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
838
839
840
841
842
843
  
  # 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...
844
  our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
c0a5c8985   Joe Perches   checkpatch: impro...
845
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7d2367af0   Joe Perches   checkpatch: sugge...
846

f84223087   Joe Perches   checkpatch: updat...
847
  our $declaration_macros = qr{(?x:
3e838b6c4   Joe Perches   checkpatch: Allow...
848
  	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
fe658f94b   Steffen Maier   checkpatch: [HLP]...
849
  	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
3d102fc0e   Gilad Ben-Yossef   checkpatch: add C...
850
  	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
f84223087   Joe Perches   checkpatch: updat...
851
  )};
7d2367af0   Joe Perches   checkpatch: sugge...
852
853
854
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
5b9553abf   Joe Perches   checkpatch: make ...
855
856
857
858
859
  
  	while ($string =~ /^\s*\(.*\)\s*$/) {
  		$string =~ s@^\s*\(\s*@@;
  		$string =~ s@\s*\)\s*$@@;
  	}
7d2367af0   Joe Perches   checkpatch: sugge...
860
  	$string =~ s@\s+@ @g;
5b9553abf   Joe Perches   checkpatch: make ...
861

7d2367af0   Joe Perches   checkpatch: sugge...
862
863
  	return $string;
  }
3445686af   Joe Perches   checkpatch: ignor...
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
  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 ...
884
885
886
  		} 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...
887
888
889
890
  			$camelcase{$1} = 1;
  		}
  	}
  }
cd28b1190   Joe Perches   checkpatch: reduc...
891
  our %maintained_status = ();
85b0ee18b   Joe Perches   checkpatch: see i...
892
893
  sub is_maintained_obsolete {
  	my ($filename) = @_;
f2c19c2f3   Jerome Forissier   checkpatch: don't...
894
  	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
85b0ee18b   Joe Perches   checkpatch: see i...
895

cd28b1190   Joe Perches   checkpatch: reduc...
896
897
898
  	if (!exists($maintained_status{$filename})) {
  		$maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
  	}
85b0ee18b   Joe Perches   checkpatch: see i...
899

cd28b1190   Joe Perches   checkpatch: reduc...
900
  	return $maintained_status{$filename} =~ /obsolete/i;
85b0ee18b   Joe Perches   checkpatch: see i...
901
  }
3b6e8ac9e   Joe Perches   checkpatch: valid...
902
903
  sub is_SPDX_License_valid {
  	my ($license) = @_;
0f7f635b0   Joe Perches   checkpatch: enabl...
904
  	return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$gitroot"));
3b6e8ac9e   Joe Perches   checkpatch: valid...
905

562941127   Joe Perches   checkpatch: fix S...
906
907
  	my $root_path = abs_path($root);
  	my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
3b6e8ac9e   Joe Perches   checkpatch: valid...
908
909
910
  	return 0 if ($status ne "");
  	return 1;
  }
3445686af   Joe Perches   checkpatch: ignor...
911
912
913
914
915
  my $camelcase_seeded = 0;
  sub seed_camelcase_includes {
  	return if ($camelcase_seeded);
  
  	my $files;
c707a81de   Joe Perches   checkpatch: make ...
916
917
918
919
  	my $camelcase_cache = "";
  	my @include_files = ();
  
  	$camelcase_seeded = 1;
351b2a1fe   Joe Perches   checkpatch: cache...
920

0f7f635b0   Joe Perches   checkpatch: enabl...
921
  	if (-e "$gitroot") {
dbbf869da   Joe Perches   checkpatch: make ...
922
  		my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
351b2a1fe   Joe Perches   checkpatch: cache...
923
  		chomp $git_last_include_commit;
c707a81de   Joe Perches   checkpatch: make ...
924
  		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686af   Joe Perches   checkpatch: ignor...
925
  	} else {
c707a81de   Joe Perches   checkpatch: make ...
926
  		my $last_mod_date = 0;
3445686af   Joe Perches   checkpatch: ignor...
927
  		$files = `find $root/include -name "*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
  		@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...
949
  	}
c707a81de   Joe Perches   checkpatch: make ...
950

0f7f635b0   Joe Perches   checkpatch: enabl...
951
  	if (-e "$gitroot") {
dbbf869da   Joe Perches   checkpatch: make ...
952
  		$files = `${git_command} ls-files "include/*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
953
954
955
  		@include_files = split('
  ', $files);
  	}
3445686af   Joe Perches   checkpatch: ignor...
956
957
958
  	foreach my $file (@include_files) {
  		seed_camelcase_file($file);
  	}
351b2a1fe   Joe Perches   checkpatch: cache...
959

c707a81de   Joe Perches   checkpatch: make ...
960
  	if ($camelcase_cache ne "") {
351b2a1fe   Joe Perches   checkpatch: cache...
961
  		unlink glob ".checkpatch-camelcase.*";
c707a81de   Joe Perches   checkpatch: make ...
962
963
964
  		open(my $camelcase_file, '>', "$camelcase_cache")
  		    or warn "$P: Can't write '$camelcase_cache' $!
  ";
351b2a1fe   Joe Perches   checkpatch: cache...
965
966
967
968
969
970
  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
  			print $camelcase_file ("$_
  ");
  		}
  		close($camelcase_file);
  	}
3445686af   Joe Perches   checkpatch: ignor...
971
  }
f5f613259   Joe Perches   checkpatch: allow...
972
973
974
975
976
977
978
979
980
981
  sub git_is_single_file {
  	my ($filename) = @_;
  
  	return 0 if ((which("git") eq "") || !(-e "$gitroot"));
  
  	my $output = `${git_command} ls-files -- $filename 2>/dev/null`;
  	my $count = $output =~ tr/
  //;
  	return $count eq 1 && $output =~ m{^${filename}$};
  }
d311cd445   Joe Perches   checkpatch: add t...
982
983
  sub git_commit_info {
  	my ($commit, $id, $desc) = @_;
0f7f635b0   Joe Perches   checkpatch: enabl...
984
  	return ($id, $desc) if ((which("git") eq "") || !(-e "$gitroot"));
d311cd445   Joe Perches   checkpatch: add t...
985

dbbf869da   Joe Perches   checkpatch: make ...
986
  	my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
d311cd445   Joe Perches   checkpatch: add t...
987
988
989
  	$output =~ s/^\s*//gm;
  	my @lines = split("
  ", $output);
0d7835fca   Joe Perches   checkpatch: updat...
990
  	return ($id, $desc) if ($#lines < 0);
5a7f4455a   Sean Christopherson   checkpatch: remov...
991
  	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
d311cd445   Joe Perches   checkpatch: add t...
992
993
994
995
996
997
998
999
1000
1001
  # 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...
1002
  		$id = undef;
d311cd445   Joe Perches   checkpatch: add t...
1003
1004
1005
1006
1007
1008
1009
  	} else {
  		$id = substr($lines[0], 0, 12);
  		$desc = substr($lines[0], 41);
  	}
  
  	return ($id, $desc);
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1010
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
1011
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
1012
  my @lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
1013
  my @fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
1014
1015
  my @fixed_inserted = ();
  my @fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
1016
  my $fixlinenr = -1;
4a593c344   Du, Changbin   checkpatch: add s...
1017
1018
  # 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'.
0f7f635b0   Joe Perches   checkpatch: enabl...
1019
1020
  die "$P: No git repository found
  " if ($git && !-e "$gitroot");
4a593c344   Du, Changbin   checkpatch: add s...
1021
1022
1023
  
  if ($git) {
  	my @commits = ();
0dea9f1ee   Joe Perches   checkpatch: reduc...
1024
  	foreach my $commit_expr (@ARGV) {
4a593c344   Du, Changbin   checkpatch: add s...
1025
  		my $git_range;
28898fd1a   Joe Perches   checkpatch: impro...
1026
1027
  		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
  			$git_range = "-$2 $1";
4a593c344   Du, Changbin   checkpatch: add s...
1028
1029
  		} elsif ($commit_expr =~ m/\.\./) {
  			$git_range = "$commit_expr";
4a593c344   Du, Changbin   checkpatch: add s...
1030
  		} else {
0dea9f1ee   Joe Perches   checkpatch: reduc...
1031
1032
  			$git_range = "-1 $commit_expr";
  		}
dbbf869da   Joe Perches   checkpatch: make ...
1033
  		my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
0dea9f1ee   Joe Perches   checkpatch: reduc...
1034
1035
  		foreach my $line (split(/
  /, $lines)) {
28898fd1a   Joe Perches   checkpatch: impro...
1036
1037
  			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
  			next if (!defined($1) || !defined($2));
0dea9f1ee   Joe Perches   checkpatch: reduc...
1038
1039
1040
1041
  			my $sha1 = $1;
  			my $subject = $2;
  			unshift(@commits, $sha1);
  			$git_commits{$sha1} = $subject;
4a593c344   Du, Changbin   checkpatch: add s...
1042
1043
1044
1045
1046
1047
  		}
  	}
  	die "$P: no git commits after extraction!
  " if (@commits == 0);
  	@ARGV = @commits;
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1048
  my $vname;
98005e8c7   Vadim Bendebury   checkpatch: allow...
1049
  $allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
6c72ffaab   Andy Whitcroft   update checkpatch...
1050
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1051
  	my $FILE;
f5f613259   Joe Perches   checkpatch: allow...
1052
1053
1054
  	my $is_git_file = git_is_single_file($filename);
  	my $oldfile = $file;
  	$file = 1 if ($is_git_file);
4a593c344   Du, Changbin   checkpatch: add s...
1055
1056
1057
1058
1059
  	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...
1060
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
1061
1062
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1063
1064
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
1065
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1066
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
1067
1068
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1069
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1070
1071
  	if ($filename eq '-') {
  		$vname = 'Your patch';
4a593c344   Du, Changbin   checkpatch: add s...
1072
  	} elsif ($git) {
0dea9f1ee   Joe Perches   checkpatch: reduc...
1073
  		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
c2fdda0df   Andy Whitcroft   update checkpatch...
1074
1075
1076
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1077
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1078
1079
  		chomp;
  		push(@rawlines, $_);
c7f574d0e   Geert Uytterhoeven   checkpatch: use p...
1080
  		$vname = qq("$1") if ($filename eq '-' && $_ =~ m/^Subject:\s+(.+)/i);
6c72ffaab   Andy Whitcroft   update checkpatch...
1081
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
1082
  	close($FILE);
d8469f162   Joe Perches   checkpatch: impro...
1083
1084
1085
1086
1087
1088
1089
1090
1091
  
  	if ($#ARGV > 0 && $quiet == 0) {
  		print '-' x length($vname) . "
  ";
  		print "$vname
  ";
  		print '-' x length($vname) . "
  ";
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1092
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1093
1094
1095
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
1096
  	@lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
1097
  	@fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
1098
1099
  	@fixed_inserted = ();
  	@fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
1100
  	$fixlinenr = -1;
485ff23ed   Alex Dowad   checkpatch: make ...
1101
1102
1103
  	@modifierListFile = ();
  	@typeListFile = ();
  	build_types();
f5f613259   Joe Perches   checkpatch: allow...
1104
  	$file = $oldfile if ($is_git_file);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1105
  }
d8469f162   Joe Perches   checkpatch: impro...
1106
  if (!$quiet) {
3c816e490   Joe Perches   checkpatch: emit ...
1107
1108
  	hash_show_words(\%use_type, "Used");
  	hash_show_words(\%ignore_type, "Ignored");
5b57980de   Joe Perches   checkpatch: impro...
1109
  	if (!$perl_version_ok) {
d8469f162   Joe Perches   checkpatch: impro...
1110
1111
1112
  		print << "EOM"
  
  NOTE: perl $^V is not modern enough to detect all possible issues.
5b57980de   Joe Perches   checkpatch: impro...
1113
        An upgrade to at least perl $minimum_perl_version is suggested.
d8469f162   Joe Perches   checkpatch: impro...
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
  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...
1124
1125
1126
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
  	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...
1139
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1140
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
1141
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1142

201124755   Joe Perches   checkpatch: valid...
1143
1144
1145
1146
  sub parse_email {
  	my ($formatted_email) = @_;
  
  	my $name = "";
dfa05c28c   Joe Perches   checkpatch: remov...
1147
  	my $name_comment = "";
201124755   Joe Perches   checkpatch: valid...
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
  	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...
1161
  		$formatted_email =~ s/\Q$address\E.*$//;
201124755   Joe Perches   checkpatch: valid...
1162
  		$name = $formatted_email;
3705ce5bc   Joe Perches   checkpatch: creat...
1163
  		$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
  		$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 = "";
  		}
  	}
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1177
  	$comment = trim($comment);
3705ce5bc   Joe Perches   checkpatch: creat...
1178
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1179
  	$name =~ s/^\"|\"$//g;
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1180
  	if ($name =~ s/(\s*\([^\)]+\))\s*//) {
dfa05c28c   Joe Perches   checkpatch: remov...
1181
1182
  		$name_comment = trim($1);
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1183
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1184
1185
1186
1187
1188
1189
  	$address =~ s/^\<|\>$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
dfa05c28c   Joe Perches   checkpatch: remov...
1190
  	return ($name, $name_comment, $address, $comment);
201124755   Joe Perches   checkpatch: valid...
1191
1192
1193
  }
  
  sub format_email {
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1194
  	my ($name, $name_comment, $address, $comment) = @_;
201124755   Joe Perches   checkpatch: valid...
1195
1196
  
  	my $formatted_email;
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1197
1198
  	$name_comment = trim($name_comment);
  	$comment = trim($comment);
3705ce5bc   Joe Perches   checkpatch: creat...
1199
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
1200
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
1201
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
1202
1203
1204
1205
1206
1207
1208
1209
1210
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	if ("$name" eq "") {
  		$formatted_email = "$address";
  	} else {
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1211
  		$formatted_email = "$name$name_comment <$address>";
201124755   Joe Perches   checkpatch: valid...
1212
  	}
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1213
  	$formatted_email .= "$comment";
201124755   Joe Perches   checkpatch: valid...
1214
1215
  	return $formatted_email;
  }
dfa05c28c   Joe Perches   checkpatch: remov...
1216
1217
1218
1219
  sub reformat_email {
  	my ($email) = @_;
  
  	my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1220
  	return format_email($email_name, $name_comment, $email_address, $comment);
dfa05c28c   Joe Perches   checkpatch: remov...
1221
1222
1223
  }
  
  sub same_email_addresses {
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1224
  	my ($email1, $email2, $match_comment) = @_;
dfa05c28c   Joe Perches   checkpatch: remov...
1225
1226
1227
  
  	my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1);
  	my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2);
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1228
1229
1230
1231
  	if ($match_comment != 1) {
  		return $email1_name eq $email2_name &&
  		       $email1_address eq $email2_address;
  	}
dfa05c28c   Joe Perches   checkpatch: remov...
1232
  	return $email1_name eq $email2_name &&
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
1233
1234
1235
  	       $email1_address eq $email2_address &&
  	       $name1_comment eq $name2_comment &&
  	       $comment1 eq $comment2;
dfa05c28c   Joe Perches   checkpatch: remov...
1236
  }
d311cd445   Joe Perches   checkpatch: add t...
1237
  sub which {
bd474ca07   Joe Perches   checkpatch: use t...
1238
  	my ($bin) = @_;
d311cd445   Joe Perches   checkpatch: add t...
1239

bd474ca07   Joe Perches   checkpatch: use t...
1240
1241
1242
1243
  	foreach my $path (split(/:/, $ENV{PATH})) {
  		if (-e "$path/$bin") {
  			return "$path/$bin";
  		}
d311cd445   Joe Perches   checkpatch: add t...
1244
  	}
d311cd445   Joe Perches   checkpatch: add t...
1245

bd474ca07   Joe Perches   checkpatch: use t...
1246
  	return "";
d311cd445   Joe Perches   checkpatch: add t...
1247
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
  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...
1259
1260
1261
1262
1263
1264
1265
1266
1267
  sub expand_tabs {
  	my ($str) = @_;
  
  	my $res = '';
  	my $n = 0;
  	for my $c (split(//, $str)) {
  		if ($c eq "\t") {
  			$res .= ' ';
  			$n++;
713a09de9   Antonio Borneo   checkpatch: add c...
1268
  			for (; ($n % $tabsize) != 0; $n++) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
  				$res .= ' ';
  			}
  			next;
  		}
  		$res .= $c;
  		$n++;
  	}
  
  	return $res;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1279
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
1280
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
1281
1282
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1283

4a0df2ef4   Andy Whitcroft   update checkpatch...
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
  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...
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
1307
1308
1309
1310
1311
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
1312
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
1313
1314
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
1315

773647a09   Andy Whitcroft   update checkpatch...
1316
1317
1318
1319
1320
  	# 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...
1321
  		# Comments we are whacking completely including the begin
773647a09   Andy Whitcroft   update checkpatch...
1322
1323
1324
1325
1326
1327
1328
  		# 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...
1329
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
1330
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
1331
1332
1333
1334
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
1335
  		}
113f04a83   Daniel Walker   checkpatch: handl...
1336
1337
1338
1339
1340
1341
1342
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
1343
1344
1345
1346
1347
1348
1349
  
  		# 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...
1350
  		}
773647a09   Andy Whitcroft   update checkpatch...
1351
1352
1353
1354
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
1355

773647a09   Andy Whitcroft   update checkpatch...
1356
1357
1358
1359
1360
1361
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
1362

fae17daed   Andy Whitcroft   checkpatch: comme...
1363
1364
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1365
1366
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
1367
1368
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
1369
1370
1371
1372
1373
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
1374
  	}
113f04a83   Daniel Walker   checkpatch: handl...
1375
1376
1377
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
1378
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
1379
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1380
1381
1382
1383
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
1384
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1385
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
1386
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
1387
  	}
dadf680de   Joe Perches   checkpatch: allow...
1388
1389
1390
1391
  	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
  		my $match = $1;
  		$res =~ s/\Q$match\E/"$;" x length($match)/e;
  	}
00df344fd   Andy Whitcroft   update checkpatch...
1392
1393
  	return $res;
  }
a6962d727   Joe Perches   checkpatch: Prefe...
1394
1395
  sub get_quoted_string {
  	my ($line, $rawline) = @_;
478b17998   Joe Perches   checkpatch: impro...
1396
  	return "" if (!defined($line) || !defined($rawline));
33acb54a4   Joe Perches   checkpatch: use $...
1397
  	return "" if ($line !~ m/($String)/g);
a6962d727   Joe Perches   checkpatch: Prefe...
1398
1399
  	return substr($rawline, $-[0], $+[0] - $-[0]);
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1400
1401
1402
1403
1404
1405
  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...
1406
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1407

13214adf7   Andy Whitcroft   update checkpatch...
1408
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1409
1410
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
1411
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
1412
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
1413
1414
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1415
1416
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
1417
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
1418
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
1419
1420
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1421
1422
1423
1424
  		# 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...
1425
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
1426
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
1427
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
1428
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
1429
1430
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1431
1432
1433
1434
1435
1436
1437
  				$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...
1438
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
1439
1440
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1441
1442
1443
1444
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1445
  		}
cf655043d   Andy Whitcroft   update checkpatch...
1446
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
1447
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
1448
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
1449

773647a09   Andy Whitcroft   update checkpatch...
1450
1451
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
1452
1453
1454
1455
1456
1457
1458
1459
1460
  
  		# 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...
1461
1462
1463
1464
1465
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
1466
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
  		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...
1477
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
  		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...
1488
1489
1490
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
  			}
  		}
  		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...
1502
1503
1504
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
1505
1506
1507
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1508
1509
1510
1511
1512
1513
1514
1515
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1516
1517
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1518
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
1519
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1520
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
1521
1522
1523
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1524
1525
1526
1527
1528
1529
1530
1531
  
  	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...
1532
1533
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
1534
1535
1536
1537
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
  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...
1585
1586
1587
1588
1589
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
1590
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
1591
1592
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
1593
1594
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
1595
1596
1597
1598
1599
1600
1601
1602
  	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...
1603
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
1604
1605
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
1606
1607
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1608
1609
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
1610
1611
1612
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
1613
1614
1615
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
1616
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1617
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
1618
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1619
1620
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1621
1622
1623
1624
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
1625
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
1626
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
1627
1628
1629
1630
1631
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
1632
1633
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
1634
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1635
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
1636
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1637
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
1638
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1639
1640
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
1641
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1642
1643
1644
1645
1646
1647
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1648

f0a594c1c   Andy Whitcroft   update checkpatch...
1649
1650
1651
1652
1653
1654
1655
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1656

f0a594c1c   Andy Whitcroft   update checkpatch...
1657
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
1658
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1659
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1660
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1661
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1662
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1663
1664
1665
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1666
1667
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1668
1669
1670
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1671
1672
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
1673
1674
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
1675
1676
1677
1678
1679
1680
  	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...
1681
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1682
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1683
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1684
1685
1686
1687
1688
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1689
1690
1691
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
a55ee0cc0   Joe Perches   checkpatch: look ...
1692
1693
1694
1695
1696
1697
1698
  	# If c99 comment on the current line, or the line before or after
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@^\+.*(//.*$)@);
  	return $current_comment if (defined $current_comment);
  	($current_comment) = ($rawlines[$end_line - 2] =~ m@^[\+ ].*(//.*$)@);
  	return $current_comment if (defined $current_comment);
  	($current_comment) = ($rawlines[$end_line] =~ m@^[\+ ].*(//.*$)@);
  	return $current_comment if (defined $current_comment);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1699
  	# Catch a comment on the end of the line itself.
a55ee0cc0   Joe Perches   checkpatch: look ...
1700
  	($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1701
1702
1703
1704
1705
1706
1707
  	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...
1708
1709
1710
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
  		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...
1733
1734
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1735
1736
1737
1738
1739
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
  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...
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
  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...
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
  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...
1778
1779
1780
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1781

6c72ffaab   Andy Whitcroft   update checkpatch...
1782
1783
1784
1785
1786
1787
  	$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...
1788
1789
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1790
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1791

6c72ffaab   Andy Whitcroft   update checkpatch...
1792
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1793
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1794
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1795
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
1796
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1797
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
1798
1799
1800
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1801
1802
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1803
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1804
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1805
1806
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1807

6c72ffaab   Andy Whitcroft   update checkpatch...
1808
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1809
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1810
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1811
1812
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1813

6c72ffaab   Andy Whitcroft   update checkpatch...
1814
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1815
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1816
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1817
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1818
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1819
1820
1821
1822
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1823
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1824
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1825
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1826
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1827
1828
1829
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1830
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1831

e91b6e263   Andy Whitcroft   checkpatch: types...
1832
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1833
1834
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1835
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1836
1837
1838
1839
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1840
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1841
1842
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1843
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1844
1845
1846
1847
1848
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1849
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1850
1851
1852
1853
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1854

c45dcabd2   Andy Whitcroft   update checkpatch...
1855
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1856
1857
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1858
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1859
1860
1861
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1862
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1863

c45dcabd2   Andy Whitcroft   update checkpatch...
1864
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1865
1866
1867
1868
1869
  			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...
1870
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1871

c45dcabd2   Andy Whitcroft   update checkpatch...
1872
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1873
1874
1875
1876
1877
1878
1879
1880
1881
  			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...
1882
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1883
1884
1885
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1886
1887
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1888

171ae1a49   Andy Whitcroft   update checkpatch...
1889
1890
1891
1892
1893
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1894
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1895
1896
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1897
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1898
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1899
1900
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1901
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1902
1903
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1904
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1905
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1906
1907
1908
1909
1910
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1911
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1912
1913
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1914
1915
1916
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1917
1918
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1919
1920
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1921
1922
1923
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1924
1925
1926
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1927
1928
1929
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1930
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1931
1932
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1933
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1934
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1935
1936
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1937
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1938
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1939

8e761b04a   Andy Whitcroft   checkpatch: detec...
1940
1941
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1942
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1943
1944
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1945
1946
1947
1948
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1949
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1950
1951
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1952
1953
1954
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1955
1956
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1957
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1958
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1959
1960
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1961
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1962
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1963
1964
1965
1966
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
  		} 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...
1983

8e761b04a   Andy Whitcroft   checkpatch: detec...
1984
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1985
1986
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1987
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1988
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
  			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...
2001
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2002
2003
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
2004
2005
2006
2007
2008
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2009
2010
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
2011
2012
2013
2014
2015
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2016
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2017

1f65f947a   Andy Whitcroft   checkpatch: add c...
2018
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2019
  }
8905a67c6   Andy Whitcroft   update checkpatch...
2020
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
2021
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2022
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
2023
2024
2025
2026
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2027
2028
2029
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
2030
2031
2032
2033
2034
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
2035
2036
2037
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2038
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
2039
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2040
2041
2042
2043
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2044
2045
2046
2047
2048
2049
2050
  		# 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...
2051
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2052
2053
2054
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
2055
  					push(@modifierListFile, $modifier);
9a974fdbe   Andy Whitcroft   checkpatch: possi...
2056
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
2057
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2058
2059
2060
2061
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
485ff23ed   Alex Dowad   checkpatch: make ...
2062
  			push(@typeListFile, $possible);
c45dcabd2   Andy Whitcroft   update checkpatch...
2063
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2064
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
2065
2066
2067
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
2068
2069
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
2070
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
2071
  sub show_type {
cbec18afc   Joe Perches   checkpatch: use a...
2072
  	my ($type) = @_;
91bfe4843   Joe Perches   checkpatch: add -...
2073

522b837c6   Alexey Dobriyan   checkpatch: warn ...
2074
  	$type =~ tr/[a-z]/[A-Z]/;
cbec18afc   Joe Perches   checkpatch: use a...
2075
2076
2077
  	return defined $use_type{$type} if (scalar keys %use_type > 0);
  
  	return !defined $ignore_type{$type};
000d1cc18   Joe Perches   checkpatch.pl: ad...
2078
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
2079
  sub report {
cbec18afc   Joe Perches   checkpatch: use a...
2080
2081
2082
2083
  	my ($level, $type, $msg) = @_;
  
  	if (!show_type($type) ||
  	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
2084
2085
  		return 0;
  	}
572302971   Joe Perches   checkpatch: color...
2086
  	my $output = '';
737c07677   John Brooks   checkpatch: chang...
2087
  	if ($color) {
572302971   Joe Perches   checkpatch: color...
2088
2089
2090
2091
2092
2093
2094
2095
2096
  		if ($level eq 'ERROR') {
  			$output .= RED;
  		} elsif ($level eq 'WARNING') {
  			$output .= YELLOW;
  		} else {
  			$output .= GREEN;
  		}
  	}
  	$output .= $prefix . $level . ':';
000d1cc18   Joe Perches   checkpatch.pl: ad...
2097
  	if ($show_types) {
737c07677   John Brooks   checkpatch: chang...
2098
  		$output .= BLUE if ($color);
572302971   Joe Perches   checkpatch: color...
2099
  		$output .= "$type:";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2100
  	}
737c07677   John Brooks   checkpatch: chang...
2101
  	$output .= RESET if ($color);
572302971   Joe Perches   checkpatch: color...
2102
2103
  	$output .= ' ' . $msg . "
  ";
34d8815f9   Joe Perches   checkpatch: add -...
2104
2105
2106
2107
2108
2109
2110
2111
  
  	if ($showfile) {
  		my @lines = split("
  ", $output, -1);
  		splice(@lines, 1, 1);
  		$output = join("
  ", @lines);
  	}
572302971   Joe Perches   checkpatch: color...
2112
2113
2114
  	$output = (split('
  ', $output))[0] . "
  " if ($terse);
8905a67c6   Andy Whitcroft   update checkpatch...
2115

572302971   Joe Perches   checkpatch: color...
2116
  	push(our @report, $output);
773647a09   Andy Whitcroft   update checkpatch...
2117
2118
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
2119
  }
cbec18afc   Joe Perches   checkpatch: use a...
2120

f0a594c1c   Andy Whitcroft   update checkpatch...
2121
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
2122
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
2123
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
2124

d752fcc88   Joe Perches   checkpatch: add a...
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
  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 -...
2157
  		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
d752fcc88   Joe Perches   checkpatch: add a...
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
  			$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...
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
  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...
2207
  sub ERROR {
cbec18afc   Joe Perches   checkpatch: use a...
2208
2209
2210
  	my ($type, $msg) = @_;
  
  	if (report("ERROR", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2211
2212
  		our $clean = 0;
  		our $cnt_error++;
3705ce5bc   Joe Perches   checkpatch: creat...
2213
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2214
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2215
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2216
2217
  }
  sub WARN {
cbec18afc   Joe Perches   checkpatch: use a...
2218
2219
2220
  	my ($type, $msg) = @_;
  
  	if (report("WARNING", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
2221
2222
  		our $clean = 0;
  		our $cnt_warn++;
3705ce5bc   Joe Perches   checkpatch: creat...
2223
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
2224
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2225
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2226
2227
  }
  sub CHK {
cbec18afc   Joe Perches   checkpatch: use a...
2228
2229
2230
  	my ($type, $msg) = @_;
  
  	if ($check && report("CHECK", $type, $msg)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
2231
2232
  		our $clean = 0;
  		our $cnt_chk++;
3705ce5bc   Joe Perches   checkpatch: creat...
2233
  		return 1;
6c72ffaab   Andy Whitcroft   update checkpatch...
2234
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
2235
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2236
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
  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...
2263
2264
2265
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
2266
2267
  	}
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2268
2269
  sub trim {
  	my ($string) = @_;
b34c648bb   Joe Perches   checkpatch: bette...
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
  	$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...
2287
2288
2289
  
  	return $string;
  }
52ea85061   Joe Perches   checkpatch: add t...
2290
2291
2292
2293
2294
2295
2296
  sub string_find_replace {
  	my ($string, $find, $replace) = @_;
  
  	$string =~ s/$find/$replace/g;
  
  	return $string;
  }
3705ce5bc   Joe Perches   checkpatch: creat...
2297
2298
  sub tabify {
  	my ($leading) = @_;
713a09de9   Antonio Borneo   checkpatch: add c...
2299
  	my $source_indent = $tabsize;
3705ce5bc   Joe Perches   checkpatch: creat...
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
  	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...
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
  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...
2336
  	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c099   Joe Perches   checkpatch: add s...
2337
  }
f36d3eb89   Joe Perches   checkpatch: prefe...
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
  sub get_raw_comment {
  	my ($line, $rawline) = @_;
  	my $comment = '';
  
  	for my $i (0 .. (length($line) - 1)) {
  		if (substr($line, $i, 1) eq "$;") {
  			$comment .= substr($rawline, $i, 1);
  		}
  	}
  
  	return $comment;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
2350
2351
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2352
2353
2354
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2355
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2356
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
2357
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2358

4a0df2ef4   Andy Whitcroft   update checkpatch...
2359
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2360
2361
2362
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2363
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2364
  	my $signoff = 0;
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2365
2366
  	my $author = '';
  	my $authorsignoff = 0;
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
2367
  	my $author_sob = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2368
  	my $is_patch = 0;
133712a2e   Rob Herring   checkpatch: DT bi...
2369
  	my $is_binding_patch = -1;
29ee1b0c6   Joe Perches   checkpatch: ignor...
2370
  	my $in_header_lines = $file ? 0 : 1;
15662b3e8   Joe Perches   checkpatch: add a...
2371
  	my $in_commit_log = 0;		#Scanning lines before patch
44d303eb0   Joe Perches   checkpatch: impro...
2372
  	my $has_patch_separator = 0;	#Found a --- line
ed43c4e58   Allen Hubbe   checkpatch: check...
2373
  	my $has_commit_log = 0;		#Encountered lines before patch
490b292c8   Joe Perches   checkpatch: warn ...
2374
  	my $commit_log_lines = 0;	#Number of commit log lines
77cb8546b   Joe Perches   checkpatch: warn ...
2375
  	my $commit_log_possible_stack_dump = 0;
2a076f40d   Joe Perches   checkpatch, Submi...
2376
  	my $commit_log_long_line = 0;
e518e9a59   Joe Perches   checkpatch: emit ...
2377
  	my $commit_log_has_diff = 0;
13f1937ef   Joe Perches   checkpatch: emit ...
2378
  	my $reported_maintainer_file = 0;
fa64205df   Pasi Savanainen   checkpatch: check...
2379
  	my $non_utf8_charset = 0;
365dd4eaa   Joe Perches   checkpatch: add a...
2380
  	my $last_blank_line = 0;
5e4f6ba5e   Joe Perches   checkpatch: add a...
2381
  	my $last_coalesced_string_linenr = -1;
365dd4eaa   Joe Perches   checkpatch: add a...
2382

13214adf7   Andy Whitcroft   update checkpatch...
2383
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
2384
2385
2386
2387
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2388
2389
2390
2391
2392
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
77cb8546b   Joe Perches   checkpatch: warn ...
2393
  	my $context_function;		#undef'd unless there's a known function
0a920b5b6   Andy Whitcroft   add a trivial pat...
2394
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
2395
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2396
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2397
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
2398

13214adf7   Andy Whitcroft   update checkpatch...
2399
2400
2401
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
2402
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
2403
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2404
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2405
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
2406

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

c2fdda0df   Andy Whitcroft   update checkpatch...
2409
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
2410
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
2411
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
2412
2413
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
2414

d8b077101   Joe Perches   checkpatch: exten...
2415
  	my $camelcase_file_seeded = 0;
9f3a89926   Rob Herring   checkpatch.pl: ad...
2416
  	my $checklicenseline = 1;
773647a09   Andy Whitcroft   update checkpatch...
2417
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
2418
2419
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
2420
2421
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
2422

3705ce5bc   Joe Perches   checkpatch: creat...
2423
  		push(@fixed, $rawline) if ($fix);
773647a09   Andy Whitcroft   update checkpatch...
2424
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2425
  			$setup_docs = 0;
2581ac7c2   Tim Froidcoeur   checkpatch: corre...
2426
  			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
2427
2428
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
2429
2430
  			#next;
  		}
74fd4f347   Joe Perches   checkpatch: impro...
2431
  		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
773647a09   Andy Whitcroft   update checkpatch...
2432
2433
2434
2435
2436
2437
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
2438
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
2439
2440
2441
2442
2443
2444
  
  			# 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...
2445
2446
2447
2448
2449
2450
2451
  			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...
2452
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
2453
2454
2455
2456
2457
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
2458
2459
2460
2461
2462
2463
2464
2465
2466
  			}
  			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...
2467
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
2468
2469
2470
2471
2472
2473
2474
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
2475
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
2476
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
2477
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
2478
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2479
  		}
773647a09   Andy Whitcroft   update checkpatch...
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2492
2493
2494
2495
2496
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
2497
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
2498
2499
  	$realcnt = 0;
  	$linenr = 0;
194f66fc9   Joe Perches   checkpatch: add a...
2500
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2501
2502
  	foreach my $line (@lines) {
  		$linenr++;
194f66fc9   Joe Perches   checkpatch: add a...
2503
  		$fixlinenr++;
1b5539b1f   Joe Perches   checkpatch: reduc...
2504
2505
  		my $sline = $line;	#copy of $line
  		$sline =~ s/$;/ /g;	#with comments as spaces
0a920b5b6   Andy Whitcroft   add a trivial pat...
2506

c2fdda0df   Andy Whitcroft   update checkpatch...
2507
  		my $rawline = $rawlines[$linenr - 1];
f36d3eb89   Joe Perches   checkpatch: prefe...
2508
  		my $raw_comment = get_raw_comment($line, $rawline);
6c72ffaab   Andy Whitcroft   update checkpatch...
2509

12c253abb   Joe Perches   checkpatch: impro...
2510
2511
2512
2513
2514
2515
2516
  # 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...
2517
  #extract the line range in the file after the patch is applied
e518e9a59   Joe Perches   checkpatch: emit ...
2518
  		if (!$in_commit_log &&
74fd4f347   Joe Perches   checkpatch: impro...
2519
2520
  		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
  			my $context = $4;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2521
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
2522
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2523
2524
2525
2526
2527
2528
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2529
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
2530
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
2531
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
2532
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2533
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2534
  			$suppress_statement = 0;
74fd4f347   Joe Perches   checkpatch: impro...
2535
2536
2537
2538
2539
  			if ($context =~ /\b(\w+)\s*\(/) {
  				$context_function = $1;
  			} else {
  				undef $context_function;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2540
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2541

4a0df2ef4   Andy Whitcroft   update checkpatch...
2542
2543
2544
  # 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...
2545
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2546
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
2547
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2548

4a0df2ef4   Andy Whitcroft   update checkpatch...
2549
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
2550
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2551
2552
2553
2554
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
2555
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
2556
2557
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
2558

d8aaf1214   Andy Whitcroft   update checkpatch...
2559
2560
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2561
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
2562
  		my $hunk_line = ($realcnt != 0);
6c72ffaab   Andy Whitcroft   update checkpatch...
2563
2564
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
2565

2ac73b4f6   Joe Perches   checkpatch: make ...
2566
  		my $found_file = 0;
773647a09   Andy Whitcroft   update checkpatch...
2567
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
2568
2569
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2570
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2571
  			$in_commit_log = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
2572
  			$found_file = 1;
3bf9a009f   Rabin Vincent   checkpatch: check...
2573
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
2574
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2575
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2576
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2577
2578
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
2579
2580
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2581
2582
2583
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
2584
  			}
773647a09   Andy Whitcroft   update checkpatch...
2585

c1ab33269   Andy Whitcroft   checkpatch: inclu...
2586
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2587
2588
2589
2590
  				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...
2591
  			}
2ac73b4f6   Joe Perches   checkpatch: make ...
2592
2593
  			$found_file = 1;
  		}
34d8815f9   Joe Perches   checkpatch: add -...
2594
2595
2596
2597
  #make up the handle for any error we report on this line
  		if ($showfile) {
  			$prefix = "$realfile:$realline: "
  		} elsif ($emacs) {
7d3a9f673   Joe Perches   checkpatch: repor...
2598
2599
2600
2601
2602
  			if ($file) {
  				$prefix = "$filename:$realline: ";
  			} else {
  				$prefix = "$filename:$linenr: ";
  			}
34d8815f9   Joe Perches   checkpatch: add -...
2603
  		}
2ac73b4f6   Joe Perches   checkpatch: make ...
2604
  		if ($found_file) {
85b0ee18b   Joe Perches   checkpatch: see i...
2605
2606
2607
2608
2609
  			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 ...
2610
  			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2ac73b4f6   Joe Perches   checkpatch: make ...
2611
2612
2613
2614
  				$check = 1;
  			} else {
  				$check = $check_orig;
  			}
9f3a89926   Rob Herring   checkpatch.pl: ad...
2615
  			$checklicenseline = 1;
133712a2e   Rob Herring   checkpatch: DT bi...
2616
2617
2618
2619
2620
2621
2622
2623
2624
  
  			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",
858e68456   Mauro Carvalho Chehab   docs: dt: convert...
2625
2626
  					     "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst
  ");
133712a2e   Rob Herring   checkpatch: DT bi...
2627
2628
  				}
  			}
773647a09   Andy Whitcroft   update checkpatch...
2629
2630
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
2631
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2632

c2fdda0df   Andy Whitcroft   update checkpatch...
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2643

6c72ffaab   Andy Whitcroft   update checkpatch...
2644
  		$cnt_lines++ if ($realcnt != 0);
490b292c8   Joe Perches   checkpatch: warn ...
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
  # 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 ...
2657
2658
  # Check if the commit log has what seems like a diff which can confuse patch
  		if ($in_commit_log && !$commit_log_has_diff &&
13e45417c   Mrinal Pandey   checkpatch: fix t...
2659
2660
  		    (($line =~ m@^\s+diff\b.*a/([\w/]+)@ &&
  		      $line =~ m@^\s+diff\b.*a/[\w/]+\s+b/$1\b@) ||
e518e9a59   Joe Perches   checkpatch: emit ...
2661
2662
2663
2664
2665
2666
2667
  		     $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...
2668
2669
2670
2671
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
04db4d25d   Joe Perches   checkpatch: compl...
2672
2673
  			if ($realfile !~ m@scripts/@ &&
  			    $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2674
2675
2676
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
2677
2678
  			}
  		}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2679
2680
2681
  # Check the patch for a From:
  		if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
  			$author = $1;
e7f929f3c   Dwaipayan Ray   checkpatch: exten...
2682
2683
2684
2685
  			my $curline = $linenr;
  			while(defined($rawlines[$curline]) && ($rawlines[$curline++] =~ /^[ \t]\s*(.*)/)) {
  				$author .= $1;
  			}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2686
2687
  			$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
  			$author =~ s/"//g;
dfa05c28c   Joe Perches   checkpatch: remov...
2688
  			$author = reformat_email($author);
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2689
  		}
201124755   Joe Perches   checkpatch: valid...
2690
  # Check the patch for a signoff:
dfa05c28c   Joe Perches   checkpatch: remov...
2691
  		if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2692
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
2693
  			$in_commit_log = 0;
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
2694
2695
  			if ($author ne ''  && $authorsignoff != 1) {
  				if (same_email_addresses($1, $author, 1)) {
dfa05c28c   Joe Perches   checkpatch: remov...
2696
  					$authorsignoff = 1;
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
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
2722
2723
2724
  				} else {
  					my $ctx = $1;
  					my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx);
  					my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author);
  
  					if ($email_address eq $author_address && $email_name eq $author_name) {
  						$author_sob = $ctx;
  						$authorsignoff = 2;
  					} elsif ($email_address eq $author_address) {
  						$author_sob = $ctx;
  						$authorsignoff = 3;
  					} elsif ($email_name eq $author_name) {
  						$author_sob = $ctx;
  						$authorsignoff = 4;
  
  						my $address1 = $email_address;
  						my $address2 = $author_address;
  
  						if ($address1 =~ /(\S+)\+\S+(\@.*)/) {
  							$address1 = "$1$2";
  						}
  						if ($address2 =~ /(\S+)\+\S+(\@.*)/) {
  							$address2 = "$1$2";
  						}
  						if ($address1 eq $address2) {
  							$authorsignoff = 5;
  						}
  					}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
2725
2726
  				}
  			}
201124755   Joe Perches   checkpatch: valid...
2727
  		}
44d303eb0   Joe Perches   checkpatch: impro...
2728
2729
2730
2731
2732
  # Check for patch separator
  		if ($line =~ /^---$/) {
  			$has_patch_separator = 1;
  			$in_commit_log = 0;
  		}
e0d975b1b   Joe Perches   checkpatch: reduc...
2733
2734
2735
2736
2737
  # 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...
2738
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
2739
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
2740
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
2741
2742
2743
2744
2745
  			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 ...
2746
2747
2748
2749
2750
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
2751
  			if (defined $space_before && $space_before ne "") {
3705ce5bc   Joe Perches   checkpatch: creat...
2752
2753
2754
2755
  				if (WARN("BAD_SIGN_OFF",
  					 "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2756
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2757
2758
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2759
2760
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5bc   Joe Perches   checkpatch: creat...
2761
2762
2763
2764
  				if (WARN("BAD_SIGN_OFF",
  					 "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2765
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2766
2767
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2768
2769
  			}
  			if (!defined $space_after || $space_after ne " ") {
3705ce5bc   Joe Perches   checkpatch: creat...
2770
2771
2772
2773
  				if (WARN("BAD_SIGN_OFF",
  					 "Use a single space after $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2774
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2775
2776
  					    "$ucfirst_sign_off $email";
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2777
  			}
201124755   Joe Perches   checkpatch: valid...
2778

dfa05c28c   Joe Perches   checkpatch: remov...
2779
  			my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
2780
  			my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment));
201124755   Joe Perches   checkpatch: valid...
2781
  			if ($suggested_email eq "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2782
2783
2784
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2785
2786
2787
2788
2789
2790
  			} else {
  				my $dequoted = $suggested_email;
  				$dequoted =~ s/^"//;
  				$dequoted =~ s/" </ </;
  				# Don't force email to have quotes
  				# Allow just an angle bracketed address
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
2791
  				if (!same_email_addresses($email, $suggested_email, 0)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2792
  					WARN("BAD_SIGN_OFF",
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
2793
2794
  					     "email address '$email' might be better as '$suggested_email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2795
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2796
  			}
7e51f1979   Joe Perches   checkpatch: check...
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
  
  # 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 ...
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
  
  # 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...
2837
  		}
a2fe16b9d   Joe Perches   checkpatch: try t...
2838
2839
2840
2841
2842
2843
2844
  # 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);
  		}
44d303eb0   Joe Perches   checkpatch: impro...
2845
2846
  # Check for Gerrit Change-Ids not in any patch context
  		if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
7ebd05ef1   Christopher Covington   checkpatch.pl: ad...
2847
  			ERROR("GERRIT_CHANGE_ID",
44d303eb0   Joe Perches   checkpatch: impro...
2848
2849
  			      "Remove Gerrit Change-Id's before submitting upstream
  " . $herecurr);
7ebd05ef1   Christopher Covington   checkpatch.pl: ad...
2850
  		}
369c8dd39   Joe Perches   checkpatch: impro...
2851
2852
2853
2854
2855
  # 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...
2856
2857
2858
2859
  		     $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...
2860
2861
  			$commit_log_possible_stack_dump = 1;
  		}
2a076f40d   Joe Perches   checkpatch, Submi...
2862
2863
  # Check for line lengths > 75 in commit log, warn once
  		if ($in_commit_log && !$commit_log_long_line &&
369c8dd39   Joe Perches   checkpatch: impro...
2864
2865
2866
2867
2868
2869
2870
2871
  		    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...
2872
2873
2874
2875
2876
  			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...
2877
  # Reset possible stack dump if a blank line is found
369c8dd39   Joe Perches   checkpatch: impro...
2878
2879
2880
2881
  		if ($in_commit_log && $commit_log_possible_stack_dump &&
  		    $line =~ /^\s*$/) {
  			$commit_log_possible_stack_dump = 0;
  		}
bf4daf12a   Joe Perches   checkpatch: avoid...
2882

0d7835fca   Joe Perches   checkpatch: updat...
2883
  # Check for git id commit length and improperly formed commit descriptions
369c8dd39   Joe Perches   checkpatch: impro...
2884
  		if ($in_commit_log && !$commit_log_possible_stack_dump &&
a8972573e   John Hubbard   checkpatch: suppo...
2885
  		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
e882dbfc2   Wei Wang   checkpatch: speci...
2886
  		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
fe043ea12   Joe Perches   checkpatch: warn ...
2887
  		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
aab38f516   Joe Perches   checkpatch: yet a...
2888
  		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
369c8dd39   Joe Perches   checkpatch: impro...
2889
2890
  		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
  		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
fe043ea12   Joe Perches   checkpatch: warn ...
2891
2892
  			my $init_char = "c";
  			my $orig_commit = "";
0d7835fca   Joe Perches   checkpatch: updat...
2893
2894
2895
2896
2897
  			my $short = 1;
  			my $long = 0;
  			my $case = 1;
  			my $space = 1;
  			my $hasdesc = 0;
19c146a64   Joe Perches   checkpatch: make ...
2898
  			my $hasparens = 0;
0d7835fca   Joe Perches   checkpatch: updat...
2899
2900
2901
  			my $id = '0123456789ab';
  			my $orig_desc = "commit description";
  			my $description = "";
fe043ea12   Joe Perches   checkpatch: warn ...
2902
2903
2904
2905
2906
2907
  			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...
2908
2909
2910
2911
2912
2913
  			$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 ...
2914
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2915
2916
2917
2918
  			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
  				 defined $rawlines[$linenr] &&
  				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
  				$orig_desc = $1;
19c146a64   Joe Perches   checkpatch: make ...
2919
  				$hasparens = 1;
b671fde05   Joe Perches   checkpatch: add a...
2920
2921
2922
2923
2924
2925
2926
  			} 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 ...
2927
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2928
2929
2930
2931
  			}
  
  			($id, $description) = git_commit_info($orig_commit,
  							      $id, $orig_desc);
948b133a1   Heinrich Schuchardt   checkpatch: remov...
2932
2933
  			if (defined($id) &&
  			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
0d7835fca   Joe Perches   checkpatch: updat...
2934
2935
2936
2937
  				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...
2938
  		}
13f1937ef   Joe Perches   checkpatch: emit ...
2939
2940
2941
2942
2943
2944
  # 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...
2945
  			$is_patch = 1;
13f1937ef   Joe Perches   checkpatch: emit ...
2946
2947
2948
2949
2950
  			$reported_maintainer_file = 1;
  			WARN("FILE_PATH_CHANGES",
  			     "added, moved or deleted file(s), does MAINTAINERS need updating?
  " . $herecurr);
  		}
e400edb14   Rob Herring   checkpatch: Warn ...
2951
2952
2953
2954
2955
2956
2957
2958
  # Check for adding new DT bindings not in schema format
  		if (!$in_commit_log &&
  		    ($line =~ /^new file mode\s*\d+\s*$/) &&
  		    ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {
  			WARN("DT_SCHEMA_BINDING_PATCH",
  			     "DT bindings should be in DT schema format. See: Documentation/devicetree/writing-schema.rst
  ");
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2959
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
2960
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2961
2962
2963
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
2964
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2965
2966
2967
2968
  		}
  
  # 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...
2969
2970
2971
2972
2973
2974
2975
  		    $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 ...
2976
2977
2978
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
2979
  		}
15662b3e8   Joe Perches   checkpatch: add a...
2980
2981
2982
  # 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...
2983
2984
  		    !($rawline =~ /^\s+(?:\S|$)/ ||
  		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
15662b3e8   Joe Perches   checkpatch: add a...
2985
2986
  			$in_header_lines = 0;
  			$in_commit_log = 1;
ed43c4e58   Allen Hubbe   checkpatch: check...
2987
  			$has_commit_log = 1;
15662b3e8   Joe Perches   checkpatch: add a...
2988
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
2989
2990
2991
2992
2993
2994
2995
2996
2997
  # 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...
2998
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
2999
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
3000
3001
3002
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
d6430f718   Joe Perches   checkpatch: don't...
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
  # 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 ...
3016
  # Check for various typo / spelling mistakes
66d7a382c   Joe Perches   checkpatch: add s...
3017
3018
  		if (defined($misspellings) &&
  		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
ebfd7d623   Joe Perches   checkpatch: add o...
3019
  			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
66b47b4a9   Kees Cook   checkpatch: look ...
3020
3021
3022
3023
  				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...
3024
3025
3026
3027
3028
  				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 ...
3029
3030
3031
3032
3033
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
  				}
  			}
  		}
a8dd86bf7   Matteo Croce   checkpatch.pl: wa...
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
  # 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);
  			}
  		}
310cd06ba   Joe Perches   checkpatch: move ...
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
  # check for repeated words separated by a single space
  		if ($rawline =~ /^\+/ || $in_commit_log) {
  			while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) {
  
  				my $first = $1;
  				my $second = $2;
  
  				if ($first =~ /(?:struct|union|enum)/) {
  					pos($rawline) += length($first) + length($second) + 1;
  					next;
  				}
  
  				next if ($first ne $second);
  				next if ($first eq 'long');
  
  				if (WARN("REPEATED_WORD",
  					 "Possible repeated word: '$first'
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/\b$first $second\b/$first/;
  				}
  			}
  
  			# if it's a repeated word on consecutive lines in a comment block
  			if ($prevline =~ /$;+\s*$/ &&
  			    $prevrawline =~ /($word_pattern)\s*$/) {
  				my $last_word = $1;
  				if ($rawline =~ /^\+\s*\*\s*$last_word /) {
  					if (WARN("REPEATED_WORD",
  						 "Possible repeated word: '$last_word'
  " . $hereprev) &&
  					    $fix) {
  						$fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/;
  					}
  				}
  			}
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
3082
3083
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3084

0a920b5b6   Andy Whitcroft   add a trivial pat...
3085
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3086
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3087
3088
3089
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d5e616fc1   Joe Perches   checkpatch: add a...
3090
3091
3092
3093
  			if (ERROR("DOS_LINE_ENDINGS",
  				  "DOS line endings
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3094
  				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
3095
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
3096
3097
3098
3099
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3100
3101
3102
3103
  			if (ERROR("TRAILING_WHITESPACE",
  				  "trailing whitespace
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3104
  				$fixed[$fixlinenr] =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
3105
  			}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3106
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
3107
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
3108

4783f894d   Josh Triplett   checkpatch.pl: ch...
3109
  # Check for FSF mailing addresses.
109d8cb20   Alexander Duyck   checkpatch: only ...
3110
  		if ($rawline =~ /\bwrite to the Free/i ||
1bde561e4   Matthew Wilcox   checkpatch: add a...
3111
  		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
3e2232f2d   Joe Perches   checkpatch: updat...
3112
3113
  		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
  		    $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894d   Josh Triplett   checkpatch.pl: ch...
3114
3115
3116
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
0675a8fbd   Jean Delvare   checkpatch: renam...
3117
3118
3119
3120
3121
  			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...
3122
  		}
3354957a4   Andi Kleen   checkpatch: add c...
3123
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3124
3125
  # 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...
3126
  		if ($realfile =~ /Kconfig/ &&
678ae162d   Ulf Magnusson   checkpatch: kconf...
3127
3128
3129
3130
  		    # '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...
3131
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3132
3133
3134
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
3135
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3136
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
3137
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3138
3139
3140
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3141
3142
  
  				next if ($f =~ /^-/);
8d73e0e7d   Joe Perches   checkpatch: quiet...
3143
  				last if (!$file && $f =~ /^\@\@/);
a13858033   Andy Whitcroft   checkpatch: only ...
3144

86adf1a07   Ulf Magnusson   checkpatch: kconf...
3145
  				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
a13858033   Andy Whitcroft   checkpatch: only ...
3146
  					$is_start = 1;
22a4ac026   Masahiro Yamada   Revert "checkpatc...
3147
  				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
a13858033   Andy Whitcroft   checkpatch: only ...
3148
3149
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
3150
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
3151
3152
3153
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
678ae162d   Ulf Magnusson   checkpatch: kconf...
3154
3155
3156
3157
3158
3159
3160
  
  				# 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...
3161
3162
3163
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
3164
3165
  				$length++;
  			}
56193274e   Vadim Bendebury   checkpatch: allow...
3166
3167
3168
3169
3170
  			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 ...
3171
3172
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
3173
  		}
7ccf41a89   Joe Perches   checkpatch: addit...
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
  # check MAINTAINERS entries
  		if ($realfile =~ /^MAINTAINERS$/) {
  # check MAINTAINERS entries for the right form
  			if ($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/;
  				}
  			}
  # check MAINTAINERS entries for the right ordering too
  			my $preferred_order = 'MRLSWQBCPTFXNK';
  			if ($rawline =~ /^\+[A-Z]:/ &&
  			    $prevrawline =~ /^[\+ ][A-Z]:/) {
  				$rawline =~ /^\+([A-Z]):\s*(.*)/;
  				my $cur = $1;
  				my $curval = $2;
  				$prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/;
  				my $prev = $1;
  				my $prevval = $2;
  				my $curindex = index($preferred_order, $cur);
  				my $previndex = index($preferred_order, $prev);
  				if ($curindex < 0) {
  					WARN("MAINTAINERS_STYLE",
  					     "Unknown MAINTAINERS entry type: '$cur'
  " . $herecurr);
  				} else {
  					if ($previndex >= 0 && $curindex < $previndex) {
  						WARN("MAINTAINERS_STYLE",
  						     "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'
  " . $hereprev);
  					} elsif ((($prev eq 'F' && $cur eq 'F') ||
  						  ($prev eq 'X' && $cur eq 'X')) &&
  						 ($prevval cmp $curval) > 0) {
  						WARN("MAINTAINERS_STYLE",
  						     "Misordered MAINTAINERS entry - list file patterns in alphabetic order
  " . $hereprev);
  					}
  				}
628f91a28   Joe Perches   checkpatch: warn ...
3215
3216
  			}
  		}
327953e9a   Christoph Jaeger   checkpatch: add c...
3217
3218
3219
3220
3221
3222
3223
  # 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...
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
  		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...
3238
  # check for DT compatible documentation
7dd05b38e   Florian Vaussard   checkpatch: check...
3239
3240
3241
  		if (defined $root &&
  			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
  			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
bff5da433   Rob Herring   checkpatch: add D...
3242
  			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
cc93319b5   Florian Vaussard   checkpatch: impro...
3243
  			my $dt_path = $root . "/Documentation/devicetree/bindings/";
852d095d1   Rob Herring   checkpatch.pl: Up...
3244
  			my $vp_file = $dt_path . "vendor-prefixes.yaml";
cc93319b5   Florian Vaussard   checkpatch: impro...
3245

bff5da433   Rob Herring   checkpatch: add D...
3246
3247
  			foreach my $compat (@compats) {
  				my $compat2 = $compat;
185d566bc   Rob Herring   checkpatch: fix w...
3248
3249
3250
3251
  				$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...
3252
3253
3254
3255
3256
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
  					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path
  " . $herecurr);
  				}
4fbf32a69   Florian Vaussard   checkpatch: fix s...
3257
3258
  				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
  				my $vendor = $1;
852d095d1   Rob Herring   checkpatch.pl: Up...
3259
  				`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
bff5da433   Rob Herring   checkpatch: add D...
3260
3261
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
cc93319b5   Florian Vaussard   checkpatch: impro...
3262
3263
  					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file
  " . $herecurr);
bff5da433   Rob Herring   checkpatch: add D...
3264
3265
3266
  				}
  			}
  		}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
  # 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 = '//';
c8df0ab61   Lubomir Rintel   checkpatch: check...
3277
  				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
9f3a89926   Rob Herring   checkpatch.pl: ad...
3278
3279
3280
3281
  					$comment = '#';
  				} elsif ($realfile =~ /\.rst$/) {
  					$comment = '..';
  				}
fdf13693d   Joe Perches   checkpatch: verif...
3282
3283
3284
  # check SPDX comment style for .[chsS] files
  				if ($realfile =~ /\.[chsS]$/ &&
  				    $rawline =~ /SPDX-License-Identifier:/ &&
ffbce8974   Joe Perches   checkpatch: impro...
3285
  				    $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
fdf13693d   Joe Perches   checkpatch: verif...
3286
3287
3288
3289
  					WARN("SPDX_LICENSE_TAG",
  					     "Improper SPDX comment style for '$realfile', please use '$comment' instead
  " . $herecurr);
  				}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3290
  				if ($comment !~ /^$/ &&
ffbce8974   Joe Perches   checkpatch: impro...
3291
3292
3293
3294
  				    $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...
3295
  				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
ffbce8974   Joe Perches   checkpatch: impro...
3296
3297
3298
3299
3300
3301
  					my $spdx_license = $1;
  					if (!is_SPDX_License_valid($spdx_license)) {
  						WARN("SPDX_LICENSE_TAG",
  						     "'$spdx_license' is not supported in LICENSES/...
  " . $herecurr);
  					}
50c929002   Lubomir Rintel   checkpatch: check...
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
  					if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
  					    not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
  						my $msg_level = \&WARN;
  						$msg_level = \&CHK if ($file);
  						if (&{$msg_level}("SPDX_LICENSE_TAG",
  
  								  "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)
  " . $herecurr) &&
  						    $fix) {
  							$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
  						}
  					}
9f3a89926   Rob Herring   checkpatch.pl: ad...
3314
3315
3316
  				}
  			}
  		}
a0154cdbd   Joe Perches   checkpatch: emit ...
3317
3318
3319
3320
3321
3322
  # check for embedded filenames
  		if ($rawline =~ /^\+.*\Q$realfile\E/) {
  			WARN("EMBEDDED_FILENAME",
  			     "It's generally not useful to have the filename in the file
  " . $herecurr);
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
3323
  # check we are in a valid source file if not then ignore this hunk
d6430f718   Joe Perches   checkpatch: don't...
3324
  		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
5368df20f   Andy Whitcroft   checkpatch: check...
3325

a8da38a9c   Joe Perches   checkpatch: add t...
3326
3327
3328
3329
3330
3331
3332
3333
  # 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...
3334
3335
3336
3337
3338
3339
  # 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...
3340
  #	lines with an RFC3986 like URL
47e0c88b3   Joe Perches   checkpatch: categ...
3341
3342
  #
  # There are 3 different line length message types:
ab1ecabf4   Jean Delvare   checkpatch: fix t...
3343
  # LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
47e0c88b3   Joe Perches   checkpatch: categ...
3344
3345
3346
3347
3348
  # 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...
3349
  		if ($line =~ /^\+/ && $length > $max_line_length) {
47e0c88b3   Joe Perches   checkpatch: categ...
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
  			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...
3365
3366
3367
  			# More special cases
  			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
  				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
d560a5f8a   Joe Perches   checkpatch: skip ...
3368
  				$msg_type = "";
2e4bbbc55   Andreas Brauchli   checkpatch: allow...
3369
3370
3371
  			# 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...
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
  			# 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))) {
bdc48fa11   Joe Perches   checkpatch/coding...
3387
3388
3389
3390
3391
  				my $msg_level = \&WARN;
  				$msg_level = \&CHK if ($file);
  				&{$msg_level}($msg_type,
  					      "line length of $length exceeds $max_line_length columns
  " . $herecurr);
47e0c88b3   Joe Perches   checkpatch: categ...
3392
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3393
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
3394
3395
  # 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...
3396
3397
3398
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
3399
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3400
  # check we are in a valid source file C or perl if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
3401
  		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3402
3403
  
  # at the beginning of a line any tabs must come first and anything
713a09de9   Antonio Borneo   checkpatch: add c...
3404
  # more than $tabsize must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
3405
3406
3407
3408
3409
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
3410
  			$rpt_cleaners = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3411
3412
3413
3414
  			if (ERROR("CODE_INDENT",
  				  "code indent should use tabs where possible
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3415
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3416
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3417
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3418
3419
3420
3421
3422
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3423
3424
3425
3426
  			if (WARN("SPACE_BEFORE_TAB",
  				"please, no space before tabs
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3427
  				while ($fixed[$fixlinenr] =~
713a09de9   Antonio Borneo   checkpatch: add c...
3428
  					   s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
194f66fc9   Joe Perches   checkpatch: add a...
3429
  				while ($fixed[$fixlinenr] =~
c76f4cb3d   Joe Perches   checkpatch: impro...
3430
  					   s/(^\+.*) +\t/$1\t/) {}
3705ce5bc   Joe Perches   checkpatch: creat...
3431
  			}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
3432
  		}
6a487211e   Joe Perches   checkpatch: add t...
3433
3434
3435
3436
3437
3438
3439
  
  # 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...
3440

d1fe9c099   Joe Perches   checkpatch: add s...
3441
3442
3443
3444
3445
3446
  # 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...
3447
  # check indentation starts on a tab stop
5b57980de   Joe Perches   checkpatch: impro...
3448
  		if ($perl_version_ok &&
bd49111f7   Joe Perches   checkpatch: avoid...
3449
  		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
a91e8994f   Joe Perches   checkpatch: add t...
3450
  			my $indent = length($1);
713a09de9   Antonio Borneo   checkpatch: add c...
3451
  			if ($indent % $tabsize) {
a91e8994f   Joe Perches   checkpatch: add t...
3452
3453
3454
3455
  				if (WARN("TABSTOP",
  					 "Statements should start on a tabstop
  " . $herecurr) &&
  				    $fix) {
713a09de9   Antonio Borneo   checkpatch: add c...
3456
  					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
a91e8994f   Joe Perches   checkpatch: add t...
3457
3458
3459
  				}
  			}
  		}
d1fe9c099   Joe Perches   checkpatch: add s...
3460
  # check multi-line statement indentation matches previous line
5b57980de   Joe Perches   checkpatch: impro...
3461
  		if ($perl_version_ok &&
fd71f6326   Joe Perches   checkpatch: impro...
3462
  		    $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...
3463
3464
3465
3466
3467
3468
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
3469
3470
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
3471
3472
  
  				my $goodtabindent = $oldindent .
713a09de9   Antonio Borneo   checkpatch: add c...
3473
3474
  					"\t" x ($pos / $tabsize) .
  					" "  x ($pos % $tabsize);
d1fe9c099   Joe Perches   checkpatch: add s...
3475
3476
3477
3478
  				my $goodspaceindent = $oldindent . " "  x $pos;
  
  				if ($newindent ne $goodtabindent &&
  				    $newindent ne $goodspaceindent) {
3705ce5bc   Joe Perches   checkpatch: creat...
3479
3480
3481
3482
3483
  
  					if (CHK("PARENTHESIS_ALIGNMENT",
  						"Alignment should match open parenthesis
  " . $hereprev) &&
  					    $fix && $line =~ /^\+/) {
194f66fc9   Joe Perches   checkpatch: add a...
3484
  						$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3485
3486
  						    s/^\+[ \t]*/\+$goodtabindent/;
  					}
d1fe9c099   Joe Perches   checkpatch: add s...
3487
3488
3489
  				}
  			}
  		}
6ab3a9701   Joe Perches   checkpatch: impro...
3490
3491
3492
3493
3494
3495
3496
3497
3498
  # 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...
3499
  			if (CHK("SPACING",
f27c95db1   Joe Perches   checkpatch: impro...
3500
3501
  				"No space is necessary after a cast
  " . $herecurr) &&
3705ce5bc   Joe Perches   checkpatch: creat...
3502
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3503
  				$fixed[$fixlinenr] =~
f27c95db1   Joe Perches   checkpatch: impro...
3504
  				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5bc   Joe Perches   checkpatch: creat...
3505
  			}
aad4f6149   Joe Perches   checkpatch: add -...
3506
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3507
3508
  # Block comment styles
  # Networking with an initial /*
058806007   Joe Perches   checkpatch: check...
3509
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd61   Joe Perches   checkpatch: impro...
3510
  		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c6   Joe Perches   checkpatch: ignor...
3511
  		    $rawline =~ /^\+[ \t]*\*/ &&
c70735c23   Łukasz Stelmach   checkpatch: fix f...
3512
  		    $realline > 3) { # Do not warn about the initial copyright comment block after SPDX-License-Identifier
058806007   Joe Perches   checkpatch: check...
3513
3514
3515
3516
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments don't use an empty /* line, use /* Comment...
  " . $hereprev);
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3517
3518
3519
  # Block comments use * on subsequent lines
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
  		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
a605e32eb   Joe Perches   checkpatch: warn ...
3520
  		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
61135e966   Joe Perches   checkpatch: fix n...
3521
  		    $rawline =~ /^\+/ &&			#line is new
a605e32eb   Joe Perches   checkpatch: warn ...
3522
  		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
86406b1cb   Joe Perches   checkpatch: alway...
3523
3524
3525
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use * on subsequent lines
  " . $hereprev);
a605e32eb   Joe Perches   checkpatch: warn ...
3526
  		}
86406b1cb   Joe Perches   checkpatch: alway...
3527
3528
  # Block comments use */ on trailing lines
  		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
c24f9f195   Joe Perches   checkpatch: impro...
3529
3530
3531
  		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
  		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
  		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
86406b1cb   Joe Perches   checkpatch: alway...
3532
3533
3534
  			WARN("BLOCK_COMMENT_STYLE",
  			     "Block comments use a trailing */ on a separate line
  " . $herecurr);
058806007   Joe Perches   checkpatch: check...
3535
  		}
08eb9b801   Joe Perches   checkpatch: test ...
3536
3537
  # Block comment * alignment
  		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
af207524a   Joe Perches   checkpatch: impro...
3538
3539
3540
  		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
  		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
  		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
08eb9b801   Joe Perches   checkpatch: test ...
3541
  		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
af207524a   Joe Perches   checkpatch: impro...
3542
3543
  		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
  			my $oldindent;
08eb9b801   Joe Perches   checkpatch: test ...
3544
  			$prevrawline =~ m@^\+([ \t]*/?)\*@;
af207524a   Joe Perches   checkpatch: impro...
3545
3546
3547
3548
3549
3550
  			if (defined($1)) {
  				$oldindent = expand_tabs($1);
  			} else {
  				$prevrawline =~ m@^\+(.*/?)\*@;
  				$oldindent = expand_tabs($1);
  			}
08eb9b801   Joe Perches   checkpatch: test ...
3551
3552
  			$rawline =~ m@^\+([ \t]*)\*@;
  			my $newindent = $1;
08eb9b801   Joe Perches   checkpatch: test ...
3553
  			$newindent = expand_tabs($newindent);
af207524a   Joe Perches   checkpatch: impro...
3554
  			if (length($oldindent) ne length($newindent)) {
08eb9b801   Joe Perches   checkpatch: test ...
3555
3556
3557
3558
3559
  				WARN("BLOCK_COMMENT_STYLE",
  				     "Block comments should align the * on each line
  " . $hereprev);
  			}
  		}
7f6191914   Joe Perches   checkpatch: add t...
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
  # 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...
3571
  		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
7f6191914   Joe Perches   checkpatch: add t...
3572
  		      $line =~ /^\+\s*__setup/)) {
d752fcc88   Joe Perches   checkpatch: add a...
3573
3574
3575
3576
  			if (CHK("LINE_SPACING",
  				"Please use a blank line after function/struct/union/enum declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3577
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3578
  			}
7f6191914   Joe Perches   checkpatch: add t...
3579
  		}
365dd4eaa   Joe Perches   checkpatch: add a...
3580
3581
3582
3583
  # check for multiple consecutive blank lines
  		if ($prevline =~ /^[\+ ]\s*$/ &&
  		    $line =~ /^\+\s*$/ &&
  		    $last_blank_line != ($linenr - 1)) {
d752fcc88   Joe Perches   checkpatch: add a...
3584
3585
3586
3587
  			if (CHK("LINE_SPACING",
  				"Please don't use multiple blank lines
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3588
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3589
  			}
365dd4eaa   Joe Perches   checkpatch: add a...
3590
3591
  			$last_blank_line = $linenr;
  		}
3b617e3b8   Joe Perches   checkpatch: net a...
3592
  # check for missing blank lines after declarations
3f7bac031   Joe Perches   checkpatch: alway...
3593
3594
3595
  		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
  			# actual declarations
  		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
3596
3597
  			# function pointer declarations
  		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
  			# 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...
3610
3611
  			# function pointer declarations
  		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3612
3613
3614
3615
3616
  			# 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...
3617
  		      $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
3f7bac031   Joe Perches   checkpatch: alway...
3618
3619
3620
3621
3622
3623
3624
3625
  			# 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...
3626
3627
3628
3629
  			if (WARN("LINE_SPACING",
  				 "Missing a blank line after declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
3630
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
3631
  			}
3b617e3b8   Joe Perches   checkpatch: net a...
3632
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3633
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
3634
3635
3636
3637
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
3705ce5bc   Joe Perches   checkpatch: creat...
3638
  		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3639
3640
3641
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3642
3643
3644
3645
  			if (WARN("LEADING_SPACE",
  				 "please, no spaces at the start of a line
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3646
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
3647
  			}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
3648
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
3649
3650
  # 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 -...
3651
3652
3653
3654
3655
3656
  # 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...
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
  # 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 ...
3667
  # check indentation of any line with a bare else
840080a08   Joe Perches   checkpatch: add e...
3668
  # (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f9   Joe Perches   checkpatch: warn ...
3669
3670
3671
  # 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...
3672
3673
3674
3675
  			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 ...
3676
3677
3678
3679
3680
  				WARN("UNNECESSARY_ELSE",
  				     "else is not generally useful after a break or return
  " . $hereprev);
  			}
  		}
c00df19a5   Joe Perches   checkpatch: warn ...
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
  # 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...
3691
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
3692
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3693
3694
3695
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
3696
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3697

56e77d709   Joe Perches   checkpatch: warn ...
3698
3699
3700
3701
3702
3703
  # 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...
3704
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3705
3706
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3707
3708
  #print "LINE<$line>
  ";
ca8198640   Joe Perches   checkpatch: fix s...
3709
  		if ($linenr > $suppress_statement &&
1b5539b1f   Joe Perches   checkpatch: reduc...
3710
  		    $realcnt && $sline =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
3711
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
3712
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
3713
3714
3715
3716
3717
3718
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
  #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...
3730

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3731
3732
3733
3734
3735
3736
3737
  			# 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...
3738
3739
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
3740

c2fdda0df   Andy Whitcroft   update checkpatch...
3741
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
3742
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3743
3744
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
3745
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3746

463f28648   Andy Whitcroft   checkpatch: possi...
3747
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3748
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
3749
  			} 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...
3750
3751
3752
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3753
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
3754
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3755
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
3756
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3757
3758
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
3759
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3760
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3761
3762
3763
3764
3765
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
3766
  			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...
3767
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
3768

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
3776
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
3777
3778
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3779
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3780

9c0ca6f9a   Andy Whitcroft   update checkpatch...
3781
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3782
3783
3784
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
3785

653d4876b   Andy Whitcroft   update checkpatch...
3786
3787
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
  		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...
3806
3807
3808
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
3809
3810
3811
3812
3813
  			}
  		}
  
  # 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...
3814
  		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...
3815
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3816
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
3817
3818
3819
3820
3821
3822
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3823
3824
3825
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
3826
3827
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
3828

548596d52   Andy Whitcroft   checkpatch: trail...
3829
3830
3831
3832
3833
3834
  			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...
3835
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
3836
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
3837

53210168f   Andy Whitcroft   checkpatch: tough...
3838
3839
3840
3841
3842
3843
3844
  			#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...
3845

d752fcc88   Joe Perches   checkpatch: add a...
3846
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3847
3848
3849
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3850
3851
3852
3853
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
3854
  			}
773647a09   Andy Whitcroft   update checkpatch...
3855
3856
3857
3858
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3859
3860
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3861
3862
3863
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
3864
3865
3866
3867
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3868
3869
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
3870
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3871
  # Check relative indent for conditionals and blocks.
f6950a735   Joe Perches   checkpatch: impro...
3872
  		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...
3873
3874
3875
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3876
3877
3878
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
9f5af480f   Joe Perches   checkpatch: impro...
3879
3880
3881
  			# remove inline comments
  			$s =~ s/$;/ /g;
  			$c =~ s/$;/ /g;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3882
3883
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
3884
3885
3886
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3887

9f5af480f   Joe Perches   checkpatch: impro...
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
  			# 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...
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
  			# 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...
3914
3915
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
  				$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...
3926
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
3927
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3928
3929
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
3930
3931
3932
3933
3934
  				# 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...
3935
3936
3937
3938
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
3939
3940
3941
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3942
3943
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
3944
3945
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
3946
3947
3948
3949
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3950
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
  			}
  
  			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...
3966
3967
  			#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...
3968

9f5af480f   Joe Perches   checkpatch: impro...
3969
  			if ($check && $s ne '' &&
713a09de9   Antonio Borneo   checkpatch: add c...
3970
  			    (($sindent % $tabsize) != 0 ||
9f5af480f   Joe Perches   checkpatch: impro...
3971
  			     ($sindent < $indent) ||
f6950a735   Joe Perches   checkpatch: impro...
3972
3973
  			     ($sindent == $indent &&
  			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
713a09de9   Antonio Borneo   checkpatch: add c...
3974
  			     ($sindent > $indent + $tabsize))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3975
3976
3977
3978
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3979
3980
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3981
3982
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
3983
3984
3985
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
3986
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
3987
3988
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
3989
3990
3991
3992
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
3993
3994
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
3995
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3996
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
3997
  #ignore lines not being added
3705ce5bc   Joe Perches   checkpatch: creat...
3998
  		next if ($line =~ /^[^\+]/);
00df344fd   Andy Whitcroft   update checkpatch...
3999

99ca38c2a   Joe Perches   checkpatch: warn ...
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
  # check for self assignments used to avoid compiler warnings
  # e.g.:	int foo = foo, *bar = NULL;
  #	struct foo bar = *(&(bar));
  		if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) {
  			my $var = $1;
  			if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) {
  				WARN("SELF_ASSIGNMENT",
  				     "Do not use self-assignments to avoid compiler warnings
  " . $herecurr);
  			}
  		}
11ca40a0f   Joe Perches   checkpatch: avoid...
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
  # 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 ...
4023
  # check for declarations of signed or unsigned without int
c84471157   Joe Perches   checkpatch: impro...
4024
  		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
4025
4026
  			my $type = $1;
  			my $var = $2;
207a8e846   Joe Perches   checkpatch: impro...
4027
4028
  			$var = "" if (!defined $var);
  			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
a1ce18e4f   Joe Perches   checkpatch: warn ...
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
  				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...
4039
4040
4041
4042
4043
  					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 ...
4044
4045
4046
  				}
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4047
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
4048
4049
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4050
4051
4052
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
4053
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4054
4055
4056
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
4057
  			}
653d4876b   Andy Whitcroft   update checkpatch...
4058
4059
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
4060
4061
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
4062
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4063
4064
4065
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
4066
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4067
4068
4069
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
4070
4071
4072
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4073

f0a594c1c   Andy Whitcroft   update checkpatch...
4074
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
4075
4076
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc88   Joe Perches   checkpatch: add a...
4077
4078
4079
  			if (ERROR("OPEN_BRACE",
  				  "that open brace { should be on the previous line
  " . $hereprev) &&
f2d7e4d43   Joe Perches   checkpatch: add f...
4080
4081
4082
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
4083
4084
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d43   Joe Perches   checkpatch: add f...
4085
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
4086
  				$fixedline = $line;
8d81ae05d   Cyril Bur   checkpatch: silen...
4087
  				$fixedline =~ s/^(.\s*)\{\s*/$1/;
f2d7e4d43   Joe Perches   checkpatch: add f...
4088
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
4089
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
4090
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4091
4092
4093
4094
4095
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
4096
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
4097
4098
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4099
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
4100
4101
4102
4103
4104
4105
4106
  				      "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...
4107
  			}
653d4876b   Andy Whitcroft   update checkpatch...
4108
  		}
00df344fd   Andy Whitcroft   update checkpatch...
4109

0a920b5b6   Andy Whitcroft   add a trivial pat...
4110
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
4111
  		if ($line =~ m{//}) {
3705ce5bc   Joe Perches   checkpatch: creat...
4112
4113
4114
4115
  			if (ERROR("C99_COMMENTS",
  				  "do not use C99 // comments
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4116
  				my $line = $fixed[$fixlinenr];
3705ce5bc   Joe Perches   checkpatch: creat...
4117
4118
  				if ($line =~ /\/\/(.*)$/) {
  					my $comment = trim($1);
194f66fc9   Joe Perches   checkpatch: add a...
4119
  					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5bc   Joe Perches   checkpatch: creat...
4120
4121
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4122
  		}
00df344fd   Andy Whitcroft   update checkpatch...
4123
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4124
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
4125
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
4126

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4127
4128
4129
4130
4131
4132
4133
4134
4135
  # 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...
4136
4137
4138
4139
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
4140
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
4141
4142
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
4143
4144
4145
4146
4147
4148
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4149
4150
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
4151
4152
4153
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4154
4155
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
4156
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4157
4158
4159
4160
4161
  #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...
4162
4163
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
  		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...
4174
4175
4176
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
4177
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4178

5150bda43   Joe Eloff   checkpatch: chang...
4179
  # check for global initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
4180
  		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4181
  			if (ERROR("GLOBAL_INITIALISERS",
6d32f7a39   Joe Perches   checkpatch: impro...
4182
4183
  				  "do not initialise globals to $1
  " . $herecurr) &&
d5e616fc1   Joe Perches   checkpatch: add a...
4184
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
4185
  				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
4186
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
4187
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4188
  # check for static initialisers.
6d32f7a39   Joe Perches   checkpatch: impro...
4189
  		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4190
  			if (ERROR("INITIALISED_STATIC",
6d32f7a39   Joe Perches   checkpatch: impro...
4191
4192
  				  "do not initialise statics to $1
  " .
d5e616fc1   Joe Perches   checkpatch: add a...
4193
4194
  				      $herecurr) &&
  			    $fix) {
6d32f7a39   Joe Perches   checkpatch: impro...
4195
  				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
4196
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4197
  		}
1813087db   Joe Perches   checkpatch: add t...
4198
4199
4200
4201
4202
4203
4204
  # 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 ...
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
  # 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...
4225
4226
  # 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...
4227
4228
4229
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
4230
  				$herecurr);
77b8c0a8e   Joe Perches   checkpatch: warn ...
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
  		}
  
  # 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...
4242
4243
4244
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4245
4246
4247
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
4248
  				$herecurr);
77b8c0a8e   Joe Perches   checkpatch: warn ...
4249
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
4250

ab7e23f34   Joe Perches   checkpatch: add t...
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
  # 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...
4264
4265
4266
4267
4268
4269
4270
  # 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 '...
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
  # 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...
4284
  # check for function declarations without arguments like "int foo()"
16b7f3c89   Joe Perches   checkpatch: avoid...
4285
  		if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
b36190c5f   Joe Perches   checkpatch.pl: ch...
4286
4287
4288
4289
  			if (ERROR("FUNCTION_WITHOUT_ARGS",
  				  "Bad function definition - $1() should probably be $1(void)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4290
  				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5f   Joe Perches   checkpatch.pl: ch...
4291
4292
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4293
4294
4295
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
4296
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4297
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
4298
  		    $line !~ /\b$typeTypedefs\b/ &&
46d832f5e   Michael S. Tsirkin   checkpatch: repla...
4299
  		    $line !~ /\b__bitwise\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4300
4301
4302
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
4303
4304
4305
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
4306
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
4307
4308
4309
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
4310
  			my ($ident, $from, $to) = ($1, $2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
4311
4312
4313
4314
4315
4316
  
  			# 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/...
4317
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4318
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
4319

3705ce5bc   Joe Perches   checkpatch: creat...
4320
4321
  ##			print "1: from<$from> to<$to> ident<$ident>
  ";
65863862b   Andy Whitcroft   checkpatch: dissa...
4322
  			if ($from ne $to) {
3705ce5bc   Joe Perches   checkpatch: creat...
4323
4324
4325
4326
4327
4328
4329
  				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...
4330
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4331
4332
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4333
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
4334
4335
4336
4337
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
4338
  			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
4339
4340
4341
4342
4343
4344
  
  			# 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/...
4345
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
4346
4347
4348
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
4349

3705ce5bc   Joe Perches   checkpatch: creat...
4350
4351
  ##			print "2: from<$from> to<$to> ident<$ident>
  ";
667026e7b   Andy Whitcroft   checkpatch: a mod...
4352
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4353
4354
4355
4356
4357
4358
4359
4360
  				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...
4361
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4362
4363
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
4364
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4365
  		}
9d3e3c705   Joe Perches   checkpatch: add w...
4366
4367
  # avoid BUG() or BUG_ON()
  		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4368
4369
4370
4371
4372
  			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...
4373
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4374

9d3e3c705   Joe Perches   checkpatch: add w...
4375
  # avoid LINUX_VERSION_CODE
8905a67c6   Andy Whitcroft   update checkpatch...
4376
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4377
4378
4379
  			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...
4380
  		}
17441227f   Joe Perches   checkpatch: add w...
4381
4382
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4383
  			WARN("PRINTK_RATELIMITED",
101ee6802   Joe Perches   checkpatch: neate...
4384
4385
  			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
4386
  		}
eeef5733e   Joe Perches   checkpatch: print...
4387
4388
4389
4390
4391
  # 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...
4392
  		}
243f3803c   Joe Perches   checkpatch: sugge...
4393
4394
4395
4396
  		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...
4397
4398
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
4399
  			WARN("PREFER_PR_LEVEL",
daa8b0592   Yogesh Chaudhari   checkpatch.pl: mo...
4400
4401
  			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
4402
  		}
dc1393130   Joe Perches   checkpatch: prefe...
4403
4404
4405
4406
4407
4408
4409
4410
4411
  		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);
  		}
8020b2536   Nicolas Boichat   checkpatch: warn ...
4412
4413
4414
4415
4416
4417
  # trace_printk should not be used in production code.
  		if ($line =~ /\b(trace_printk|trace_puts|ftrace_vprintk)\s*\(/) {
  			WARN("TRACE_PRINTK",
  			     "Do not use $1() in production code (this can be ignored if built only with a debug config option)
  " . $herecurr);
  		}
91c9afaf9   Andy Lutomirski   checkpatch.pl: ne...
4418
4419
4420
4421
4422
4423
4424
4425
  # 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);
  		}
6b9ea5ff5   Jakub Kicinski   checkpatch: warn ...
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
  # ENOTSUPP is not a standard error code and should be avoided in new patches.
  # Folks usually mean EOPNOTSUPP (also called ENOTSUP), when they type ENOTSUPP.
  # Similarly to ENOSYS warning a small number of false positives is expected.
  		if (!$file && $line =~ /\bENOTSUPP\b/) {
  			if (WARN("ENOTSUPP",
  				 "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP
  " . $herecurr) &&
  			    $fix) {
  				$fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/;
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4437
4438
  # 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...
4439
  		if ($perl_version_ok &&
2d453e3b4   Joe Perches   checkpatch: impro...
4440
4441
4442
  		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
  		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
  		    $sline !~ /}/) {
8d1824780   Joe Perches   checkpatch: add -...
4443
  			if (ERROR("OPEN_BRACE",
2d453e3b4   Joe Perches   checkpatch: impro...
4444
4445
  				  "open brace '{' following function definitions go on the next line
  " . $herecurr) &&
8d1824780   Joe Perches   checkpatch: add -...
4446
4447
4448
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixed_line = $rawline;
0633094ec   Dwaipayan Ray   checkpatch: fix u...
4449
  				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*)\{(.*)$/;
8d1824780   Joe Perches   checkpatch: add -...
4450
4451
4452
4453
4454
4455
4456
4457
  				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...
4458
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4459

8905a67c6   Andy Whitcroft   update checkpatch...
4460
4461
4462
  # 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 -...
4463
4464
4465
4466
4467
4468
4469
4470
4471
  			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...
4472
  				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
8d1824780   Joe Perches   checkpatch: add -...
4473
4474
4475
4476
  				if ($fixedline !~ /^\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
4477
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4478
  # missing space after union, struct or enum definition
3705ce5bc   Joe Perches   checkpatch: creat...
4479
4480
4481
4482
4483
  		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...
4484
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4485
4486
  				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
  			}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
4487
  		}
31070b5d4   Joe Perches   checkpatch: add t...
4488
4489
4490
  # Function pointer declarations
  # check spacing between type, funcptr, and args
  # canonical declaration is "type (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4491
  		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d4   Joe Perches   checkpatch: add t...
4492
4493
4494
4495
4496
4497
  			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...
4498
4499
4500
4501
4502
4503
4504
4505
4506
  # 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...
4507
4508
4509
  				WARN("SPACING",
  				     "missing space after return type
  " . $herecurr);
91f72e9c6   Joe Perches   checkpatch: don't...
4510
  				$post_declare_space = " ";
31070b5d4   Joe Perches   checkpatch: add t...
4511
4512
4513
  			}
  
  # unnecessary space "type  (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
  # 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...
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
  
  # 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...
4558
  				$fixed[$fixlinenr] =~
91f72e9c6   Joe Perches   checkpatch: don't...
4559
  				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d4   Joe Perches   checkpatch: add t...
4560
4561
  			}
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4562
4563
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4564
4565
  #  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...
4566
4567
4568
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
4569
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
38dca988b   Heinrich Schuchardt   checkpatch: allow...
4570
  			    $prefix !~ /[{,:]\s+$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4571
4572
4573
4574
  				if (ERROR("BRACKET_SPACE",
  					  "space prohibited before open square bracket '['
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4575
  				    $fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4576
4577
  					s/^(\+.*?)\s+\[/$1\[/;
  				}
8d31cfcec   Andy Whitcroft   checkpatch: check...
4578
4579
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4580
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
4581
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4582
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
4583
4584
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
4585
4586
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
4587
4588
4589
4590
4591
4592
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
4593
4594
4595
  			# 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...
4596
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
4597
4598
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
4599
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4600
4601
4602
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
4603
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4604
4605
  
  			} else {
3705ce5bc   Joe Perches   checkpatch: creat...
4606
4607
4608
4609
  				if (WARN("SPACING",
  					 "space prohibited between function name and open parenthesis '('
  " . $herecurr) &&
  					     $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4610
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4611
4612
  					    s/\b$name\s+\(/$name\(/;
  				}
6c72ffaab   Andy Whitcroft   update checkpatch...
4613
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
4614
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
4615

653d4876b   Andy Whitcroft   update checkpatch...
4616
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4617
  		if (!($line=~/\#\s*include/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4618
4619
  			my $fixed_line = "";
  			my $line_fixed = 0;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4620
4621
4622
4623
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
4624
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
847316231   Joe Perches   checkpatch: repor...
4625
  				\?:|\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4626
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
4627
  			my @elements = split(/($ops|;)/, $opline);
3705ce5bc   Joe Perches   checkpatch: creat...
4628
4629
4630
4631
4632
4633
4634
4635
4636
  
  ##			print("element count: <" . $#elements . ">
  ");
  ##			foreach my $el (@elements) {
  ##				print("el: <$el>
  ");
  ##			}
  
  			my @fix_elements = ();
00df344fd   Andy Whitcroft   update checkpatch...
4637
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4638

3705ce5bc   Joe Perches   checkpatch: creat...
4639
4640
4641
4642
4643
4644
  			foreach my $el (@elements) {
  				push(@fix_elements, substr($rawline, $off, length($el)));
  				$off += length($el);
  			}
  
  			$off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
4645
  			my $blank = copy_spacing($opline);
b34c648bb   Joe Perches   checkpatch: bette...
4646
  			my $last_after = -1;
6c72ffaab   Andy Whitcroft   update checkpatch...
4647

0a920b5b6   Andy Whitcroft   add a trivial pat...
4648
  			for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5bc   Joe Perches   checkpatch: creat...
4649
4650
4651
4652
4653
  
  				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
  
  ##				print("n: <$n> good: <$good>
  ");
4a0df2ef4   Andy Whitcroft   update checkpatch...
4654
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
4655
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
4656
4657
4658
4659
4660
4661
  				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...
4662
4663
4664
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
4665
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4666
4667
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
4668
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4669

0a920b5b6   Andy Whitcroft   add a trivial pat...
4670
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
4671
4672
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4673
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4674
4675
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
4676
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4677
4678
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
4679
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4680
4681
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
4682
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4683
4684
4685
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
4686
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
4687
4688
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
4689

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

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

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

d8aaf1214   Andy Whitcroft   update checkpatch...
4702
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
4703
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
4704
4705
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4706
4707
4708
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4709
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4710
4711
  							$line_fixed = 1;
  						}
d8aaf1214   Andy Whitcroft   update checkpatch...
4712
4713
4714
4715
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
4716

b00e48148   Joe Perches   checkpatch: don't...
4717
4718
4719
  				#   :   when part of a bitfield
  				} elsif ($opv eq ':B') {
  					# skip the bitfield test for now
1f65f947a   Andy Whitcroft   checkpatch: add c...
4720
4721
  				# No spaces for:
  				#   ->
b00e48148   Joe Perches   checkpatch: don't...
4722
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4723
  					if ($ctx =~ /Wx.|.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4724
4725
4726
  						if (ERROR("SPACING",
  							  "spaces prohibited around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4727
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4728
4729
4730
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4731
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4732
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4733
  					}
2381097b6   Joe Perches   checkpatch: add a...
4734
  				# , must not have a space before and must have a space on the right.
0a920b5b6   Andy Whitcroft   add a trivial pat...
4735
  				} elsif ($op eq ',') {
2381097b6   Joe Perches   checkpatch: add a...
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
  					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...
4746
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4747
4748
4749
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4750
  							$line_fixed = 1;
b34c648bb   Joe Perches   checkpatch: bette...
4751
  							$last_after = $n;
2381097b6   Joe Perches   checkpatch: add a...
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
  							$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...
4763
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4764
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4765
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
4766
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4767
4768
4769
4770
4771
4772
4773
  					#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...
4774
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
4775
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
4776
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4777
4778
4779
  						if (ERROR("SPACING",
  							  "space required before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4780
4781
4782
4783
  							if ($n != $last_after + 2) {
  								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
4784
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4785
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
4786
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4787
4788
4789
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4790
4791
4792
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4793
  							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4794
4795
4796
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4797
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4798
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4799
4800
4801
4802
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
4803
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4804
4805
4806
  						if (ERROR("SPACING",
  							  "space required one side of that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4807
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
4808
4809
  							$line_fixed = 1;
  						}
773647a09   Andy Whitcroft   update checkpatch...
4810
4811
4812
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4813
4814
4815
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4816
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4817
4818
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4819
  					}
773647a09   Andy Whitcroft   update checkpatch...
4820
  					if ($ctx =~ /ExW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4821
4822
4823
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4824
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4825
4826
4827
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
4828
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
4829
  						}
653d4876b   Andy Whitcroft   update checkpatch...
4830
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4831

0a920b5b6   Andy Whitcroft   add a trivial pat...
4832
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4833
4834
4835
  				} 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...
4836
4837
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
4838
  				{
d2e025f36   Joe Perches   checkpatch: add -...
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
  					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...
4857
4858
4859
  						if (ERROR("SPACING",
  							  "need consistent spacing around '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4860
4861
4862
4863
  							$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...
4864
4865
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4866
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4867
4868
4869
4870
  				# 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...
4871
4872
4873
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4874
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4875
4876
  							$line_fixed = 1;
  						}
1f65f947a   Andy Whitcroft   checkpatch: add c...
4877
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4878
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
4879
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
4880
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
4881
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
4882
4883
4884
4885
4886
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
342d3d2f1   Antonio Borneo   checkpatch: fix m...
4887
  						$ok = 1;
1f65f947a   Andy Whitcroft   checkpatch: add c...
4888
  					}
e0df7e1fa   Joe Perches   checkpatch: avoid...
4889
4890
4891
4892
4893
4894
4895
  					# 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...
4896
  					# messages are ERROR, but ?: are CHK
1f65f947a   Andy Whitcroft   checkpatch: add c...
4897
  					if ($ok == 0) {
0675a8fbd   Jean Delvare   checkpatch: renam...
4898
4899
  						my $msg_level = \&ERROR;
  						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
847316231   Joe Perches   checkpatch: repor...
4900

0675a8fbd   Jean Delvare   checkpatch: renam...
4901
4902
4903
  						if (&{$msg_level}("SPACING",
  								  "spaces required around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
4904
4905
4906
4907
  							$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...
4908
4909
  							$line_fixed = 1;
  						}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4910
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4911
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4912
  				$off += length($elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
4913
4914
4915
4916
4917
4918
4919
4920
4921
  
  ##				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...
4922
  			}
3705ce5bc   Joe Perches   checkpatch: creat...
4923

194f66fc9   Joe Perches   checkpatch: add a...
4924
4925
  			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
  				$fixed[$fixlinenr] = $fixed_line;
3705ce5bc   Joe Perches   checkpatch: creat...
4926
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4927
  		}
786b63262   Joe Perches   checkpatch: move ...
4928
  # check for whitespace before a non-naked semicolon
d2e248e7b   Joe Perches   checkpatch: warn ...
4929
  		if ($line =~ /^\+.*\S\s+;\s*$/) {
786b63262   Joe Perches   checkpatch: move ...
4930
4931
4932
4933
  			if (WARN("SPACING",
  				 "space prohibited before semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4934
  				1 while $fixed[$fixlinenr] =~
786b63262   Joe Perches   checkpatch: move ...
4935
4936
4937
  				    s/^(\+.*\S)\s+;/$1;/;
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4938
4939
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4940
4941
4942
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
4943
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
  ## # 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...
4955
4956
4957
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
4958
4959
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4960

0a920b5b6   Andy Whitcroft   add a trivial pat...
4961
  #need space before brace following if, while, etc
6b8c69e43   Geyslan G. Bem   checkpatch: fix a...
4962
  		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
6ad724e2a   Michal Zylowski   checkpatch: check...
4963
  		    $line =~ /\b(?:else|do)\{/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4964
4965
4966
4967
  			if (ERROR("SPACING",
  				  "space required before the open brace '{'
  " . $herecurr) &&
  			    $fix) {
6ad724e2a   Michal Zylowski   checkpatch: check...
4968
  				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
3705ce5bc   Joe Perches   checkpatch: creat...
4969
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4970
  		}
c4a62ef91   Joe Perches   checkpatch: add a...
4971
4972
4973
4974
4975
4976
4977
4978
  ## # 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...
4979
4980
  # closing brace should have a space following it when it has anything
  # on the line
94fb98450   Joe Perches   checkpatch: allow...
4981
  		if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4982
4983
4984
4985
  			if (ERROR("SPACING",
  				  "space required after that close brace '}'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4986
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4987
4988
  				    s/}((?!(?:,|;|\)))\S)/} $1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4989
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4990
4991
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4992
4993
4994
4995
  			if (ERROR("SPACING",
  				  "space prohibited after that open square bracket '['
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4996
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4997
4998
  				    s/\[\s+/\[/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4999
5000
  		}
  		if ($line =~ /\s\]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5001
5002
5003
5004
  			if (ERROR("SPACING",
  				  "space prohibited before that close square bracket ']'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5005
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5006
5007
  				    s/\s+\]/\]/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5008
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
5009
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5010
5011
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5012
5013
5014
5015
  			if (ERROR("SPACING",
  				  "space prohibited after that open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5016
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5017
5018
  				    s/\(\s+/\(/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5019
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5020
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
5021
5022
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5023
5024
5025
5026
  			if (ERROR("SPACING",
  				  "space prohibited before that close parenthesis ')'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5027
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5028
5029
  				    s/\s+\)/\)/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5030
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
5031
5032
5033
5034
  # 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 -...
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
  			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 ...
5058

63b7c73ec   Joe Perches   checkpatch: add -...
5059
  # check for unnecessary parentheses around comparisons in if uses
a032aa4c4   Joe Perches   checkpatch: exclu...
5060
5061
  # when !drivers/staging or command-line uses --strict
  		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
5b57980de   Joe Perches   checkpatch: impro...
5062
  		    $perl_version_ok && defined($stat) &&
63b7c73ec   Joe Perches   checkpatch: add -...
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
  		    $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...
5087
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
5088
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
5089
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
5090
5091
5092
5093
  			if (WARN("INDENTED_LABEL",
  				 "labels should not be indented
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5094
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5095
5096
  				    s/^(.)\s+/$1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5097
  		}
40873aba2   Joe Perches   checkpatch: add t...
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
  # check if a statement with a comma should be two statements like:
  #	foo = bar(),	/* comma should be semicolon */
  #	bar = baz();
  		if (defined($stat) &&
  		    $stat =~ /^\+\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*,\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*;\s*$/) {
  			my $cnt = statement_rawlines($stat);
  			my $herectx = get_stat_here($linenr, $cnt, $here);
  			WARN("SUSPECT_COMMA_SEMICOLON",
  			     "Possible comma where semicolon could be used
  " . $herectx);
  		}
5b9553abf   Joe Perches   checkpatch: make ...
5109
  # return is not a function
507e51418   Joe Perches   checkpatch: impro...
5110
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
5111
  			my $spacing = $1;
5b57980de   Joe Perches   checkpatch: impro...
5112
  			if ($perl_version_ok &&
5b9553abf   Joe Perches   checkpatch: make ...
5113
5114
5115
5116
5117
5118
5119
5120
  			    $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...
5121
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5122
5123
5124
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
5125
5126
  			}
  		}
507e51418   Joe Perches   checkpatch: impro...
5127

b43ae21bd   Joe Perches   checkpatch: reduc...
5128
5129
5130
5131
5132
5133
5134
5135
  # 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 ...
5136
  			WARN("RETURN_VOID",
b43ae21bd   Joe Perches   checkpatch: reduc...
5137
5138
5139
  			     "void function return statements are not generally useful
  " . $hereprev);
                 }
9819cf252   Joe Perches   checkpatch: warn ...
5140

189248d8f   Joe Perches   checkpatch: check...
5141
  # if statements using unnecessary parentheses - ie: if ((foo == bar))
5b57980de   Joe Perches   checkpatch: impro...
5142
  		if ($perl_version_ok &&
189248d8f   Joe Perches   checkpatch: check...
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
  		    $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...
5155
5156
5157
5158
  # 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...
5159
  		if ($perl_version_ok &&
c5595fa2f   Joe Perches   checkpatch: add c...
5160
5161
5162
5163
5164
5165
  		    $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...
5166
  			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
c5595fa2f   Joe Perches   checkpatch: add c...
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
  			    $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...
5184
5185
  # 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...
5186
5187
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5188
  				WARN("USE_NEGATIVE_ERRNO",
f34e4a4f9   Joe Perches   checkpatch: impro...
5189
5190
  				     "return of an errno should typically be negative (ie: return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
5191
5192
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
5193

0a920b5b6   Andy Whitcroft   add a trivial pat...
5194
  # Need a space before open parenthesis after if, while etc
3705ce5bc   Joe Perches   checkpatch: creat...
5195
5196
5197
5198
5199
  		if ($line =~ /\b(if|while|for|switch)\(/) {
  			if (ERROR("SPACING",
  				  "space required before the open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5200
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5201
5202
  				    s/\b(if|while|for|switch)\(/$1 \(/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5203
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
5204
5205
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
5206
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
5207
5208
5209
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
  			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 "...
5232
  		    defined($stat) && defined($cond) &&
170d3a226   Andy Whitcroft   checkpatch: handl...
5233
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
5234
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
5235

b53c8e104   Andy Whitcroft   checkpatch: ensur...
5236
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
65b64b3be   Joe Perches   checkpatch: add -...
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
  				if (ERROR("ASSIGN_IN_IF",
  					  "do not use assignment in if condition
  " . $herecurr) &&
  				    $fix && $perl_version_ok) {
  					if ($rawline =~ /^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/) {
  						my $space = $1;
  						my $not = $2;
  						my $statement = $3;
  						my $assigned = $4;
  						my $test = $8;
  						my $against = $9;
  						my $brace = $15;
  						fix_delete_line($fixlinenr, $rawline);
  						fix_insert_line($fixlinenr, "$space$statement;");
  						my $newline = "${space}if (";
  						$newline .= '!' if defined($not);
  						$newline .= '(' if (defined $not && defined($test) && defined($against));
  						$newline .= "$assigned";
  						$newline .= " $test $against" if (defined($test) && defined($against));
  						$newline .= ')' if (defined $not && defined($test) && defined($against));
  						$newline .= ')';
  						$newline .= " {" if (defined($brace));
  						fix_insert_line($fixlinenr + 1, $newline);
  					}
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
5262
5263
5264
5265
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
5266
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
5267
5268
  			$s =~ s/
  .*//g;
342d3d2f1   Antonio Borneo   checkpatch: fix m...
5269
  			$s =~ s/$;//g;	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
5270
5271
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
5272
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5273
5274
5275
5276
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
5277
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5278

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
5279
5280
5281
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
5282
5283
5284
5285
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
5286
5287
5288
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
5289
5290
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
  # 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...
5303
5304
5305
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
5306
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
5307
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
5308
5309
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
  			my $s = $1;
342d3d2f1   Antonio Borneo   checkpatch: fix m...
5310
  			$s =~ s/$;//g;	# Remove any comments
13214adf7   Andy Whitcroft   update checkpatch...
5311
  			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5312
5313
5314
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
5315
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5316
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
5317
5318
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5319
  			ERROR("TRAILING_STATEMENTS",
048b123fa   Rasmus Villemoes   checkpatch.pl: al...
5320
5321
  			      "trailing statements should be on next line (or did you mean 'else if'?)
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
5322
5323
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
5324
5325
5326
  # 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...
5327
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
5328
5329
5330
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5331
5332
5333
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
5334
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5335
5336
5337
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
8b8856f4b   Joe Perches   checkpatch: fix b...
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
  		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...
5355
  		}
8b8856f4b   Joe Perches   checkpatch: fix b...
5356
5357
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
  		    $previndent == $indent) {
c2fdda0df   Andy Whitcroft   update checkpatch...
5358
5359
5360
5361
  			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...
5362
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
5363
5364
5365
5366
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
8b8856f4b   Joe Perches   checkpatch: fix b...
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
  				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...
5380
5381
  			}
  		}
95e2c6023   Joe Perches   checkpatch: warn ...
5382
  #Specific variable tests
323c1260b   Joe Perches   checkpatch: warn ...
5383
5384
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
95e2c6023   Joe Perches   checkpatch: warn ...
5385

95e2c6023   Joe Perches   checkpatch: warn ...
5386
  #CamelCase
807bd26c4   Joe Perches   checkpatch: remov...
5387
  			if ($var !~ /^$Constant$/ &&
be79794bc   Joe Perches   checkpatch: chang...
5388
  			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
5389
  #Ignore Page<foo> variants
807bd26c4   Joe Perches   checkpatch: remov...
5390
  			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
d439e6a5d   Joe Perches   checkpatch: impro...
5391
5392
5393
  #Ignore SI style variants like nS, mV and dB
  #(ie: max_uV, regulator_min_uA_show, RANGE_mA_VALUE)
  			    $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
f51235764   Julius Werner   checkpatch: allow...
5394
5395
  #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...
5396
5397
5398
  				while ($var =~ m{($Ident)}g) {
  					my $word = $1;
  					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b077101   Joe Perches   checkpatch: exten...
5399
5400
5401
5402
5403
5404
5405
  					if ($check) {
  						seed_camelcase_includes();
  						if (!$file && !$camelcase_file_seeded) {
  							seed_camelcase_file($realfile);
  							$camelcase_file_seeded = 1;
  						}
  					}
7e781f67d   Joe Perches   checkpatch: check...
5406
5407
5408
5409
5410
5411
  					if (!defined $camelcase{$word}) {
  						$camelcase{$word} = 1;
  						CHK("CAMELCASE",
  						    "Avoid CamelCase: <$word>
  " . $herecurr);
  					}
3445686af   Joe Perches   checkpatch: ignor...
5412
  				}
323c1260b   Joe Perches   checkpatch: warn ...
5413
5414
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5415
5416
  
  #no spaces allowed after \ in define
d5e616fc1   Joe Perches   checkpatch: add a...
5417
5418
5419
5420
5421
  		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...
5422
  				$fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
5423
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5424
  		}
0e212e0a7   Fabian Frederick   checkpatch: don't...
5425
5426
  # 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...
5427
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
5428
5429
5430
5431
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
5432
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
5433
  			{
0e212e0a7   Fabian Frederick   checkpatch: don't...
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
  				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...
5445
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5446
5447
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5448
5449
  # 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...
5450
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
5451
5452
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
5453
5454
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
5455
5456
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
08a2843e7   Joe Perches   checkpatch: warn ...
5457
5458
  			my $has_flow_statement = 0;
  			my $has_arg_concat = 0;
c45dcabd2   Andy Whitcroft   update checkpatch...
5459
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
5460
5461
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
5462
5463
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
5464
5465
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
5466

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

f59b64bff   Joe Perches   checkpatch: add -...
5470
5471
5472
5473
5474
5475
5476
5477
  			$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...
5478
  				$define_args =~ s/\\\+?//g;
f59b64bff   Joe Perches   checkpatch: add -...
5479
5480
  				@def_args = split(",", $define_args);
  			}
292f1a9b3   Andy Whitcroft   checkpatch: compl...
5481
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5482
5483
5484
5485
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
5486

c45dcabd2   Andy Whitcroft   update checkpatch...
5487
  			# Flatten any parentheses and braces
2e44e8033   Dwaipayan Ray   checkpatch: fix m...
5488
5489
5490
  			while ($dstat =~ s/\([^\(\)]*\)/1u/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1u/ ||
  			       $dstat =~ s/.\[[^\[\]]*\]/1u/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
5491
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
5492
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
5493

342d3d2f1   Antonio Borneo   checkpatch: fix m...
5494
  			# Flatten any obvious string concatenation.
33acb54a4   Joe Perches   checkpatch: use $...
5495
5496
  			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*($String)/$1/)
e45bab8eb   Andy Whitcroft   checkpatch: handl...
5497
5498
  			{
  			}
42e152931   Joe Perches   checkpatch: exclu...
5499
5500
  			# Make asm volatile uses seem like a generic function
  			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
c45dcabd2   Andy Whitcroft   update checkpatch...
5501
5502
5503
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
5504
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
5505
5506
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
5507
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
5508
5509
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
5510
  				\.$Ident\s*=\s*|
6b10df425   Vladimir Zapolskiy   checkpatch: fix a...
5511
5512
  				^\"|\"$|
  				^\[
c45dcabd2   Andy Whitcroft   update checkpatch...
5513
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
5514
5515
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f59b64bff   Joe Perches   checkpatch: add -...
5516
5517
5518
  
  			$ctx =~ s/
  *$//;
f59b64bff   Joe Perches   checkpatch: add -...
5519
  			my $stmt_cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5520
  			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
f59b64bff   Joe Perches   checkpatch: add -...
5521

f74bd1942   Andy Whitcroft   checkpatch: corre...
5522
5523
5524
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
3cc4b1c3f   Joe Perches   checkpatch: reduc...
5525
  			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd3981   Joe Perches   checkpatch: fix c...
5526
  			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
5527
5528
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
e942e2c3f   Joe Perches   checkpatch: fix s...
5529
  			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
72f115f94   Andy Whitcroft   checkpatch: compl...
5530
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
2e44e8033   Dwaipayan Ray   checkpatch: fix m...
5531
  			    $dstat !~ /^while\s*$Constant\s*$Constant\s*$/ &&		# while (...) {...}
f74bd1942   Andy Whitcroft   checkpatch: corre...
5532
5533
5534
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
4e5d56bdf   Eddie Kovsky   checkpatch: fix l...
5535
  			    $dstat !~ /^\(\{/ &&						# ({...
f95a7e6a4   Joe Perches   checkpatch: ignor...
5536
  			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd1942   Andy Whitcroft   checkpatch: corre...
5537
  			{
e795556a5   Joe Perches   checkpatch: impro...
5538
5539
5540
5541
5542
  				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...
5543
5544
5545
5546
  					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...
5547
  					ERROR("COMPLEX_MACRO",
388982b55   Andrew Morton   checkpatch: fix s...
5548
5549
  					      "Macros with complex values should be enclosed in parentheses
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
5550
  				}
f59b64bff   Joe Perches   checkpatch: add -...
5551
5552
  
  			}
5207649b7   Joe Perches   checkpatch: impro...
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
  
  			# 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 -...
5571
5572
5573
  # check if any macro arguments are reused (ignore '...' and 'type')
  			foreach my $arg (@def_args) {
  			        next if ($arg =~ /\.\.\./);
9192d41a3   Joe Perches   checkpatch: add -...
5574
  			        next if ($arg =~ /^type$/i);
7fe528a27   Joe Perches   checkpatch: impro...
5575
  				my $tmp_stmt = $define_stmt;
6dba824e9   Brendan Jackman   checkpatch: exclu...
5576
  				$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...
5577
5578
  				$tmp_stmt =~ s/\#+\s*$arg\b//g;
  				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
d41362ed1   Joe Perches   checkpatch: fix m...
5579
  				my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
f59b64bff   Joe Perches   checkpatch: add -...
5580
5581
5582
5583
  				if ($use_cnt > 1) {
  					CHK("MACRO_ARG_REUSE",
  					    "Macro argument reuse '$arg' - possible side-effects?
  " . "$herectx");
9192d41a3   Joe Perches   checkpatch: add -...
5584
5585
  				    }
  # check if any macro arguments may have other precedence issues
7fe528a27   Joe Perches   checkpatch: impro...
5586
  				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
9192d41a3   Joe Perches   checkpatch: add -...
5587
5588
5589
5590
5591
  				    ((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 -...
5592
  				}
653d4876b   Andy Whitcroft   update checkpatch...
5593
  			}
5023d3472   Joe Perches   checkpatch: warn ...
5594

08a2843e7   Joe Perches   checkpatch: warn ...
5595
5596
5597
  # 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 ...
5598
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5599
  				my $herectx = get_stat_here($linenr, $cnt, $here);
08a2843e7   Joe Perches   checkpatch: warn ...
5600

08a2843e7   Joe Perches   checkpatch: warn ...
5601
5602
5603
5604
  				WARN("MACRO_WITH_FLOW_CONTROL",
  				     "Macros with flow control statements should be avoided
  " . "$herectx");
  			}
481eb486a   Joe Perches   checkpatch: exten...
5605
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
5606
5607
5608
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
5609
5610
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
5611
5612
5613
5614
5615
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5616
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
5617
5618
5619
  # 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...
5620
  		if ($perl_version_ok &&
b13edf7ff   Joe Perches   checkpatch: add c...
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
  		    $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...
5633
  			$dstat =~ s/$;/ /g;
b13edf7ff   Joe Perches   checkpatch: add c...
5634
5635
5636
5637
5638
5639
5640
5641
  
  			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...
5642
  				my $herectx = get_stat_here($linenr, $cnt, $here);
b13edf7ff   Joe Perches   checkpatch: add c...
5643

ac8e97f8a   Joe Perches   checkpatch: add c...
5644
5645
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
5646
5647
5648
5649
5650
5651
5652
5653
5654
  					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 ...
5655
5656
5657
5658
  			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5659
  				my $herectx = get_stat_here($linenr, $cnt, $here);
f5ef95b12   Joe Perches   checkpatch: warn ...
5660
5661
5662
5663
  
  				WARN("TRAILING_SEMICOLON",
  				     "macros should not use a trailing semicolon
  " . "$herectx");
b13edf7ff   Joe Perches   checkpatch: add c...
5664
5665
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5666
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
5667
5668
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
5669
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
5670
5671
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5672
5673
5674
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
5675
5676
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
5677
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
5678
5679
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5680
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
5681
5682
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
5683
5684
5685
5686
  					# 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 -...
5687
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
5688
5689
5690
5691
5692
5693
5694
5695
5696
  					#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...
5697
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
5698
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
5699
5700
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
5701
5702
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5703
5704
5705
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5706
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5707
5708
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5709
5710
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5711
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5712
  					}
cf655043d   Andy Whitcroft   update checkpatch...
5713
5714
5715
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
5716
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
5717
  					}
aad4f6149   Joe Perches   checkpatch: add -...
5718
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
5719
  				}
aad4f6149   Joe Perches   checkpatch: add -...
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
  				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...
5735
5736
5737
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
5738
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
5739
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
5740
5741
5742
5743
5744
5745
5746
5747
  			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...
5748
5749
5750
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
5751
5752
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
5753
5754
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
5755
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
5756
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
  			}
  			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...
5777
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
5778
5779
5780
5781
5782
5783
5784
5785
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
f055663c5   Andy Whitcroft   checkpatch: repor...
5786
  				my $cnt = statement_rawlines($block);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
5787
  				my $herectx = get_stat_here($linenr, $cnt, $here);
cf655043d   Andy Whitcroft   update checkpatch...
5788

000d1cc18   Joe Perches   checkpatch.pl: ad...
5789
5790
5791
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
5792
5793
  			}
  		}
e4c5babd3   Joe Perches   checkpatch: notic...
5794
  # check for single line unbalanced braces
953304736   Sven Eckelmann   checkpatch: remov...
5795
5796
  		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
  		    $sline =~ /^.\s*else\s*\{\s*$/) {
e4c5babd3   Joe Perches   checkpatch: notic...
5797
5798
5799
  			CHK("BRACES", "Unbalanced braces around else statement
  " . $herecurr);
  		}
0979ae664   Joe Perches   checkpatch: Add -...
5800
  # check for unnecessary blank lines around braces
77b9a53a6   Joe Perches   checkpatch: don't...
5801
  		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5802
5803
5804
5805
5806
5807
  			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 -...
5808
  		}
77b9a53a6   Joe Perches   checkpatch: don't...
5809
  		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
5810
5811
5812
5813
5814
5815
  			if (CHK("BRACES",
  				"Blank lines aren't necessary after an open brace '{'
  " . $hereprev) &&
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  			}
0979ae664   Joe Perches   checkpatch: Add -...
5816
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5817
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
5818
5819
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5820
  			WARN("VOLATILE",
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
5821
5822
  			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5823
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5824
5825
5826
5827
  # 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 $...
5828
  		if ($line =~ /^\+\s*$String/ &&
5e4f6ba5e   Joe Perches   checkpatch: add a...
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
  		    $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...
5864
5865
5866
5867
  # 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 ...
5868
5869
  		if ($line =~ /^\+.*$String/ &&
  		    defined($context_function) &&
e4b7d3091   Joe Perches   checkpatch: clari...
5870
5871
  		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
  		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
77cb8546b   Joe Perches   checkpatch: warn ...
5872
  			WARN("EMBEDDED_FUNCTION_NAME",
e4b7d3091   Joe Perches   checkpatch: clari...
5873
5874
  			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string
  " . $herecurr);
77cb8546b   Joe Perches   checkpatch: warn ...
5875
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
  # 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 -...
5889
  # concatenated string without spaces between elements
79682c0c0   Joe Perches   checkpatch: add -...
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
  		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 -...
5901
  		}
90ad30e5b   Joe Perches   checkpatch: add t...
5902
  # uncoalesced string fragments
33acb54a4   Joe Perches   checkpatch: use $...
5903
  		if ($line =~ /$String\s*"/) {
79682c0c0   Joe Perches   checkpatch: add -...
5904
5905
5906
5907
5908
5909
5910
5911
5912
  			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...
5913
  		}
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5914
5915
5916
  # 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...
5917
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5918
  			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5e4f6ba5e   Joe Perches   checkpatch: add a...
5919
  			$string =~ s/%%/__/g;
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5920
5921
  			# check for %L
  			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5922
  				WARN("PRINTF_L",
522b837c6   Alexey Dobriyan   checkpatch: warn ...
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
  				     "\%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 ...
5937
5938
5939
  				      "Prefixing 0x with decimal output is defective
  " . $herecurr);
  			}
5e4f6ba5e   Joe Perches   checkpatch: add a...
5940
5941
5942
  		}
  
  # check for line continuations in quoted strings with odd counts of "
3f7f335db   Joe Perches   checkpatch: impro...
5943
  		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5e4f6ba5e   Joe Perches   checkpatch: add a...
5944
5945
5946
5947
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
5948
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
5949
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
60f890105   Prakruthi Deepak Heragu   checkpatch: check...
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
  			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...
5960
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
5961
5962
  # check for needless "if (<foo>) fn(<foo>)" uses
  		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
100425dee   Joe Perches   checkpatch: add s...
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
  			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...
5992
5993
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
5994

ebfdc4096   Joe Perches   checkpatch: attem...
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
  # 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...
6011
6012
6013
  			if ($s =~ /(?:^|
  )[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
  			    $s !~ /\b__GFP_NOWARN\b/ ) {
ebfdc4096   Joe Perches   checkpatch: attem...
6014
6015
6016
6017
6018
  				WARN("OOM_MESSAGE",
  				     "Possible unnecessary 'out of memory' message
  " . $hereprev);
  			}
  		}
f78d98f6c   Joe Perches   checkpatch: warn ...
6019
  # check for logging functions with KERN_<LEVEL>
dcaf11236   Paolo Bonzini   checkpatch: fix U...
6020
  		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6c   Joe Perches   checkpatch: warn ...
6021
6022
6023
6024
6025
6026
6027
6028
6029
  		    $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 ...
6030
6031
6032
6033
6034
6035
  # 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...
6036
  # check for mask then right shift without a parentheses
5b57980de   Joe Perches   checkpatch: impro...
6037
  		if ($perl_version_ok &&
abb08a538   Joe Perches   checkpatch: try t...
6038
6039
6040
6041
6042
6043
  		    $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 -...
6044
  # check for pointer comparisons to NULL
5b57980de   Joe Perches   checkpatch: impro...
6045
  		if ($perl_version_ok) {
b75ac618d   Joe Perches   checkpatch: add -...
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
  			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...
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
  # 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...
6073
  					$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...
6074
6075
6076
  				}
  			}
  		}
e970b8846   Joe Perches   checkpatch: add r...
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
  # 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...
6087
  				$fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
  				    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...
6099
  				my $lead = $fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
6100
6101
6102
6103
  				    /(^\+\s*(?:static\s+))/;
  				$lead = rtrim($1);
  				$lead = "$lead " if ($lead !~ /^\+$/);
  				$lead = "${lead}const ";
194f66fc9   Joe Perches   checkpatch: add a...
6104
  				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b8846   Joe Perches   checkpatch: add r...
6105
6106
  			}
  		}
c17893c74   Joe Perches   checkpatch: add a...
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
  # 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 ...
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
  # 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...
6127
  				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138c   Joe Perches   checkpatch: warn ...
6128
6129
  			}
  		}
1a15a2508   Patrick Pannuto   checkpatch: prefe...
6130
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
6131
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c3   Joe Perches   checkpatch: add t...
6132
  			my $delay = $1;
1a15a2508   Patrick Pannuto   checkpatch: prefe...
6133
  			# ignore udelay's < 10, however
43c1d77c3   Joe Perches   checkpatch: add t...
6134
  			if (! ($delay < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6135
  				CHK("USLEEP_RANGE",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
6136
6137
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst
  " . $herecurr);
43c1d77c3   Joe Perches   checkpatch: add t...
6138
6139
6140
6141
6142
  			}
  			if ($delay > 2000) {
  				WARN("LONG_UDELAY",
  				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h
  " . $herecurr);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
6143
6144
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
6145
6146
6147
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6148
  				WARN("MSLEEP",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
6149
6150
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst
  " . $herecurr);
09ef87255   Patrick Pannuto   checkpatch: warn ...
6151
6152
  			}
  		}
36ec19390   Joe Perches   checkpatch: warn ...
6153
6154
6155
6156
6157
6158
  # 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 ...
6159
6160
6161
6162
6163
6164
  # 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...
6165
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
6166
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
6167
6168
6169
6170
6171
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
6172
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
6173
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5bc   Joe Perches   checkpatch: creat...
6174
6175
6176
6177
  			if (ERROR("SPACING",
  				  "exactly one space required after that #$1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6178
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
6179
6180
  				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
6181
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
6182
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
6183
6184
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
6185
6186
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6187
6188
6189
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
6190
6191
6192
  			}
  		}
  # check for memory barriers without a comment.
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
6193
6194
6195
6196
  
  		my $barriers = qr{
  			mb|
  			rmb|
ad83ec6ce   Will Deacon   checkpatch: Remov...
6197
  			wmb
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
  		}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...
6209
6210
  			smp_(?:$barrier_stems)|
  			virt_(?:$barrier_stems)
402c2553a   Michael S. Tsirkin   checkpatch.pl: ad...
6211
6212
6213
  		}x;
  
  		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
6214
  			if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb99   Joe Perches   checkpatch: make ...
6215
6216
6217
  				WARN("MEMORY_BARRIER",
  				     "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
6218
6219
  			}
  		}
3ad81779a   Paul E. McKenney   scripts: Make che...
6220

f4073b0f6   Michael S. Tsirkin   checkpatch: check...
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
  		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...
6231
6232
6233
6234
6235
6236
6237
6238
  # 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...
6239

5099a722e   Marco Elver   checkpatch: Warn ...
6240
6241
6242
6243
6244
6245
6246
6247
  # check for data_race without a comment.
  		if ($line =~ /\bdata_race\s*\(/) {
  			if (!ctx_has_comment($first_line, $linenr)) {
  				WARN("DATA_RACE",
  				     "data_race without comment
  " . $herecurr);
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
6248
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
6249
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6250
6251
6252
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
6253
  		}
653d4876b   Andy Whitcroft   update checkpatch...
6254

596ed45b5   Joe Perches   checkpatch: impro...
6255
6256
6257
6258
6259
6260
  # 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 ...
6261
  # Check that the storage class is at the beginning of a declaration
596ed45b5   Joe Perches   checkpatch: impro...
6262
6263
6264
6265
  		if ($line =~ /\b$Storage\b/ &&
  		    $line !~ /^.\s*$Storage/ &&
  		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
  		    $1 !~ /[\,\)]\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6266
  			WARN("STORAGE_CLASS",
596ed45b5   Joe Perches   checkpatch: impro...
6267
6268
  			     "storage class should be at the beginning of the declaration
  " . $herecurr);
d4977c78e   Tobias Klauser   checkpatch: warn ...
6269
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6270
6271
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6272
6273
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6274
6275
6276
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6277
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
6278
  # Check for __inline__ and __inline, prefer inline
2b7ab4539   Joe Perches   checkpatch: don't...
6279
6280
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6281
6282
6283
6284
  			if (WARN("INLINE",
  				 "plain inline is preferred over $1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6285
  				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc1   Joe Perches   checkpatch: add a...
6286
6287
  
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
6288
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
6289
  # Check for __attribute__ packed, prefer __packed
2b7ab4539   Joe Perches   checkpatch: don't...
6290
6291
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6292
6293
6294
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
6295
  		}
39b7e2878   Joe Perches   checkpatch: add a...
6296
  # Check for __attribute__ aligned, prefer __aligned
2b7ab4539   Joe Perches   checkpatch: don't...
6297
6298
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6299
6300
6301
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
6302
  		}
462811d9d   Joe Perches   checkpatch: prefe...
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
  # 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...
6315
  # Check for __attribute__ format(printf, prefer __printf
2b7ab4539   Joe Perches   checkpatch: don't...
6316
6317
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6318
6319
6320
6321
  			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...
6322
  				$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...
6323
6324
  
  			}
5f14d3bd8   Joe Perches   checkpatch: prefe...
6325
  		}
6061d949d   Joe Perches   include/ and chec...
6326
  # Check for __attribute__ format(scanf, prefer __scanf
2b7ab4539   Joe Perches   checkpatch: don't...
6327
6328
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6329
6330
6331
6332
  			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...
6333
  				$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...
6334
  			}
6061d949d   Joe Perches   include/ and chec...
6335
  		}
619a908aa   Joe Perches   checkpatch: add e...
6336
  # Check for __attribute__ weak, or __weak declarations (may have link issues)
5b57980de   Joe Perches   checkpatch: impro...
6337
  		if ($perl_version_ok &&
619a908aa   Joe Perches   checkpatch: add e...
6338
6339
6340
6341
6342
6343
6344
  		    $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...
6345
  # check for c99 types like uint8_t used outside of uapi/ and tools/
e6176fa47   Joe Perches   checkpatch: add -...
6346
  		if ($realfile !~ m@\binclude/uapi/@ &&
fd39f904b   Tomas Winkler   checkpatch: don't...
6347
  		    $realfile !~ m@\btools/@ &&
e6176fa47   Joe Perches   checkpatch: add -...
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
  		    $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 ...
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
  # 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...
6384
6385
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6386
6387
6388
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
6389
  		}
66c80b607   Joe Perches   checkpatch: Add a...
6390
6391
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6392
6393
6394
6395
  			if (WARN("SIZEOF_PARENTHESIS",
  				 "sizeof $1 should be sizeof($1)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6396
  				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
6397
  			}
66c80b607   Joe Perches   checkpatch: Add a...
6398
  		}
88982fea5   Joe Perches   checkpatch: warn ...
6399
6400
6401
6402
6403
6404
  # 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...
6405
  # check for seq_printf uses that could be seq_puts
066687279   Joe Perches   checkpatch: updat...
6406
  		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d727   Joe Perches   checkpatch: Prefe...
6407
  			my $fmt = get_quoted_string($line, $rawline);
caac1d5fd   Heba Aamer   checkpatch: impro...
6408
6409
  			$fmt =~ s/%%//g;
  			if ($fmt !~ /%/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6410
6411
6412
6413
  				if (WARN("PREFER_SEQ_PUTS",
  					 "Prefer seq_puts to seq_printf
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6414
  					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc1   Joe Perches   checkpatch: add a...
6415
  				}
a6962d727   Joe Perches   checkpatch: Prefe...
6416
6417
  			}
  		}
478b17998   Joe Perches   checkpatch: impro...
6418
  # check for vsprintf extension %p<foo> misuses
5b57980de   Joe Perches   checkpatch: impro...
6419
  		if ($perl_version_ok &&
0b523769e   Joe Perches   checkpatch: add a...
6420
6421
6422
  		    defined $stat &&
  		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
  		    $1 !~ /^_*volatile_*$/) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6423
  			my $stat_real;
0b523769e   Joe Perches   checkpatch: add a...
6424
6425
6426
6427
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
  		        for (my $count = $linenr; $count <= $lc; $count++) {
ffe075132   Joe Perches   checkpatch: fix d...
6428
6429
  				my $specifier;
  				my $extension;
3bd32d6a2   Sakari Ailus   lib/vsprintf: Add...
6430
  				my $qualifier;
ffe075132   Joe Perches   checkpatch: fix d...
6431
  				my $bad_specifier = "";
0b523769e   Joe Perches   checkpatch: add a...
6432
6433
  				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
  				$fmt =~ s/%%//g;
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6434

3bd32d6a2   Sakari Ailus   lib/vsprintf: Add...
6435
  				while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6436
6437
  					$specifier = $1;
  					$extension = $2;
3bd32d6a2   Sakari Ailus   lib/vsprintf: Add...
6438
  					$qualifier = $3;
361b0d286   Linus Torvalds   Merge tag 'devpro...
6439
  					if ($extension !~ /[SsBKRraEehMmIiUDdgVCbGNOxtf]/ ||
3bd32d6a2   Sakari Ailus   lib/vsprintf: Add...
6440
6441
  					    ($extension eq "f" &&
  					     defined $qualifier && $qualifier !~ /^w/)) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
  						$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...
6455
  				}
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6456
6457
6458
6459
6460
  				if ($bad_specifier ne "") {
  					my $stat_real = get_stat_real($linenr, $lc);
  					my $ext_type = "Invalid";
  					my $use = "";
  					if ($bad_specifier =~ /p[Ff]/) {
e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6461
6462
6463
  						$use = " - use %pS instead";
  						$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
  					}
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6464

e3c6bc956   Tobin C. Harding   checkpatch: warn ...
6465
6466
6467
6468
6469
6470
  					WARN("VSPRINTF_POINTER_EXTENSION",
  					     "$ext_type vsprintf pointer extension '$bad_specifier'$use
  " . "$here
  $stat_real
  ");
  				}
0b523769e   Joe Perches   checkpatch: add a...
6471
6472
  			}
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
6473
  # Check for misused memsets
5b57980de   Joe Perches   checkpatch: impro...
6474
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6475
  		    defined $stat &&
9e20a8535   Mateusz Kulikowski   checkpatch: fix p...
6476
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6477
6478
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
6479
6480
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
6481

554e165cf   Andy Whitcroft   checkpatch: check...
6482
6483
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6484
6485
6486
6487
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
6488
6489
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
6490
6491
6492
6493
6494
6495
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
98a9bba51   Joe Perches   checkpatch: prefe...
6496
  # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6497
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
  #		    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...
6509

b6117d175   Mateusz Kulikowski   checkpatch: sugge...
6510
  # Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
5b57980de   Joe Perches   checkpatch: impro...
6511
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6512
6513
6514
6515
6516
6517
6518
6519
  #		    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...
6520

8617cd09b   Mateusz Kulikowski   checkpatch: sugge...
6521
6522
  # 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...
6523
  #		if ($perl_version_ok &&
f333195d4   Joe Perches   checkpatch: don't...
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
  #		    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...
6549

d7c76ba7e   Joe Perches   checkpatch: impro...
6550
  # typecasts on min/max could be min_t/max_t
5b57980de   Joe Perches   checkpatch: impro...
6551
  		if ($perl_version_ok &&
d1fe9c099   Joe Perches   checkpatch: add s...
6552
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
6553
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
6554
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6555
6556
6557
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
6558
6559
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
6560
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
6561
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
  					$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...
6573
6574
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
6575
  # check usleep_range arguments
5b57980de   Joe Perches   checkpatch: impro...
6576
  		if ($perl_version_ok &&
4a273195a   Joe Perches   checkpatch: check...
6577
6578
6579
6580
6581
6582
  		    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...
6583
6584
6585
6586
  				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst
  " . "$here
  $stat
  ");
4a273195a   Joe Perches   checkpatch: check...
6587
6588
6589
  			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
  				 $min > $max) {
  				WARN("USLEEP_RANGE",
458f69ef3   Mauro Carvalho Chehab   docs: timers: con...
6590
6591
6592
6593
  				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst
  " . "$here
  $stat
  ");
4a273195a   Joe Perches   checkpatch: check...
6594
6595
  			}
  		}
823b794ce   Joe Perches   checkpatch: add c...
6596
  # check for naked sscanf
5b57980de   Joe Perches   checkpatch: impro...
6597
  		if ($perl_version_ok &&
823b794ce   Joe Perches   checkpatch: add c...
6598
  		    defined $stat &&
6c8bd7076   Joe Perches   checkpatch: avoid...
6599
  		    $line =~ /\bsscanf\b/ &&
823b794ce   Joe Perches   checkpatch: add c...
6600
6601
6602
6603
6604
6605
  		    ($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...
6606
  			my $stat_real = get_stat_real($linenr, $lc);
823b794ce   Joe Perches   checkpatch: add c...
6607
6608
6609
6610
6611
6612
  			WARN("NAKED_SSCANF",
  			     "unchecked sscanf return value
  " . "$here
  $stat_real
  ");
  		}
afc819ab0   Joe Perches   checkpatch: prefe...
6613
  # check for simple sscanf that should be kstrto<foo>
5b57980de   Joe Perches   checkpatch: impro...
6614
  		if ($perl_version_ok &&
afc819ab0   Joe Perches   checkpatch: prefe...
6615
6616
6617
6618
6619
  		    defined $stat &&
  		    $line =~ /\bsscanf\b/) {
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
6620
  			my $stat_real = get_stat_real($linenr, $lc);
afc819ab0   Joe Perches   checkpatch: prefe...
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
  			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 ...
6634
6635
6636
  # check for new externs in .h files.
  		if ($realfile =~ /\.h$/ &&
  		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780d   Joe Perches   checkpatch: make ...
6637
6638
6639
  			if (CHK("AVOID_EXTERNS",
  				"extern prototypes should be avoided in .h files
  " . $herecurr) &&
70dc8a483   Joe Perches   checkpatch: warn ...
6640
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6641
  				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a483   Joe Perches   checkpatch: warn ...
6642
6643
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
6644
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
6645
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
6646
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
6647
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
6648
6649
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
6650
6651
6652
6653
6654
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
d8b44b58a   Kees Cook   checkpatch: Remov...
6655
  			if ($s =~ /^\s*;/)
c45dcabd2   Andy Whitcroft   update checkpatch...
6656
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6657
6658
6659
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6660
6661
6662
6663
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6664
6665
6666
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
6667
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6668
6669
6670
6671
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6672
6673
6674
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6675
  		}
a0ad75964   Joe Perches   checkpatch: impro...
6676
6677
  # check for function declarations that have arguments without identifier names
  		if (defined $stat &&
d8b44b58a   Kees Cook   checkpatch: Remov...
6678
6679
6680
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
  		    $1 ne "void") {
  			my $args = trim($1);
ca0d8929e   Joe Perches   checkpatch: add w...
6681
6682
  			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
  				my $arg = trim($1);
d8b44b58a   Kees Cook   checkpatch: Remov...
6683
  				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
ca0d8929e   Joe Perches   checkpatch: add w...
6684
6685
6686
6687
6688
6689
  					WARN("FUNCTION_ARGUMENTS",
  					     "function definition argument '$arg' should also have an identifier name
  " . $herecurr);
  				}
  			}
  		}
a0ad75964   Joe Perches   checkpatch: impro...
6690
  # check for function definitions
5b57980de   Joe Perches   checkpatch: impro...
6691
  		if ($perl_version_ok &&
a0ad75964   Joe Perches   checkpatch: impro...
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
  		    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...
6715
6716
6717
6718
6719
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6720
  				CHK("UNDOCUMENTED_SETUP",
2581ac7c2   Tim Froidcoeur   checkpatch: corre...
6721
6722
  				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.txt
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
6723
  			}
653d4876b   Andy Whitcroft   update checkpatch...
6724
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
6725

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

a640d25ce   Joe Perches   checkpatch: add -...
6733
6734
  # alloc style
  # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
5b57980de   Joe Perches   checkpatch: impro...
6735
  		if ($perl_version_ok &&
e29a70f15   Joe Perches   checkpatch: add s...
6736
  		    $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 -...
6737
6738
6739
6740
  			CHK("ALLOC_SIZEOF_STRUCT",
  			    "Prefer $3(sizeof(*$1)...) over $3($4...)
  " . $herecurr);
  		}
60a55369a   Joe Perches   checkpatch: add w...
6741
  # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
5b57980de   Joe Perches   checkpatch: impro...
6742
  		if ($perl_version_ok &&
1b4a2ed4c   Joe Perches   checkpatch: impro...
6743
6744
  		    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...
6745
6746
6747
6748
6749
  			my $oldfunc = $3;
  			my $a1 = $4;
  			my $a2 = $10;
  			my $newfunc = "kmalloc_array";
  			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a9   Joe Perches   checkpatch: emit ...
6750
6751
6752
6753
6754
6755
6756
6757
  			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...
6758
  				my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6759
  				my $herectx = get_stat_here($linenr, $cnt, $here);
60a55369a   Joe Perches   checkpatch: add w...
6760
  				if (WARN("ALLOC_WITH_MULTIPLY",
1b4a2ed4c   Joe Perches   checkpatch: impro...
6761
6762
6763
  					 "Prefer $newfunc over $oldfunc with multiply
  " . $herectx) &&
  				    $cnt == 1 &&
60a55369a   Joe Perches   checkpatch: add w...
6764
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6765
  					$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...
6766
6767
6768
  				}
  			}
  		}
972fdea2e   Joe Perches   checkpatch: add c...
6769
  # check for krealloc arg reuse
5b57980de   Joe Perches   checkpatch: impro...
6770
  		if ($perl_version_ok &&
4cab63cea   Joe Perches   checkpatch: fix k...
6771
6772
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
  		    $1 eq $3) {
972fdea2e   Joe Perches   checkpatch: add c...
6773
6774
6775
6776
  			WARN("KREALLOC_ARG_REUSE",
  			     "Reusing the krealloc arg is almost always a bug
  " . $herecurr);
  		}
5ce59ae0b   Joe Perches   checkpatch: Add c...
6777
6778
6779
6780
6781
6782
  # 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...
6783
6784
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
6785
6786
6787
6788
  			if (WARN("ONE_SEMICOLON",
  				 "Statements terminations use 1 semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
6789
  				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6790
  			}
d1e2ad07e   Joe Perches   checkpatch: add -...
6791
  		}
cec3aaa56   Tomas Winkler   checkpatch: don't...
6792
6793
6794
  # 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 -...
6795
6796
6797
6798
6799
6800
6801
6802
6803
  			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)/;
  			}
  		}
501612669   Joe Perches   checkpatch: add t...
6804
  # check for IS_ENABLED() without CONFIG_<FOO> ($rawline for comments too)
3e89ad850   Jerome Forissier   checkpatch: add -...
6805
  		if ($rawline =~ /\bIS_ENABLED\s*\(\s*(\w+)\s*\)/ && $1 !~ /^${CONFIG_}/) {
501612669   Joe Perches   checkpatch: add t...
6806
  			WARN("IS_ENABLED_CONFIG",
3e89ad850   Jerome Forissier   checkpatch: add -...
6807
6808
  			     "IS_ENABLED($1) is normally used as IS_ENABLED(${CONFIG_}$1)
  " . $herecurr);
501612669   Joe Perches   checkpatch: add t...
6809
  		}
2d6327459   Joe Perches   checkpatch: add P...
6810
  # check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
3e89ad850   Jerome Forissier   checkpatch: add -...
6811
  		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(${CONFIG_}[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
2d6327459   Joe Perches   checkpatch: add P...
6812
6813
  			my $config = $1;
  			if (WARN("PREFER_IS_ENABLED",
3e89ad850   Jerome Forissier   checkpatch: add -...
6814
6815
  				 "Prefer IS_ENABLED(<FOO>) to ${CONFIG_}<FOO> || ${CONFIG_}<FOO>_MODULE
  " . $herecurr) &&
2d6327459   Joe Perches   checkpatch: add P...
6816
6817
6818
6819
  			    $fix) {
  				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
  			}
  		}
f36d3eb89   Joe Perches   checkpatch: prefe...
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
  # check for /* fallthrough */ like comment, prefer fallthrough;
  		my @fallthroughs = (
  			'fallthrough',
  			'@fallthrough@',
  			'lint -fallthrough[ \t]*',
  			'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)',
  			'(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^
  \r]*)?',
  			'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^
  \r]*)?',
  			'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^
  \r]*)?',
  		    );
  		if ($raw_comment ne '') {
  			foreach my $ft (@fallthroughs) {
  				if ($raw_comment =~ /$ft/) {
  					my $msg_level = \&WARN;
  					$msg_level = \&CHK if ($file);
  					&{$msg_level}("PREFER_FALLTHROUGH",
  						      "Prefer 'fallthrough;' over fallthrough comment
  " . $herecurr);
  					last;
  				}
  			}
  		}
d1e2ad07e   Joe Perches   checkpatch: add -...
6845
  # check for switch/default statements without a break;
5b57980de   Joe Perches   checkpatch: impro...
6846
  		if ($perl_version_ok &&
d1e2ad07e   Joe Perches   checkpatch: add -...
6847
6848
  		    defined $stat &&
  		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
d1e2ad07e   Joe Perches   checkpatch: add -...
6849
  			my $cnt = statement_rawlines($stat);
e3d95a2a0   Tobin C. Harding   checkpatch: add s...
6850
  			my $herectx = get_stat_here($linenr, $cnt, $here);
d1e2ad07e   Joe Perches   checkpatch: add -...
6851
6852
6853
  			WARN("DEFAULT_NO_BREAK",
  			     "switch default: should use break
  " . $herectx);
caf2a54f1   Joe Perches   scripts/checkpatc...
6854
  		}
13214adf7   Andy Whitcroft   update checkpatch...
6855
  # check for gcc specific __FUNCTION__
d5e616fc1   Joe Perches   checkpatch: add a...
6856
6857
6858
6859
6860
  		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...
6861
  				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc1   Joe Perches   checkpatch: add a...
6862
  			}
13214adf7   Andy Whitcroft   update checkpatch...
6863
  		}
773647a09   Andy Whitcroft   update checkpatch...
6864

62ec818f5   Joe Perches   checkpatch: emit ...
6865
6866
6867
6868
6869
6870
  # 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 ...
6871
6872
6873
6874
6875
6876
  # 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...
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
  # 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...
6905
6906
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6907
6908
6909
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6910
  		}
6712d8585   Joe Perches   checkpatch: white...
6911

67d0a0754   Joe Perches   kernel.h/checkpat...
6912
6913
  # 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...
6914
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
6915
6916
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
6917
  		}
6712d8585   Joe Perches   checkpatch: white...
6918

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

3d709ab5a   Paul E. McKenney   checkpatch.pl: Su...
6926
6927
6928
6929
6930
6931
  # 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...
6932
6933
6934
6935
6936
6937
6938
6939
  # 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...
6940
  # check for various structs that are normally const (ops, kgdb, device_tree)
d9190e4e1   Joe Perches   checkpatch: avoid...
6941
  # and avoid what seem like struct definitions 'struct foo {'
ced69da1d   Quentin Monnet   checkpatch: fix C...
6942
6943
  		if (defined($const_structs) &&
  		    $line !~ /\bconst\b/ &&
d9190e4e1   Joe Perches   checkpatch: avoid...
6944
  		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6945
  			WARN("CONST_STRUCT",
d9190e4e1   Joe Perches   checkpatch: avoid...
6946
6947
  			     "struct $1 should normally be const
  " . $herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
6948
  		}
773647a09   Andy Whitcroft   update checkpatch...
6949
6950
6951
6952
  
  # 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...
6953
6954
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
6955
6956
6957
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
6958
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
6959
6960
6961
  			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...
6962
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
6963

52ea85061   Joe Perches   checkpatch: add t...
6964
6965
6966
6967
6968
6969
  # 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...
6970
  # likely/unlikely comparisons similar to "(likely(foo) > 0)"
5b57980de   Joe Perches   checkpatch: impro...
6971
  		if ($perl_version_ok &&
acd9362c2   Joe Perches   checkpatch: add l...
6972
6973
6974
6975
6976
  		    $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...
6977
6978
6979
6980
6981
6982
  # 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...
6983
6984
6985
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6986
6987
6988
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
6989
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
6990
6991
6992
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
6993
6994
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
6995

0f5225b02   Peter Zijlstra   locking/mutex, dr...
6996
6997
6998
6999
7000
7001
  # 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...
7002
7003
7004
7005
7006
7007
  # 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...
7008
7009
7010
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
7011
7012
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
7013

b392c64f5   Joe Perches   checkpatch: match...
7014
7015
  		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...
7016
7017
7018
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
7019
  		}
2435880fe   Joe Perches   checkpatch: add c...
7020

001804689   Joe Perches   checkpatch: add a...
7021
7022
7023
  # 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...
7024
  		if ($perl_version_ok &&
001804689   Joe Perches   checkpatch: add a...
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
  		    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...
7082
7083
  # 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...
7084
7085
7086
7087
  # 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...
7088
  		if ($perl_version_ok &&
459cf0ae5   Joe Perches   checkpatch: impro...
7089
  		    defined $stat &&
515a235ef   Joe Perches   checkpatch: impro...
7090
7091
7092
7093
  		    $line =~ /$mode_perms_search/) {
  			foreach my $entry (@mode_permission_funcs) {
  				my $func = $entry->[0];
  				my $arg_pos = $entry->[1];
459cf0ae5   Joe Perches   checkpatch: impro...
7094
7095
7096
  				my $lc = $stat =~ tr@
  @@;
  				$lc = $lc + $linenr;
2a9f9d851   Tobin C. Harding   checkpatch: add s...
7097
  				my $stat_real = get_stat_real($linenr, $lc);
459cf0ae5   Joe Perches   checkpatch: impro...
7098

515a235ef   Joe Perches   checkpatch: impro...
7099
7100
7101
7102
7103
  				my $skip_args = "";
  				if ($arg_pos > 1) {
  					$arg_pos--;
  					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
  				}
f90774e1f   Joe Perches   checkpatch: look ...
7104
  				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
459cf0ae5   Joe Perches   checkpatch: impro...
7105
  				if ($stat =~ /$test/) {
515a235ef   Joe Perches   checkpatch: impro...
7106
7107
  					my $val = $1;
  					$val = $6 if ($skip_args ne "");
73121534c   Joe Perches   checkpatch: ignor...
7108
7109
7110
  					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
  					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
  					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
515a235ef   Joe Perches   checkpatch: impro...
7111
  						ERROR("NON_OCTAL_PERMISSIONS",
459cf0ae5   Joe Perches   checkpatch: impro...
7112
7113
7114
  						      "Use 4 digit octal (0777) not decimal permissions
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
7115
7116
  					}
  					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
c0a5c8985   Joe Perches   checkpatch: impro...
7117
  						ERROR("EXPORTED_WORLD_WRITABLE",
459cf0ae5   Joe Perches   checkpatch: impro...
7118
7119
7120
  						      "Exporting writable files is usually an error. Consider more restrictive permissions.
  " . "$here
  " . $stat_real);
f90774e1f   Joe Perches   checkpatch: look ...
7121
  					}
2435880fe   Joe Perches   checkpatch: add c...
7122
7123
7124
  				}
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
7125

459cf0ae5   Joe Perches   checkpatch: impro...
7126
  # check for uses of S_<PERMS> that could be octal for readability
bc22d9a7d   Joe Perches   checkpatch: test ...
7127
  		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
001804689   Joe Perches   checkpatch: add a...
7128
7129
  			my $oval = $1;
  			my $octal = perms_to_octal($oval);
459cf0ae5   Joe Perches   checkpatch: impro...
7130
7131
7132
7133
  			if (WARN("SYMBOLIC_PERMS",
  				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.
  " . $herecurr) &&
  			    $fix) {
001804689   Joe Perches   checkpatch: add a...
7134
  				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
459cf0ae5   Joe Perches   checkpatch: impro...
7135
7136
  			}
  		}
5a6d20ce1   Bjorn Andersson   checkpatch: valid...
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
  # 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...
7155
7156
7157
7158
7159
7160
7161
  
  # 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...
7162
7163
7164
7165
7166
7167
  	}
  
  	# 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...
7168
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
  	# 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...
7180
  	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
7181
7182
7183
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
7184
  	}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
7185
7186
7187
7188
7189
  	if ($is_patch && $has_commit_log && $chk_signoff) {
  		if ($signoff == 0) {
  			ERROR("MISSING_SIGN_OFF",
  			      "Missing Signed-off-by: line(s)
  ");
48ca2d8ac   Dwaipayan Ray   checkpatch: add n...
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
  		} elsif ($authorsignoff != 1) {
  			# authorsignoff values:
  			# 0 -> missing sign off
  			# 1 -> sign off identical
  			# 2 -> names and addresses match, comments mismatch
  			# 3 -> addresses match, names different
  			# 4 -> names match, addresses different
  			# 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match
  
  			my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'";
  
  			if ($authorsignoff == 0) {
  				ERROR("NO_AUTHOR_SIGN_OFF",
  				      "Missing Signed-off-by: line by nominal patch author '$author'
  ");
  			} elsif ($authorsignoff == 2) {
  				CHK("FROM_SIGN_OFF_MISMATCH",
  				    "From:/Signed-off-by: email comments mismatch: $sob_msg
  ");
  			} elsif ($authorsignoff == 3) {
  				WARN("FROM_SIGN_OFF_MISMATCH",
  				     "From:/Signed-off-by: email name mismatch: $sob_msg
  ");
  			} elsif ($authorsignoff == 4) {
  				WARN("FROM_SIGN_OFF_MISMATCH",
  				     "From:/Signed-off-by: email address mismatch: $sob_msg
  ");
  			} elsif ($authorsignoff == 5) {
  				WARN("FROM_SIGN_OFF_MISMATCH",
  				     "From:/Signed-off-by: email subaddress mismatch: $sob_msg
  ");
  			}
cd2614967   Geert Uytterhoeven   checkpatch: warn ...
7222
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
7223
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
7224
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
7225
7226
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
7227
7228
7229
7230
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
7231
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
7232

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
7233
  	if ($quiet == 0) {
ef2121963   Joe Perches   checkpatch: adver...
7234
7235
7236
7237
7238
7239
7240
7241
  		# 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...
7242
7243
7244
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
b0781216e   Mike Frysinger   scripts/checkpatc...
7245
  			$rpt_cleaners = 0;
d8469f162   Joe Perches   checkpatch: impro...
7246
7247
7248
7249
7250
  			print << "EOM"
  
  NOTE: Whitespace errors detected.
        You may wish to use scripts/cleanpatch or scripts/cleanfile
  EOM
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
7251
7252
  		}
  	}
d752fcc88   Joe Perches   checkpatch: add a...
7253
7254
7255
  	if ($clean == 0 && $fix &&
  	    ("@rawlines" ne "@fixed" ||
  	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d65   Joe Perches   checkpatch: add a...
7256
7257
  		my $newfile = $filename;
  		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5bc   Joe Perches   checkpatch: creat...
7258
7259
  		my $linecount = 0;
  		my $f;
d752fcc88   Joe Perches   checkpatch: add a...
7260
  		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
3705ce5bc   Joe Perches   checkpatch: creat...
7261
7262
7263
7264
7265
7266
7267
7268
  		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...
7269
7270
  					print $f $fixed_line . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
  				}
  			} else {
  				print $f $fixed_line . "
  ";
  			}
  		}
  		close($f);
  
  		if (!$quiet) {
  			print << "EOM";
d8469f162   Joe Perches   checkpatch: impro...
7281

3705ce5bc   Joe Perches   checkpatch: creat...
7282
7283
7284
7285
7286
7287
7288
  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...
7289
7290
7291
  EOM
  		}
  	}
d8469f162   Joe Perches   checkpatch: impro...
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
  	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...
7302
7303
7304
  	}
  	return $clean;
  }