Blame view

scripts/checkpatch.pl 160 KB
0a920b5b6   Andy Whitcroft   add a trivial pat...
1
  #!/usr/bin/perl -w
dbf004d78   Dave Jones   remove my email a...
2
  # (c) 2001, Dave Jones. (the file handling bit)
00df344fd   Andy Whitcroft   update checkpatch...
3
  # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
2a5a2c252   Andy Whitcroft   checkpatch: updat...
4
  # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
015830be9   Andy Whitcroft   checkpatch: updat...
5
  # (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
0a920b5b6   Andy Whitcroft   add a trivial pat...
6
7
8
  # Licensed under the terms of the GNU GPL License version 2
  
  use strict;
c707a81de   Joe Perches   checkpatch: make ...
9
  use POSIX;
36061e380   Joe Perches   checkpatch: fix u...
10
11
  use File::Basename;
  use Cwd 'abs_path';
0a920b5b6   Andy Whitcroft   add a trivial pat...
12
13
  
  my $P = $0;
36061e380   Joe Perches   checkpatch: fix u...
14
  my $D = dirname(abs_path($P));
0a920b5b6   Andy Whitcroft   add a trivial pat...
15

000d1cc18   Joe Perches   checkpatch.pl: ad...
16
  my $V = '0.32';
0a920b5b6   Andy Whitcroft   add a trivial pat...
17
18
19
20
21
22
23
  
  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...
24
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
25
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
26
  my $terse = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
27
28
  my $file = 0;
  my $check = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
29
  my $check_orig = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
30
31
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
32
  my $summary_file = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
33
  my $show_types = 0;
3705ce5bc   Joe Perches   checkpatch: creat...
34
  my $fix = 0;
9624b8d65   Joe Perches   checkpatch: add a...
35
  my $fix_inplace = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
36
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
37
  my %debug;
3445686af   Joe Perches   checkpatch: ignor...
38
  my %camelcase = ();
91bfe4843   Joe Perches   checkpatch: add -...
39
40
41
  my %use_type = ();
  my @use = ();
  my %ignore_type = ();
000d1cc18   Joe Perches   checkpatch.pl: ad...
42
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
43
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
44
  my $configuration_file = ".checkpatch.conf";
6cd7f3869   Joe Perches   checkpatch: allow...
45
  my $max_line_length = 80;
d62a201f2   Dave Hansen   checkpatch: enfor...
46
47
  my $ignore_perl_version = 0;
  my $minimum_perl_version = 5.10.0;
56193274e   Vadim Bendebury   checkpatch: allow...
48
  my $min_conf_desc_length = 4;
66b47b4a9   Kees Cook   checkpatch: look ...
49
  my $spelling_file = "$D/spelling.txt";
ebfd7d623   Joe Perches   checkpatch: add o...
50
51
  my $codespell = 0;
  my $codespellfile = "/usr/local/share/codespell/dictionary.txt";
77f5b10a8   Hannes Eder   checkpatch: make ...
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  
  sub help {
  	my ($exitcode) = @_;
  
  	print << "EOM";
  Usage: $P [OPTION]... [FILE]...
  Version: $V
  
  Options:
    -q, --quiet                quiet
    --no-tree                  run without a kernel tree
    --no-signoff               do not check for 'Signed-off-by' line
    --patch                    treat FILE as patchfile (default)
    --emacs                    emacs compile window format
    --terse                    one line per report
    -f, --file                 treat FILE as regular source file
    --subjective, --strict     enable more subjective tests
91bfe4843   Joe Perches   checkpatch: add -...
69
    --types TYPE(,TYPE2...)    show only these comma separated message types
000d1cc18   Joe Perches   checkpatch.pl: ad...
70
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
6cd7f3869   Joe Perches   checkpatch: allow...
71
    --max-line-length=n        set the maximum line length, if exceeded, warn
56193274e   Vadim Bendebury   checkpatch: allow...
72
    --min-conf-desc-length=n   set the min description length, if shorter, warn
000d1cc18   Joe Perches   checkpatch.pl: ad...
73
    --show-types               show the message "types" in the output
77f5b10a8   Hannes Eder   checkpatch: make ...
74
75
76
77
78
79
80
81
82
    --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...
83
84
85
86
87
    --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...
88
89
90
    --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...
91
92
    --ignore-perl-version      override checking of perl version.  expect
                               runtime errors.
ebfd7d623   Joe Perches   checkpatch: add o...
93
94
95
    --codespell                Use the codespell dictionary for spelling/typos
                               (default:/usr/local/share/codespell/dictionary.txt)
    --codespellfile            Use this codespell dictionary
77f5b10a8   Hannes Eder   checkpatch: make ...
96
97
98
99
100
101
102
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  my $conf = which_conf($configuration_file);
  if (-f $conf) {
  	my @conf_args;
  	open(my $conffile, '<', "$conf")
  	    or warn "$P: Can't find a readable $configuration_file file $!
  ";
  
  	while (<$conffile>) {
  		my $line = $_;
  
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
  		$line =~ s/\s+/ /g;
  
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my @words = split(" ", $line);
  		foreach my $word (@words) {
  			last if ($word =~ m/^#/);
  			push (@conf_args, $word);
  		}
  	}
  	close($conffile);
  	unshift(@ARGV, @conf_args) if @conf_args;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
130
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
131
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
132
133
134
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
135
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
136
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
137
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
138
139
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
140
  	'ignore=s'	=> \@ignore,
91bfe4843   Joe Perches   checkpatch: add -...
141
  	'types=s'	=> \@use,
000d1cc18   Joe Perches   checkpatch.pl: ad...
142
  	'show-types!'	=> \$show_types,
6cd7f3869   Joe Perches   checkpatch: allow...
143
  	'max-line-length=i' => \$max_line_length,
56193274e   Vadim Bendebury   checkpatch: allow...
144
  	'min-conf-desc-length=i' => \$min_conf_desc_length,
6c72ffaab   Andy Whitcroft   update checkpatch...
145
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
146
147
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
148
  	'summary-file!'	=> \$summary_file,
3705ce5bc   Joe Perches   checkpatch: creat...
149
  	'fix!'		=> \$fix,
9624b8d65   Joe Perches   checkpatch: add a...
150
  	'fix-inplace!'	=> \$fix_inplace,
d62a201f2   Dave Hansen   checkpatch: enfor...
151
  	'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0df   Andy Whitcroft   update checkpatch...
152
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
153
  	'test-only=s'	=> \$tst_only,
ebfd7d623   Joe Perches   checkpatch: add o...
154
155
  	'codespell!'	=> \$codespell,
  	'codespellfile=s'	=> \$codespellfile,
77f5b10a8   Hannes Eder   checkpatch: make ...
156
157
158
159
160
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
161

9624b8d65   Joe Perches   checkpatch: add a...
162
  $fix = 1 if ($fix_inplace);
2ac73b4f6   Joe Perches   checkpatch: make ...
163
  $check_orig = $check;
9624b8d65   Joe Perches   checkpatch: add a...
164

0a920b5b6   Andy Whitcroft   add a trivial pat...
165
  my $exit = 0;
d62a201f2   Dave Hansen   checkpatch: enfor...
166
167
168
169
170
171
172
  if ($^V && $^V lt $minimum_perl_version) {
  	printf "$P: requires at least perl version %vd
  ", $minimum_perl_version;
  	if (!$ignore_perl_version) {
  		exit(1);
  	}
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
173
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
174
175
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
176
177
  	exit(1);
  }
91bfe4843   Joe Perches   checkpatch: add -...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  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...
195

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

58cb3cf66   Joe Perches   checkpatch: fix p...
199
  	if ($quiet == 0 && keys %$hashRef) {
91bfe4843   Joe Perches   checkpatch: add -...
200
  		print "NOTE: $prefix message types:";
58cb3cf66   Joe Perches   checkpatch: fix p...
201
  		foreach my $word (sort keys %$hashRef) {
91bfe4843   Joe Perches   checkpatch: add -...
202
203
204
205
206
207
  			print " $word";
  		}
  		print "
  
  ";
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
208
  }
91bfe4843   Joe Perches   checkpatch: add -...
209
210
  hash_save_array_words(\%ignore_type, \@ignore);
  hash_save_array_words(\%use_type, \@use);
c2fdda0df   Andy Whitcroft   update checkpatch...
211
212
  my $dbg_values = 0;
  my $dbg_possible = 0;
7429c6903   Andy Whitcroft   checkpatch: impro...
213
  my $dbg_type = 0;
a1ef277e2   Andy Whitcroft   checkpatch: add t...
214
  my $dbg_attr = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
215
  for my $key (keys %debug) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
216
217
218
  	## no critic
  	eval "\${dbg_$key} = '$debug{$key}';";
  	die "$@" if ($@);
c2fdda0df   Andy Whitcroft   update checkpatch...
219
  }
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
220
  my $rpt_cleaners = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
221
222
223
224
  if ($terse) {
  	$emacs = 1;
  	$quiet++;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
  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...
245
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
246
  my $emitted_corrupt = 0;
2ceb532b0   Andy Whitcroft   checkpatch: fix f...
247
248
249
250
  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...
251
252
253
254
255
256
257
258
  our $Storage	= qr{extern|static|asmlinkage};
  our $Sparse	= qr{
  			__user|
  			__kernel|
  			__force|
  			__iomem|
  			__must_check|
  			__init_refok|
417495eda   Andy Whitcroft   checkpatch: add _...
259
  			__kprobes|
165e72a6c   Sven Eckelmann   checkpatch: add _...
260
261
  			__ref|
  			__rcu
6c72ffaab   Andy Whitcroft   update checkpatch...
262
  		}x;
e970b8846   Joe Perches   checkpatch: add r...
263
264
265
266
267
  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...
268

52131292c   Wolfram Sang   checkpatch: fix f...
269
270
  # Notes to $Attribute:
  # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaab   Andy Whitcroft   update checkpatch...
271
272
  our $Attribute	= qr{
  			const|
03f1df7da   Joe Perches   checkpatch: Add a...
273
274
275
276
277
278
279
280
281
282
283
284
  			__percpu|
  			__nocast|
  			__safe|
  			__bitwise__|
  			__packed__|
  			__packed2__|
  			__naked|
  			__maybe_unused|
  			__always_unused|
  			__noreturn|
  			__used|
  			__cold|
e23ef1f33   Joe Perches   checkpatch: ignor...
285
  			__pure|
03f1df7da   Joe Perches   checkpatch: Add a...
286
287
  			__noclone|
  			__deprecated|
6c72ffaab   Andy Whitcroft   update checkpatch...
288
289
  			__read_mostly|
  			__kprobes|
8716de383   Joe Perches   checkpatch: add t...
290
  			$InitAttribute|
24e1d81ac   Andy Whitcroft   checkpatch: ____c...
291
292
  			____cacheline_aligned|
  			____cacheline_aligned_in_smp|
5fe3af119   Andy Whitcroft   checkpatch: __wea...
293
294
  			____cacheline_internodealigned_in_smp|
  			__weak
6c72ffaab   Andy Whitcroft   update checkpatch...
295
  		  }x;
c45dcabd2   Andy Whitcroft   update checkpatch...
296
  our $Modifier;
91cb5195f   Joe Perches   checkpatch: expan...
297
  our $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
6c72ffaab   Andy Whitcroft   update checkpatch...
298
299
  our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
  our $Lval	= qr{$Ident(?:$Member)*};
95e2c6023   Joe Perches   checkpatch: warn ...
300
301
302
303
  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...
304
  our $Octal	= qr{0[0-7]+$Int_type?};
c0a5c8985   Joe Perches   checkpatch: impro...
305
  our $String	= qr{"[X\t]*"};
326b1ffc1   Joe Perches   checkpatch: fix $...
306
307
308
  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...
309
  our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
2435880fe   Joe Perches   checkpatch: add c...
310
  our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
326b1ffc1   Joe Perches   checkpatch: fix $...
311
  our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
447432f32   Joe Perches   checkpatch: fix j...
312
  our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
23f780c90   Joe Perches   checkpatch: impro...
313
  our $Arithmetic = qr{\+|-|\*|\/|%};
6c72ffaab   Andy Whitcroft   update checkpatch...
314
315
316
  our $Operators	= qr{
  			<=|>=|==|!=|
  			=>|->|<<|>>|<|>|!|~|
23f780c90   Joe Perches   checkpatch: impro...
317
  			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
6c72ffaab   Andy Whitcroft   update checkpatch...
318
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
319
  our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
ab7e23f34   Joe Perches   checkpatch: add t...
320
  our $BasicType;
8905a67c6   Andy Whitcroft   update checkpatch...
321
  our $NonptrType;
1813087db   Joe Perches   checkpatch: add t...
322
  our $NonptrTypeMisordered;
8716de383   Joe Perches   checkpatch: add t...
323
  our $NonptrTypeWithAttr;
8905a67c6   Andy Whitcroft   update checkpatch...
324
  our $Type;
1813087db   Joe Perches   checkpatch: add t...
325
  our $TypeMisordered;
8905a67c6   Andy Whitcroft   update checkpatch...
326
  our $Declare;
1813087db   Joe Perches   checkpatch: add t...
327
  our $DeclareMisordered;
8905a67c6   Andy Whitcroft   update checkpatch...
328

15662b3e8   Joe Perches   checkpatch: add a...
329
330
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
331
332
333
334
335
336
337
  	|  \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...
338
339
340
341
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
021158b4c   Joe Perches   checkpatch: add t...
342
343
344
345
  our $typeOtherOSTypedefs = qr{(?x:
  	u_(?:char|short|int|long) |          # bsd
  	u(?:nchar|short|int|long)            # sysv
  )};
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
346
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
347
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
348
349
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
350
  our $logFunctions = qr{(?x:
6e60c02e9   Joe Perches   checkpatch.pl: up...
351
  	printk(?:_ratelimited|_once|)|
7d0b6594e   Jacob Keller   checkpatch: allow...
352
  	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
6e60c02e9   Joe Perches   checkpatch.pl: up...
353
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
354
  	panic|
066687279   Joe Perches   checkpatch: updat...
355
356
  	MODULE_[A-Z_]+|
  	seq_vprintf|seq_printf|seq_puts
691e669ba   Joe Perches   checkpatch.pl: al...
357
  )};
201124755   Joe Perches   checkpatch: valid...
358
359
360
361
362
363
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
8543ae129   Mugunthan V N   checkpatch: add S...
364
  	Suggested-by:|
201124755   Joe Perches   checkpatch: valid...
365
366
367
  	To:|
  	Cc:
  )};
1813087db   Joe Perches   checkpatch: add t...
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
  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...
386
387
  our @typeList = (
  	qr{void},
0c773d9d6   Joe Perches   checkpatch: add s...
388
389
390
391
392
393
394
395
396
  	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...
397
398
399
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
400
401
402
403
404
405
  	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...
406
  	@typeListMisordered,
8905a67c6   Andy Whitcroft   update checkpatch...
407
  );
8716de383   Joe Perches   checkpatch: add t...
408
409
410
411
412
  our @typeListWithAttr = (
  	@typeList,
  	qr{struct\s+$InitAttribute\s+$Ident},
  	qr{union\s+$InitAttribute\s+$Ident},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
413
414
415
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
416

2435880fe   Joe Perches   checkpatch: add c...
417
418
419
420
421
422
423
424
  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],
  	["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
  );
515a235ef   Joe Perches   checkpatch: impro...
425
426
427
428
429
430
  #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];
  }
b392c64f5   Joe Perches   checkpatch: match...
431
432
433
434
435
436
437
  our $mode_perms_world_writable = qr{
  	S_IWUGO		|
  	S_IWOTH		|
  	S_IRWXUGO	|
  	S_IALLUGO	|
  	0[0-7][0-7][2367]
  }x;
7840a94cd   Wolfram Sang   checkpatch: refac...
438
439
  our $allowed_asm_includes = qr{(?x:
  	irq|
cdcee686e   Sergey Ryazanov   checkpatch: updat...
440
441
442
  	memory|
  	time|
  	reboot
7840a94cd   Wolfram Sang   checkpatch: refac...
443
444
  )};
  # memory.h: ARM has a custom one
66b47b4a9   Kees Cook   checkpatch: look ...
445
446
  # Load common spelling mistakes and build regular expression list.
  my $misspellings;
66b47b4a9   Kees Cook   checkpatch: look ...
447
  my %spelling_fix;
66b47b4a9   Kees Cook   checkpatch: look ...
448

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

36061e380   Joe Perches   checkpatch: fix u...
453
454
455
  		$line =~ s/\s*
  ?$//g;
  		$line =~ s/^\s*//g;
66b47b4a9   Kees Cook   checkpatch: look ...
456

36061e380   Joe Perches   checkpatch: fix u...
457
458
459
460
  		next if ($line =~ m/^\s*#/);
  		next if ($line =~ m/^\s*$/);
  
  		my ($suspect, $fix) = split(/\|\|/, $line);
66b47b4a9   Kees Cook   checkpatch: look ...
461

36061e380   Joe Perches   checkpatch: fix u...
462
463
464
  		$spelling_fix{$suspect} = $fix;
  	}
  	close($spelling);
36061e380   Joe Perches   checkpatch: fix u...
465
466
467
  } else {
  	warn "No typos will be found - file '$spelling_file': $!
  ";
66b47b4a9   Kees Cook   checkpatch: look ...
468
  }
66b47b4a9   Kees Cook   checkpatch: look ...
469

ebfd7d623   Joe Perches   checkpatch: add o...
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
  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;
8905a67c6   Andy Whitcroft   update checkpatch...
497
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
498
499
500
501
502
503
504
505
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
1813087db   Joe Perches   checkpatch: add t...
506
507
508
509
  	my $Misordered = "(?x:  
  " . join("|
    ", @typeListMisordered) . "
  )";
8716de383   Joe Perches   checkpatch: add t...
510
511
512
513
  	my $allWithAttr = "(?x:  
  " . join("|
    ", @typeListWithAttr) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
514
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
ab7e23f34   Joe Perches   checkpatch: add t...
515
516
517
518
519
  	$BasicType	= qr{
  				(?:$typeOtherOSTypedefs\b)|
  				(?:$typeTypedefs\b)|
  				(?:${all}\b)
  		}x;
8905a67c6   Andy Whitcroft   update checkpatch...
520
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
521
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
522
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
523
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
021158b4c   Joe Perches   checkpatch: add t...
524
  				(?:$typeOtherOSTypedefs\b)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
525
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
526
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
527
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
528
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
529
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
530
531
532
533
534
535
536
  	$NonptrTypeMisordered	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:${Misordered}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8716de383   Joe Perches   checkpatch: add t...
537
538
539
540
541
  	$NonptrTypeWithAttr	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
  				(?:$typeTypedefs\b)|
021158b4c   Joe Perches   checkpatch: add t...
542
  				(?:$typeOtherOSTypedefs\b)|
8716de383   Joe Perches   checkpatch: add t...
543
544
545
546
  				(?:${allWithAttr}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
547
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
548
  			$NonptrType
1574a29f8   Joe Perches   checkpatch: allow...
549
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
550
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
551
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
552
553
554
555
556
  	$TypeMisordered	= qr{
  			$NonptrTypeMisordered
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
  			(?:\s+$Inline|\s+$Modifier)*
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
557
  	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087db   Joe Perches   checkpatch: add t...
558
  	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c6   Andy Whitcroft   update checkpatch...
559
560
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
561

7d2367af0   Joe Perches   checkpatch: sugge...
562
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
563
564
565
566
567
568
  
  # 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...
569
  our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
c0a5c8985   Joe Perches   checkpatch: impro...
570
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7d2367af0   Joe Perches   checkpatch: sugge...
571

f84223087   Joe Perches   checkpatch: updat...
572
573
574
575
576
  our $declaration_macros = qr{(?x:
  	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,2}\s*\(|
  	(?:$Storage\s+)?LIST_HEAD\s*\(|
  	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
  )};
7d2367af0   Joe Perches   checkpatch: sugge...
577
578
579
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
5b9553abf   Joe Perches   checkpatch: make ...
580
581
582
583
584
  
  	while ($string =~ /^\s*\(.*\)\s*$/) {
  		$string =~ s@^\s*\(\s*@@;
  		$string =~ s@\s*\)\s*$@@;
  	}
7d2367af0   Joe Perches   checkpatch: sugge...
585
  	$string =~ s@\s+@ @g;
5b9553abf   Joe Perches   checkpatch: make ...
586

7d2367af0   Joe Perches   checkpatch: sugge...
587
588
  	return $string;
  }
3445686af   Joe Perches   checkpatch: ignor...
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
  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 ...
609
610
611
  		} 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...
612
613
614
615
616
617
618
619
620
621
  			$camelcase{$1} = 1;
  		}
  	}
  }
  
  my $camelcase_seeded = 0;
  sub seed_camelcase_includes {
  	return if ($camelcase_seeded);
  
  	my $files;
c707a81de   Joe Perches   checkpatch: make ...
622
623
624
625
  	my $camelcase_cache = "";
  	my @include_files = ();
  
  	$camelcase_seeded = 1;
351b2a1fe   Joe Perches   checkpatch: cache...
626

3645e3283   Richard Genoud   checkpatch: fix d...
627
  	if (-e ".git") {
351b2a1fe   Joe Perches   checkpatch: cache...
628
629
  		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
  		chomp $git_last_include_commit;
c707a81de   Joe Perches   checkpatch: make ...
630
  		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686af   Joe Perches   checkpatch: ignor...
631
  	} else {
c707a81de   Joe Perches   checkpatch: make ...
632
  		my $last_mod_date = 0;
3445686af   Joe Perches   checkpatch: ignor...
633
  		$files = `find $root/include -name "*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
  		@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...
655
  	}
c707a81de   Joe Perches   checkpatch: make ...
656

3645e3283   Richard Genoud   checkpatch: fix d...
657
  	if (-e ".git") {
c707a81de   Joe Perches   checkpatch: make ...
658
659
660
661
  		$files = `git ls-files "include/*.h"`;
  		@include_files = split('
  ', $files);
  	}
3445686af   Joe Perches   checkpatch: ignor...
662
663
664
  	foreach my $file (@include_files) {
  		seed_camelcase_file($file);
  	}
351b2a1fe   Joe Perches   checkpatch: cache...
665

c707a81de   Joe Perches   checkpatch: make ...
666
  	if ($camelcase_cache ne "") {
351b2a1fe   Joe Perches   checkpatch: cache...
667
  		unlink glob ".checkpatch-camelcase.*";
c707a81de   Joe Perches   checkpatch: make ...
668
669
670
  		open(my $camelcase_file, '>', "$camelcase_cache")
  		    or warn "$P: Can't write '$camelcase_cache' $!
  ";
351b2a1fe   Joe Perches   checkpatch: cache...
671
672
673
674
675
676
  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
  			print $camelcase_file ("$_
  ");
  		}
  		close($camelcase_file);
  	}
3445686af   Joe Perches   checkpatch: ignor...
677
  }
d311cd445   Joe Perches   checkpatch: add t...
678
679
680
681
682
683
684
685
686
  sub git_commit_info {
  	my ($commit, $id, $desc) = @_;
  
  	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
  
  	my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
  	$output =~ s/^\s*//gm;
  	my @lines = split("
  ", $output);
0d7835fca   Joe Perches   checkpatch: updat...
687
  	return ($id, $desc) if ($#lines < 0);
d311cd445   Joe Perches   checkpatch: add t...
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
  	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
  # Maybe one day convert this block of bash into something that returns
  # all matching commit ids, but it's very slow...
  #
  #		echo "checking commits $1..."
  #		git rev-list --remotes | grep -i "^$1" |
  #		while read line ; do
  #		    git log --format='%H %s' -1 $line |
  #		    echo "commit $(cut -c 1-12,41-)"
  #		done
  	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
  	} else {
  		$id = substr($lines[0], 0, 12);
  		$desc = substr($lines[0], 41);
  	}
  
  	return ($id, $desc);
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
706
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
707
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
708
  my @lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
709
  my @fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
710
711
  my @fixed_inserted = ();
  my @fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
712
  my $fixlinenr = -1;
c2fdda0df   Andy Whitcroft   update checkpatch...
713
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
714
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
715
  	my $FILE;
6c72ffaab   Andy Whitcroft   update checkpatch...
716
  	if ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
717
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
718
719
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
720
721
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
722
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
723
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
724
725
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
726
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
727
728
729
730
731
  	if ($filename eq '-') {
  		$vname = 'Your patch';
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
732
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
733
734
735
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
736
  	close($FILE);
c2fdda0df   Andy Whitcroft   update checkpatch...
737
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
738
739
740
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
741
  	@lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
742
  	@fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
743
744
  	@fixed_inserted = ();
  	@fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
745
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
746
747
748
749
750
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
751
752
753
754
755
756
757
758
759
760
761
762
  	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...
763
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
764
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
765
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
766

201124755   Joe Perches   checkpatch: valid...
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
  sub parse_email {
  	my ($formatted_email) = @_;
  
  	my $name = "";
  	my $address = "";
  	my $comment = "";
  
  	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
  		$name = $1;
  		$address = $2;
  		$comment = $3 if defined $3;
  	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
  		$address = $1;
  		$comment = $2 if defined $2;
  		$formatted_email =~ s/$address.*$//;
  		$name = $formatted_email;
3705ce5bc   Joe Perches   checkpatch: creat...
786
  		$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
787
788
789
790
791
792
793
794
795
796
797
798
799
  		$name =~ s/^\"|\"$//g;
  		# If there's a name left after stripping spaces and
  		# leading quotes, and the address doesn't have both
  		# leading and trailing angle brackets, the address
  		# is invalid. ie:
  		#   "joe smith joe@smith.com" bad
  		#   "joe smith <joe@smith.com" bad
  		if ($name ne "" && $address !~ /^<[^>]+>$/) {
  			$name = "";
  			$address = "";
  			$comment = "";
  		}
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
800
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
801
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
802
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
803
804
805
806
807
808
809
810
811
812
813
814
815
816
  	$address =~ s/^\<|\>$//g;
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	return ($name, $address, $comment);
  }
  
  sub format_email {
  	my ($name, $address) = @_;
  
  	my $formatted_email;
3705ce5bc   Joe Perches   checkpatch: creat...
817
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
818
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
819
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
820
821
822
823
824
825
826
827
828
829
830
831
832
833
  
  	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
  		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
  		$name = "\"$name\"";
  	}
  
  	if ("$name" eq "") {
  		$formatted_email = "$address";
  	} else {
  		$formatted_email = "$name <$address>";
  	}
  
  	return $formatted_email;
  }
d311cd445   Joe Perches   checkpatch: add t...
834
  sub which {
bd474ca07   Joe Perches   checkpatch: use t...
835
  	my ($bin) = @_;
d311cd445   Joe Perches   checkpatch: add t...
836

bd474ca07   Joe Perches   checkpatch: use t...
837
838
839
840
  	foreach my $path (split(/:/, $ENV{PATH})) {
  		if (-e "$path/$bin") {
  			return "$path/$bin";
  		}
d311cd445   Joe Perches   checkpatch: add t...
841
  	}
d311cd445   Joe Perches   checkpatch: add t...
842

bd474ca07   Joe Perches   checkpatch: use t...
843
  	return "";
d311cd445   Joe Perches   checkpatch: add t...
844
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
845
846
847
848
849
850
851
852
853
854
855
  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...
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
  sub expand_tabs {
  	my ($str) = @_;
  
  	my $res = '';
  	my $n = 0;
  	for my $c (split(//, $str)) {
  		if ($c eq "\t") {
  			$res .= ' ';
  			$n++;
  			for (; ($n % 8) != 0; $n++) {
  				$res .= ' ';
  			}
  			next;
  		}
  		$res .= $c;
  		$n++;
  	}
  
  	return $res;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
876
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
877
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
878
879
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
880

4a0df2ef4   Andy Whitcroft   update checkpatch...
881
882
883
884
885
886
887
888
889
890
891
892
  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...
893
894
895
896
897
898
899
900
901
902
903
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
904
905
906
907
908
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
909
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
910
911
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
912

773647a09   Andy Whitcroft   update checkpatch...
913
914
915
916
917
918
919
920
921
922
923
924
925
926
  	# Always copy over the diff marker.
  	$res = substr($line, 0, 1);
  
  	for ($off = 1; $off < length($line); $off++) {
  		$c = substr($line, $off, 1);
  
  		# Comments we are wacking completly including the begin
  		# and end, all to $;.
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
  			$sanitise_quote = '*/';
  
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
00df344fd   Andy Whitcroft   update checkpatch...
927
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
928
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
929
930
931
932
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
933
  		}
113f04a83   Daniel Walker   checkpatch: handl...
934
935
936
937
938
939
940
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
941
942
943
944
945
946
947
  
  		# 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...
948
  		}
773647a09   Andy Whitcroft   update checkpatch...
949
950
951
952
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
953

773647a09   Andy Whitcroft   update checkpatch...
954
955
956
957
958
959
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
960

fae17daed   Andy Whitcroft   checkpatch: comme...
961
962
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
963
964
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
965
966
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
967
968
969
970
971
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
972
  	}
113f04a83   Daniel Walker   checkpatch: handl...
973
974
975
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
976
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
977
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
978
979
980
981
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
982
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
983
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
984
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
985
  	}
00df344fd   Andy Whitcroft   update checkpatch...
986
987
  	return $res;
  }
a6962d727   Joe Perches   checkpatch: Prefe...
988
989
  sub get_quoted_string {
  	my ($line, $rawline) = @_;
5e4f6ba5e   Joe Perches   checkpatch: add a...
990
  	return "" if ($line !~ m/(\"[X\t]+\")/g);
a6962d727   Joe Perches   checkpatch: Prefe...
991
992
  	return substr($rawline, $-[0], $+[0] - $-[0]);
  }
8905a67c6   Andy Whitcroft   update checkpatch...
993
994
995
996
997
998
  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...
999
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1000

13214adf7   Andy Whitcroft   update checkpatch...
1001
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
1002
1003
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
1004
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
1005
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
1006
1007
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1008
1009
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
1010
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
1011
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
1012
1013
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1014
1015
1016
1017
  		# 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...
1018
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
1019
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
1020
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
1021
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
1022
1023
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1024
1025
1026
1027
1028
1029
1030
  				$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...
1031
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
1032
1033
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1034
1035
1036
1037
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
1038
  		}
cf655043d   Andy Whitcroft   update checkpatch...
1039
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
1040
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
1041
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
1042

773647a09   Andy Whitcroft   update checkpatch...
1043
1044
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
1045
1046
1047
1048
1049
1050
1051
1052
1053
  
  		# 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...
1054
1055
1056
1057
1058
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
1059
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
  		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...
1070
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
  		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...
1081
1082
1083
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
  			}
  		}
  		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...
1095
1096
1097
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
1098
1099
1100
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1101
1102
1103
1104
1105
1106
1107
1108
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1109
1110
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1111
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
1112
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1113
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
1114
1115
1116
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1117
1118
1119
1120
1121
1122
1123
1124
  
  	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...
1125
1126
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
1127
1128
1129
1130
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
  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...
1178
1179
1180
1181
1182
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
1183
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
1184
1185
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
1186
1187
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
1188
1189
1190
1191
1192
1193
1194
1195
  	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...
1196
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
1197
1198
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
1199
1200
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1201
1202
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
1203
1204
1205
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
1206
1207
1208
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
1209
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1210
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
1211
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1212
1213
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1214
1215
1216
1217
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
1218
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
1219
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
1220
1221
1222
1223
1224
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
1225
1226
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
1227
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1228
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
1229
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1230
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
1231
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1232
1233
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
1234
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1235
1236
1237
1238
1239
1240
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1241

f0a594c1c   Andy Whitcroft   update checkpatch...
1242
1243
1244
1245
1246
1247
1248
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1249

f0a594c1c   Andy Whitcroft   update checkpatch...
1250
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
1251
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1252
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1253
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1254
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1255
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1256
1257
1258
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1259
1260
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1261
1262
1263
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1264
1265
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
1266
1267
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
1268
1269
1270
1271
1272
1273
  	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...
1274
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1275
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1276
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1277
1278
1279
1280
1281
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1282
1283
1284
1285
1286
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
1287
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1288
1289
1290
1291
1292
1293
1294
  	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...
1295
1296
1297
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
  		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...
1320
1321
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1322
1323
1324
1325
1326
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
  sub raw_line {
  	my ($linenr, $cnt) = @_;
  
  	my $offset = $linenr - 1;
  	$cnt++;
  
  	my $line;
  	while ($cnt) {
  		$line = $rawlines[$offset++];
  		next if (defined($line) && $line =~ /^-/);
  		$cnt--;
  	}
  
  	return $line;
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1342
1343
1344
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1345

6c72ffaab   Andy Whitcroft   update checkpatch...
1346
1347
1348
1349
1350
1351
  	$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...
1352
1353
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1354
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1355

6c72ffaab   Andy Whitcroft   update checkpatch...
1356
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1357
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1358
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1359
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
1360
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1361
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
1362
1363
1364
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1365
1366
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1367
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1368
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1369
1370
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1371

6c72ffaab   Andy Whitcroft   update checkpatch...
1372
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1373
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1374
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1375
1376
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1377

6c72ffaab   Andy Whitcroft   update checkpatch...
1378
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1379
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1380
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1381
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1382
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1383
1384
1385
1386
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1387
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1388
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1389
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1390
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1391
1392
1393
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1394
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1395

e91b6e263   Andy Whitcroft   checkpatch: types...
1396
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1397
1398
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1399
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1400
1401
1402
1403
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1404
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1405
1406
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1407
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1408
1409
1410
1411
1412
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1413
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1414
1415
1416
1417
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1418

c45dcabd2   Andy Whitcroft   update checkpatch...
1419
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1420
1421
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1422
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1423
1424
1425
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1426
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1427

c45dcabd2   Andy Whitcroft   update checkpatch...
1428
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1429
1430
1431
1432
1433
  			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...
1434
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1435

c45dcabd2   Andy Whitcroft   update checkpatch...
1436
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1437
1438
1439
1440
1441
1442
1443
1444
1445
  			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...
1446
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1447
1448
1449
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1450
1451
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1452

171ae1a49   Andy Whitcroft   update checkpatch...
1453
1454
1455
1456
1457
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1458
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1459
1460
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1461
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1462
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1463
1464
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1465
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1466
1467
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1468
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1469
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1470
1471
1472
1473
1474
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1475
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1476
1477
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1478
1479
1480
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1481
1482
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1483
1484
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1485
1486
1487
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1488
1489
1490
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1491
1492
1493
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1494
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1495
1496
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1497
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1498
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1499
1500
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1501
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1502
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1503

8e761b04a   Andy Whitcroft   checkpatch: detec...
1504
1505
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1506
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1507
1508
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1509
1510
1511
1512
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1513
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1514
1515
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1516
1517
1518
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1519
1520
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1521
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1522
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1523
1524
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1525
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1526
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1527
1528
1529
1530
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
  		} 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...
1547

8e761b04a   Andy Whitcroft   checkpatch: detec...
1548
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1549
1550
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1551
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1552
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
  			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...
1565
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1566
1567
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1568
1569
1570
1571
1572
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1573
1574
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1575
1576
1577
1578
1579
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1580
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1581

1f65f947a   Andy Whitcroft   checkpatch: add c...
1582
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1583
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1584
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1585
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1586
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1587
1588
1589
1590
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1591
1592
1593
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1594
1595
1596
1597
1598
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1599
1600
1601
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1602
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1603
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1604
1605
1606
1607
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1608
1609
1610
1611
1612
1613
1614
  		# 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...
1615
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1616
1617
1618
1619
1620
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1621
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1622
1623
1624
1625
1626
1627
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1628
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1629
1630
1631
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1632
1633
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1634
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1635
  sub show_type {
cbec18afc   Joe Perches   checkpatch: use a...
1636
  	my ($type) = @_;
91bfe4843   Joe Perches   checkpatch: add -...
1637

cbec18afc   Joe Perches   checkpatch: use a...
1638
1639
1640
  	return defined $use_type{$type} if (scalar keys %use_type > 0);
  
  	return !defined $ignore_type{$type};
000d1cc18   Joe Perches   checkpatch.pl: ad...
1641
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
1642
  sub report {
cbec18afc   Joe Perches   checkpatch: use a...
1643
1644
1645
1646
  	my ($level, $type, $msg) = @_;
  
  	if (!show_type($type) ||
  	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
1647
1648
  		return 0;
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1649
1650
  	my $line;
  	if ($show_types) {
cbec18afc   Joe Perches   checkpatch: use a...
1651
1652
  		$line = "$prefix$level:$type: $msg
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1653
  	} else {
cbec18afc   Joe Perches   checkpatch: use a...
1654
1655
  		$line = "$prefix$level: $msg
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1656
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1657
1658
1659
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1660
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1661
1662
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1663
  }
cbec18afc   Joe Perches   checkpatch: use a...
1664

f0a594c1c   Andy Whitcroft   update checkpatch...
1665
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1666
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1667
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1668

d752fcc88   Joe Perches   checkpatch: add a...
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
  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 -...
1701
  		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
d752fcc88   Joe Perches   checkpatch: add a...
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
  			$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...
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
  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...
1751
  sub ERROR {
cbec18afc   Joe Perches   checkpatch: use a...
1752
1753
1754
  	my ($type, $msg) = @_;
  
  	if (report("ERROR", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
1755
1756
  		our $clean = 0;
  		our $cnt_error++;
3705ce5bc   Joe Perches   checkpatch: creat...
1757
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
1758
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1759
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1760
1761
  }
  sub WARN {
cbec18afc   Joe Perches   checkpatch: use a...
1762
1763
1764
  	my ($type, $msg) = @_;
  
  	if (report("WARNING", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
1765
1766
  		our $clean = 0;
  		our $cnt_warn++;
3705ce5bc   Joe Perches   checkpatch: creat...
1767
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
1768
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1769
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1770
1771
  }
  sub CHK {
cbec18afc   Joe Perches   checkpatch: use a...
1772
1773
1774
  	my ($type, $msg) = @_;
  
  	if ($check && report("CHECK", $type, $msg)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1775
1776
  		our $clean = 0;
  		our $cnt_chk++;
3705ce5bc   Joe Perches   checkpatch: creat...
1777
  		return 1;
6c72ffaab   Andy Whitcroft   update checkpatch...
1778
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1779
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1780
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
  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...
1807
1808
1809
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
1810
1811
  	}
  }
3705ce5bc   Joe Perches   checkpatch: creat...
1812
1813
  sub trim {
  	my ($string) = @_;
b34c648bb   Joe Perches   checkpatch: bette...
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
  	$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...
1831
1832
1833
  
  	return $string;
  }
52ea85061   Joe Perches   checkpatch: add t...
1834
1835
1836
1837
1838
1839
1840
  sub string_find_replace {
  	my ($string, $find, $replace) = @_;
  
  	$string =~ s/$find/$replace/g;
  
  	return $string;
  }
3705ce5bc   Joe Perches   checkpatch: creat...
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
  sub tabify {
  	my ($leading) = @_;
  
  	my $source_indent = 8;
  	my $max_spaces_before_tab = $source_indent - 1;
  	my $spaces_to_tab = " " x $source_indent;
  
  	#convert leading spaces to tabs
  	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
  	#Remove spaces before a tab
  	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
  
  	return "$leading";
  }
d1fe9c099   Joe Perches   checkpatch: add s...
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
  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...
1881
  	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c099   Joe Perches   checkpatch: add s...
1882
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1883
1884
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1885
1886
1887
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1888
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1889
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1890
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1891

4a0df2ef4   Andy Whitcroft   update checkpatch...
1892
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1893
1894
1895
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1896
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1897
1898
  	my $signoff = 0;
  	my $is_patch = 0;
29ee1b0c6   Joe Perches   checkpatch: ignor...
1899
  	my $in_header_lines = $file ? 0 : 1;
15662b3e8   Joe Perches   checkpatch: add a...
1900
  	my $in_commit_log = 0;		#Scanning lines before patch
2a076f40d   Joe Perches   checkpatch, Submi...
1901
  	my $commit_log_long_line = 0;
13f1937ef   Joe Perches   checkpatch: emit ...
1902
  	my $reported_maintainer_file = 0;
fa64205df   Pasi Savanainen   checkpatch: check...
1903
  	my $non_utf8_charset = 0;
365dd4eaa   Joe Perches   checkpatch: add a...
1904
  	my $last_blank_line = 0;
5e4f6ba5e   Joe Perches   checkpatch: add a...
1905
  	my $last_coalesced_string_linenr = -1;
365dd4eaa   Joe Perches   checkpatch: add a...
1906

13214adf7   Andy Whitcroft   update checkpatch...
1907
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1908
1909
1910
1911
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1912
1913
1914
1915
1916
1917
  	# Trace the real file/line as we go.
  	my $realfile = '';
  	my $realline = 0;
  	my $realcnt = 0;
  	my $here = '';
  	my $in_comment = 0;
c2fdda0df   Andy Whitcroft   update checkpatch...
1918
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1919
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1920
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1921

13214adf7   Andy Whitcroft   update checkpatch...
1922
1923
1924
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1925
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1926
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1927
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1928
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
1929

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

c2fdda0df   Andy Whitcroft   update checkpatch...
1932
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1933
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1934
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1935
1936
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1937

d8b077101   Joe Perches   checkpatch: exten...
1938
  	my $camelcase_file_seeded = 0;
773647a09   Andy Whitcroft   update checkpatch...
1939
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1940
1941
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1942
1943
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1944

3705ce5bc   Joe Perches   checkpatch: creat...
1945
  		push(@fixed, $rawline) if ($fix);
773647a09   Andy Whitcroft   update checkpatch...
1946
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1947
1948
1949
1950
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1951
1952
1953
1954
1955
1956
1957
1958
1959
  			#next;
  		}
  		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1960
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1961
1962
1963
1964
1965
1966
  
  			# 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...
1967
1968
1969
1970
1971
1972
1973
  			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...
1974
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1975
1976
1977
1978
1979
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1980
1981
1982
1983
1984
1985
1986
1987
1988
  			}
  			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...
1989
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1990
1991
1992
1993
1994
1995
1996
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1997
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1998
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1999
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
2000
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2001
  		}
773647a09   Andy Whitcroft   update checkpatch...
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
2014
2015
2016
2017
2018
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
2019
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
2020
2021
  	$realcnt = 0;
  	$linenr = 0;
194f66fc9   Joe Perches   checkpatch: add a...
2022
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2023
2024
  	foreach my $line (@lines) {
  		$linenr++;
194f66fc9   Joe Perches   checkpatch: add a...
2025
  		$fixlinenr++;
1b5539b1f   Joe Perches   checkpatch: reduc...
2026
2027
  		my $sline = $line;	#copy of $line
  		$sline =~ s/$;/ /g;	#with comments as spaces
0a920b5b6   Andy Whitcroft   add a trivial pat...
2028

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
2031
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
2032
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2033
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
2034
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2035
2036
2037
2038
2039
2040
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2041
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
2042
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
2043
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
2044
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2045
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2046
  			$suppress_statement = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2047
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2048

4a0df2ef4   Andy Whitcroft   update checkpatch...
2049
2050
2051
  # 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...
2052
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
2053
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
2054
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2055

4a0df2ef4   Andy Whitcroft   update checkpatch...
2056
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
2057
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2058
2059
2060
2061
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
2062
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
2063
2064
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
2065

d8aaf1214   Andy Whitcroft   update checkpatch...
2066
2067
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2068
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
2069
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2070
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
2071
2072
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
2073
2074
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
2075

2ac73b4f6   Joe Perches   checkpatch: make ...
2076
  		my $found_file = 0;
773647a09   Andy Whitcroft   update checkpatch...
2077
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
2078
2079
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2080
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2081
  			$in_commit_log = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
2082
  			$found_file = 1;
3bf9a009f   Rabin Vincent   checkpatch: check...
2083
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
2084
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2085
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2086
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2087
2088
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
2089
2090
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2091
2092
2093
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
2094
  			}
773647a09   Andy Whitcroft   update checkpatch...
2095

c1ab33269   Andy Whitcroft   checkpatch: inclu...
2096
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2097
2098
2099
2100
  				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...
2101
  			}
2ac73b4f6   Joe Perches   checkpatch: make ...
2102
2103
2104
2105
2106
2107
2108
2109
2110
  			$found_file = 1;
  		}
  
  		if ($found_file) {
  			if ($realfile =~ m@^(drivers/net/|net/)@) {
  				$check = 1;
  			} else {
  				$check = $check_orig;
  			}
773647a09   Andy Whitcroft   update checkpatch...
2111
2112
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
2113
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2114

c2fdda0df   Andy Whitcroft   update checkpatch...
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2125

6c72ffaab   Andy Whitcroft   update checkpatch...
2126
  		$cnt_lines++ if ($realcnt != 0);
3bf9a009f   Rabin Vincent   checkpatch: check...
2127
2128
2129
2130
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
04db4d25d   Joe Perches   checkpatch: compl...
2131
2132
  			if ($realfile !~ m@scripts/@ &&
  			    $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2133
2134
2135
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
2136
2137
  			}
  		}
201124755   Joe Perches   checkpatch: valid...
2138
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
2139
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2140
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
2141
  			$in_commit_log = 0;
201124755   Joe Perches   checkpatch: valid...
2142
  		}
e0d975b1b   Joe Perches   checkpatch: reduc...
2143
2144
2145
2146
2147
  # 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...
2148
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
2149
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
2150
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
2151
2152
2153
2154
2155
  			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 ...
2156
2157
2158
2159
2160
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
2161
  			if (defined $space_before && $space_before ne "") {
3705ce5bc   Joe Perches   checkpatch: creat...
2162
2163
2164
2165
  				if (WARN("BAD_SIGN_OFF",
  					 "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2166
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2167
2168
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2169
2170
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5bc   Joe Perches   checkpatch: creat...
2171
2172
2173
2174
  				if (WARN("BAD_SIGN_OFF",
  					 "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2175
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2176
2177
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2178
2179
  			}
  			if (!defined $space_after || $space_after ne " ") {
3705ce5bc   Joe Perches   checkpatch: creat...
2180
2181
2182
2183
  				if (WARN("BAD_SIGN_OFF",
  					 "Use a single space after $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2184
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2185
2186
  					    "$ucfirst_sign_off $email";
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2187
  			}
201124755   Joe Perches   checkpatch: valid...
2188
2189
2190
2191
  
  			my ($email_name, $email_address, $comment) = parse_email($email);
  			my $suggested_email = format_email(($email_name, $email_address));
  			if ($suggested_email eq "") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2192
2193
2194
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2195
2196
2197
2198
2199
2200
2201
2202
2203
  			} else {
  				my $dequoted = $suggested_email;
  				$dequoted =~ s/^"//;
  				$dequoted =~ s/" </ </;
  				# Don't force email to have quotes
  				# Allow just an angle bracketed address
  				if ("$dequoted$comment" ne $email &&
  				    "<$email_address>$comment" ne $email &&
  				    "$suggested_email$comment" ne $email) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2204
2205
2206
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2207
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2208
  			}
7e51f1979   Joe Perches   checkpatch: check...
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
  
  # Check for duplicate signatures
  			my $sig_nospace = $line;
  			$sig_nospace =~ s/\s//g;
  			$sig_nospace = lc($sig_nospace);
  			if (defined $signatures{$sig_nospace}) {
  				WARN("BAD_SIGN_OFF",
  				     "Duplicate signature
  " . $herecurr);
  			} else {
  				$signatures{$sig_nospace} = 1;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2221
  		}
a2fe16b9d   Joe Perches   checkpatch: try t...
2222
2223
2224
2225
2226
2227
2228
  # 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);
  		}
9b3189eb4   Joe Perches   checkpatch: check...
2229
2230
2231
2232
2233
2234
  # Check for old stable address
  		if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
  			ERROR("STABLE_ADDRESS",
  			      "The 'stable' address should be 'stable\@vger.kernel.org'
  " . $herecurr);
  		}
7ebd05ef1   Christopher Covington   checkpatch.pl: ad...
2235
2236
2237
2238
2239
2240
  # Check for unwanted Gerrit info
  		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
  			ERROR("GERRIT_CHANGE_ID",
  			      "Remove Gerrit Change-Id's before submitting upstream.
  " . $herecurr);
  		}
2a076f40d   Joe Perches   checkpatch, Submi...
2241
2242
2243
2244
2245
2246
2247
2248
  # Check for line lengths > 75 in commit log, warn once
  		if ($in_commit_log && !$commit_log_long_line &&
  		    length($line) > 75) {
  			WARN("COMMIT_LOG_LONG_LINE",
  			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)
  " . $herecurr);
  			$commit_log_long_line = 1;
  		}
0d7835fca   Joe Perches   checkpatch: updat...
2249
2250
  # Check for git id commit length and improperly formed commit descriptions
  		if ($in_commit_log && $line =~ /\b(c)ommit\s+([0-9a-f]{5,})/i) {
d311cd445   Joe Perches   checkpatch: add t...
2251
2252
  			my $init_char = $1;
  			my $orig_commit = lc($2);
0d7835fca   Joe Perches   checkpatch: updat...
2253
2254
2255
2256
2257
  			my $short = 1;
  			my $long = 0;
  			my $case = 1;
  			my $space = 1;
  			my $hasdesc = 0;
19c146a64   Joe Perches   checkpatch: make ...
2258
  			my $hasparens = 0;
0d7835fca   Joe Perches   checkpatch: updat...
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
  			my $id = '0123456789ab';
  			my $orig_desc = "commit description";
  			my $description = "";
  
  			$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 ...
2269
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2270
2271
2272
2273
  			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
  				 defined $rawlines[$linenr] &&
  				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
  				$orig_desc = $1;
19c146a64   Joe Perches   checkpatch: make ...
2274
  				$hasparens = 1;
b671fde05   Joe Perches   checkpatch: add a...
2275
2276
2277
2278
2279
2280
2281
  			} 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 ...
2282
  				$hasparens = 1;
0d7835fca   Joe Perches   checkpatch: updat...
2283
2284
2285
2286
  			}
  
  			($id, $description) = git_commit_info($orig_commit,
  							      $id, $orig_desc);
19c146a64   Joe Perches   checkpatch: make ...
2287
  			if ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens) {
0d7835fca   Joe Perches   checkpatch: updat...
2288
2289
2290
2291
  				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...
2292
  		}
13f1937ef   Joe Perches   checkpatch: emit ...
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
  # 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))))) {
  			$reported_maintainer_file = 1;
  			WARN("FILE_PATH_CHANGES",
  			     "added, moved or deleted file(s), does MAINTAINERS need updating?
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
2304
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
2305
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2306
2307
2308
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
2309
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2310
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
  # Check for absolute kernel paths.
  		if ($tree) {
  			while ($line =~ m{(?:^|\s)(/\S*)}g) {
  				my $file = $1;
  
  				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
  				    check_absolute_file($1, $herecurr)) {
  					#
  				} else {
  					check_absolute_file($file, $herecurr);
  				}
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2324
2325
  # 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...
2326
2327
2328
2329
2330
2331
2332
  		    $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 ...
2333
2334
2335
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
2336
  		}
15662b3e8   Joe Perches   checkpatch: add a...
2337
2338
2339
  # 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 =~ /^$/ &&
29ee1b0c6   Joe Perches   checkpatch: ignor...
2340
2341
  		    !($rawline =~ /^\s+\S/ ||
  		      $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
15662b3e8   Joe Perches   checkpatch: add a...
2342
2343
2344
  			$in_header_lines = 0;
  			$in_commit_log = 1;
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
2345
2346
2347
2348
2349
2350
2351
2352
2353
  # 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...
2354
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
2355
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
2356
2357
2358
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
66b47b4a9   Kees Cook   checkpatch: look ...
2359
  # Check for various typo / spelling mistakes
66d7a382c   Joe Perches   checkpatch: add s...
2360
2361
  		if (defined($misspellings) &&
  		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
ebfd7d623   Joe Perches   checkpatch: add o...
2362
  			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
66b47b4a9   Kees Cook   checkpatch: look ...
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
  				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]+$/);
  				my $msg_type = \&WARN;
  				$msg_type = \&CHK if ($file);
  				if (&{$msg_type}("TYPO_SPELLING",
  						 "'$typo' may be misspelled - perhaps '$typo_fix'?
  " . $herecurr) &&
  				    $fix) {
  					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
  				}
  			}
  		}
306708547   Andy Whitcroft   checkpatch: ensur...
2377
2378
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2379

0a920b5b6   Andy Whitcroft   add a trivial pat...
2380
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2381
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2382
2383
2384
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d5e616fc1   Joe Perches   checkpatch: add a...
2385
2386
2387
2388
  			if (ERROR("DOS_LINE_ENDINGS",
  				  "DOS line endings
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2389
  				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
2390
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2391
2392
2393
2394
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2395
2396
2397
2398
  			if (ERROR("TRAILING_WHITESPACE",
  				  "trailing whitespace
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2399
  				$fixed[$fixlinenr] =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
2400
  			}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2401
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2402
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2403

4783f894d   Josh Triplett   checkpatch.pl: ch...
2404
  # Check for FSF mailing addresses.
109d8cb20   Alexander Duyck   checkpatch: only ...
2405
  		if ($rawline =~ /\bwrite to the Free/i ||
3e2232f2d   Joe Perches   checkpatch: updat...
2406
2407
  		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
  		    $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894d   Josh Triplett   checkpatch.pl: ch...
2408
2409
2410
2411
2412
2413
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
  			my $msg_type = \&ERROR;
  			$msg_type = \&CHK if ($file);
  			&{$msg_type}("FSF_MAILING_ADDRESS",
3e2232f2d   Joe Perches   checkpatch: updat...
2414
2415
  				     "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...
2416
  		}
3354957a4   Andi Kleen   checkpatch: add c...
2417
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2418
2419
  # 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...
2420
  		if ($realfile =~ /Kconfig/ &&
8d73e0e7d   Joe Perches   checkpatch: quiet...
2421
  		    $line =~ /^\+\s*config\s+/) {
3354957a4   Andi Kleen   checkpatch: add c...
2422
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2423
2424
2425
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
2426
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2427
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
2428
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2429
2430
2431
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2432
2433
  
  				next if ($f =~ /^-/);
8d73e0e7d   Joe Perches   checkpatch: quiet...
2434
  				last if (!$file && $f =~ /^\@\@/);
a13858033   Andy Whitcroft   checkpatch: only ...
2435

8d73e0e7d   Joe Perches   checkpatch: quiet...
2436
  				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2437
  					$is_start = 1;
8d73e0e7d   Joe Perches   checkpatch: quiet...
2438
  				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2439
2440
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2441
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
2442
2443
2444
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2445
2446
2447
2448
  				if ($f =~ /^\s*config\s/) {
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
2449
2450
  				$length++;
  			}
56193274e   Vadim Bendebury   checkpatch: allow...
2451
2452
2453
2454
2455
  			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 ...
2456
2457
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
2458
  		}
1ba8dfd17   Kees Cook   checkpatch: warn ...
2459
2460
2461
2462
2463
2464
2465
  # discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
  		if ($realfile =~ /Kconfig/ &&
  		    $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
  			WARN("CONFIG_EXPERIMENTAL",
  			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580
  ");
  		}
327953e9a   Christoph Jaeger   checkpatch: add c...
2466
2467
2468
2469
2470
2471
2472
  # 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...
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
  		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...
2487
  # check for DT compatible documentation
7dd05b38e   Florian Vaussard   checkpatch: check...
2488
2489
2490
  		if (defined $root &&
  			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
  			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
bff5da433   Rob Herring   checkpatch: add D...
2491
  			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
cc93319b5   Florian Vaussard   checkpatch: impro...
2492
2493
  			my $dt_path = $root . "/Documentation/devicetree/bindings/";
  			my $vp_file = $dt_path . "vendor-prefixes.txt";
bff5da433   Rob Herring   checkpatch: add D...
2494
2495
  			foreach my $compat (@compats) {
  				my $compat2 = $compat;
185d566bc   Rob Herring   checkpatch: fix w...
2496
2497
2498
2499
  				$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...
2500
2501
2502
2503
2504
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
  					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path
  " . $herecurr);
  				}
4fbf32a69   Florian Vaussard   checkpatch: fix s...
2505
2506
  				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
  				my $vendor = $1;
cc93319b5   Florian Vaussard   checkpatch: impro...
2507
  				`grep -Eq "^$vendor\\b" $vp_file`;
bff5da433   Rob Herring   checkpatch: add D...
2508
2509
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
cc93319b5   Florian Vaussard   checkpatch: impro...
2510
2511
  					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file
  " . $herecurr);
bff5da433   Rob Herring   checkpatch: add D...
2512
2513
2514
  				}
  			}
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2515
  # check we are in a valid source file if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
2516
  		next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/);
5368df20f   Andy Whitcroft   checkpatch: check...
2517

6cd7f3869   Joe Perches   checkpatch: allow...
2518
  #line length limit
c45dcabd2   Andy Whitcroft   update checkpatch...
2519
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
2520
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
29a3c4667   Joe Perches   checkpatch: add #...
2521
2522
2523
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?$String\s*(?:|,|\)\s*;)\s*$/ ||
  		      $line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
  		      $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) &&
6cd7f3869   Joe Perches   checkpatch: allow...
2524
  		    $length > $max_line_length)
c45dcabd2   Andy Whitcroft   update checkpatch...
2525
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
2526
  			WARN("LONG_LINE",
6cd7f3869   Joe Perches   checkpatch: allow...
2527
2528
  			     "line over $max_line_length characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2529
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2530
2531
  # 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...
2532
2533
2534
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2535
  		}
42e41c54d   Mike Frysinger   checkpatch: add s...
2536
2537
2538
2539
2540
2541
  # Blackfin: use hi/lo macros
  		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
  			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2542
2543
2544
  				ERROR("LO_MACRO",
  				      "use the LO() macro, not (... & 0xFFFF)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2545
2546
2547
2548
2549
  			}
  			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2550
2551
2552
  				ERROR("HI_MACRO",
  				      "use the HI() macro, not (... >> 16)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2553
2554
  			}
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
2555
  # check we are in a valid source file C or perl if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
2556
  		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2557
2558
2559
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
2560
2561
2562
2563
2564
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2565
  			$rpt_cleaners = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
2566
2567
2568
2569
  			if (ERROR("CODE_INDENT",
  				  "code indent should use tabs where possible
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2570
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
2571
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2572
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
2573
2574
2575
2576
2577
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2578
2579
2580
2581
  			if (WARN("SPACE_BEFORE_TAB",
  				"please, no space before tabs
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2582
  				while ($fixed[$fixlinenr] =~
d2207ccbc   Joe Perches   checkpatch: remov...
2583
  					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc9   Joe Perches   checkpatch: add a...
2584
  				while ($fixed[$fixlinenr] =~
c76f4cb3d   Joe Perches   checkpatch: impro...
2585
  					   s/(^\+.*) +\t/$1\t/) {}
3705ce5bc   Joe Perches   checkpatch: creat...
2586
  			}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
2587
  		}
d1fe9c099   Joe Perches   checkpatch: add s...
2588
2589
2590
2591
2592
2593
2594
2595
2596
  # check for && or || at the start of a line
  		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
  			CHK("LOGICAL_CONTINUATIONS",
  			    "Logical continuations should be on the previous line
  " . $hereprev);
  		}
  
  # check multi-line statement indentation matches previous line
  		if ($^V && $^V ge 5.10.0 &&
91cb5195f   Joe Perches   checkpatch: expan...
2597
  		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
d1fe9c099   Joe Perches   checkpatch: add s...
2598
2599
2600
2601
2602
2603
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
2604
2605
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
2606
2607
2608
2609
2610
2611
2612
2613
  
  				my $goodtabindent = $oldindent .
  					"\t" x ($pos / 8) .
  					" "  x ($pos % 8);
  				my $goodspaceindent = $oldindent . " "  x $pos;
  
  				if ($newindent ne $goodtabindent &&
  				    $newindent ne $goodspaceindent) {
3705ce5bc   Joe Perches   checkpatch: creat...
2614
2615
2616
2617
2618
  
  					if (CHK("PARENTHESIS_ALIGNMENT",
  						"Alignment should match open parenthesis
  " . $hereprev) &&
  					    $fix && $line =~ /^\+/) {
194f66fc9   Joe Perches   checkpatch: add a...
2619
  						$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
2620
2621
  						    s/^\+[ \t]*/\+$goodtabindent/;
  					}
d1fe9c099   Joe Perches   checkpatch: add s...
2622
2623
2624
  				}
  			}
  		}
6ab3a9701   Joe Perches   checkpatch: impro...
2625
2626
2627
2628
2629
2630
2631
2632
2633
  # 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...
2634
  			if (CHK("SPACING",
f27c95db1   Joe Perches   checkpatch: impro...
2635
2636
  				"No space is necessary after a cast
  " . $herecurr) &&
3705ce5bc   Joe Perches   checkpatch: creat...
2637
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2638
  				$fixed[$fixlinenr] =~
f27c95db1   Joe Perches   checkpatch: impro...
2639
  				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5bc   Joe Perches   checkpatch: creat...
2640
  			}
aad4f6149   Joe Perches   checkpatch: add -...
2641
  		}
058806007   Joe Perches   checkpatch: check...
2642
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd61   Joe Perches   checkpatch: impro...
2643
  		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c6   Joe Perches   checkpatch: ignor...
2644
2645
  		    $rawline =~ /^\+[ \t]*\*/ &&
  		    $realline > 2) {
058806007   Joe Perches   checkpatch: check...
2646
2647
2648
2649
2650
2651
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments don't use an empty /* line, use /* Comment...
  " . $hereprev);
  		}
  
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
a605e32eb   Joe Perches   checkpatch: warn ...
2652
2653
  		    $prevrawline =~ /^\+[ \t]*\/\*/ &&		#starting /*
  		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
61135e966   Joe Perches   checkpatch: fix n...
2654
  		    $rawline =~ /^\+/ &&			#line is new
a605e32eb   Joe Perches   checkpatch: warn ...
2655
2656
2657
2658
2659
2660
2661
  		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments start with * on subsequent lines
  " . $hereprev);
  		}
  
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
c24f9f195   Joe Perches   checkpatch: impro...
2662
2663
2664
2665
  		    $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
  		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
  		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
  		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
058806007   Joe Perches   checkpatch: check...
2666
2667
2668
2669
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments put the trailing */ on a separate line
  " . $herecurr);
  		}
7f6191914   Joe Perches   checkpatch: add t...
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
  # 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/ ||
  		      $line =~ /^\+\s*__setup/)) {
d752fcc88   Joe Perches   checkpatch: add a...
2682
2683
2684
2685
  			if (CHK("LINE_SPACING",
  				"Please use a blank line after function/struct/union/enum declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2686
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
2687
  			}
7f6191914   Joe Perches   checkpatch: add t...
2688
  		}
365dd4eaa   Joe Perches   checkpatch: add a...
2689
2690
2691
2692
  # check for multiple consecutive blank lines
  		if ($prevline =~ /^[\+ ]\s*$/ &&
  		    $line =~ /^\+\s*$/ &&
  		    $last_blank_line != ($linenr - 1)) {
d752fcc88   Joe Perches   checkpatch: add a...
2693
2694
2695
2696
  			if (CHK("LINE_SPACING",
  				"Please don't use multiple blank lines
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2697
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
2698
  			}
365dd4eaa   Joe Perches   checkpatch: add a...
2699
2700
  			$last_blank_line = $linenr;
  		}
3b617e3b8   Joe Perches   checkpatch: net a...
2701
  # check for missing blank lines after declarations
3f7bac031   Joe Perches   checkpatch: alway...
2702
2703
2704
  		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
  			# actual declarations
  		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
2705
2706
  			# function pointer declarations
  		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
  			# 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...
2719
2720
  			# function pointer declarations
  		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2721
2722
2723
2724
2725
  			# 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
3b617e3b8   Joe Perches   checkpatch: net a...
2726
  		      $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2727
2728
2729
2730
2731
2732
2733
2734
  			# 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...
2735
2736
2737
2738
  			if (WARN("LINE_SPACING",
  				 "Missing a blank line after declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2739
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
2740
  			}
3b617e3b8   Joe Perches   checkpatch: net a...
2741
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2742
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
2743
2744
2745
2746
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
3705ce5bc   Joe Perches   checkpatch: creat...
2747
  		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2748
2749
2750
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2751
2752
2753
2754
  			if (WARN("LEADING_SPACE",
  				 "please, no spaces at the start of a line
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2755
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
2756
  			}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2757
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
2758
2759
  # check we are in a valid C source file if not then ignore this hunk
  		next if ($realfile !~ /\.(h|c)$/);
032a4c0f9   Joe Perches   checkpatch: warn ...
2760
  # check indentation of any line with a bare else
840080a08   Joe Perches   checkpatch: add e...
2761
  # (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f9   Joe Perches   checkpatch: warn ...
2762
2763
2764
  # 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...
2765
2766
2767
2768
  			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 ...
2769
2770
2771
2772
2773
  				WARN("UNNECESSARY_ELSE",
  				     "else is not generally useful after a break or return
  " . $hereprev);
  			}
  		}
c00df19a5   Joe Perches   checkpatch: warn ...
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
  # 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);
  			}
  		}
1ba8dfd17   Kees Cook   checkpatch: warn ...
2784
2785
2786
2787
2788
2789
  # discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
  		if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
  			WARN("CONFIG_EXPERIMENTAL",
  			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580
  ");
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
2790
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
2791
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2792
2793
2794
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
2795
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2796

42e41c54d   Mike Frysinger   checkpatch: add s...
2797
2798
2799
2800
2801
  # Blackfin: don't use __builtin_bfin_[cs]sync
  		if ($line =~ /__builtin_bfin_csync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2802
2803
2804
  			ERROR("CSYNC",
  			      "use the CSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2805
2806
2807
2808
2809
  		}
  		if ($line =~ /__builtin_bfin_ssync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2810
2811
2812
  			ERROR("SSYNC",
  			      "use the SSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2813
  		}
56e77d709   Joe Perches   checkpatch: warn ...
2814
2815
2816
2817
2818
2819
  # 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...
2820
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2821
2822
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2823
2824
2825
  #print "LINE<$line>
  ";
  		if ($linenr >= $suppress_statement &&
1b5539b1f   Joe Perches   checkpatch: reduc...
2826
  		    $realcnt && $sline =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
2827
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2828
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
2829
2830
2831
2832
2833
2834
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
  #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...
2846

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2847
2848
2849
2850
2851
2852
2853
  			# 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...
2854
2855
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
2856

c2fdda0df   Andy Whitcroft   update checkpatch...
2857
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
2858
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2859
2860
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
2861
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2862

463f28648   Andy Whitcroft   checkpatch: possi...
2863
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2864
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
2865
  			} 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...
2866
2867
2868
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2869
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
2870
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2871
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
2872
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2873
2874
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
2875
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2876
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2877
2878
2879
2880
2881
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
2882
  			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...
2883
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
2884

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
2892
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2893
2894
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2895
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2896

9c0ca6f9a   Andy Whitcroft   update checkpatch...
2897
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2898
2899
2900
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
2901

653d4876b   Andy Whitcroft   update checkpatch...
2902
2903
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
  		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...
2922
2923
2924
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
2925
2926
2927
2928
2929
  			}
  		}
  
  # 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...
2930
  		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...
2931
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2932
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
2933
2934
2935
2936
2937
2938
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2939
2940
2941
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
2942
2943
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
2944

548596d52   Andy Whitcroft   checkpatch: trail...
2945
2946
2947
2948
2949
2950
  			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...
2951
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2952
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
2953

53210168f   Andy Whitcroft   checkpatch: tough...
2954
2955
2956
2957
2958
2959
2960
  			#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...
2961

d752fcc88   Joe Perches   checkpatch: add a...
2962
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2963
2964
2965
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2966
2967
2968
2969
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
2970
  			}
773647a09   Andy Whitcroft   update checkpatch...
2971
2972
2973
2974
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2975
2976
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2977
2978
2979
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2980
2981
2982
2983
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2984
2985
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
2986
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2987
  # Check relative indent for conditionals and blocks.
0fe3dc2bc   Joe Perches   checkpatch: add f...
2988
  		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2989
2990
2991
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
  			my ($s, $c) = ($stat, $cond);
  
  			substr($s, 0, length($c), '');
  
  			# Make sure we remove the line prefixes as we have
  			# none on the first line, and are going to readd them
  			# where necessary.
  			$s =~ s/
  ./
  /gs;
  
  			# Find out how long the conditional actually is.
6f779c18c   Andy Whitcroft   checkpatch: suspe...
3004
3005
3006
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
  
  			# 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...
3020
3021
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
  				$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...
3032
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
3033
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3034
3035
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
3036
3037
3038
3039
3040
  				# 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...
3041
3042
3043
3044
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
3045
3046
3047
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3048
3049
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
3050
3051
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
3052
3053
3054
3055
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
3056
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
  			}
  
  			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...
3072
3073
  			#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...
3074
3075
3076
  
  			if ($check && (($sindent % 8) != 0 ||
  			    ($sindent <= $indent && $s ne ''))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3077
3078
3079
3080
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
3081
3082
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3083
3084
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
3085
3086
3087
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
3088
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
3089
3090
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
3091
3092
3093
3094
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
3095
3096
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
3097
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3098
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
3099
  #ignore lines not being added
3705ce5bc   Joe Perches   checkpatch: creat...
3100
  		next if ($line =~ /^[^\+]/);
00df344fd   Andy Whitcroft   update checkpatch...
3101

653d4876b   Andy Whitcroft   update checkpatch...
3102
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
3103
3104
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3105
3106
3107
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3108
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3109
3110
3111
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3112
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3113
3114
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3115
3116
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
3117
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3118
3119
3120
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
3121
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3122
3123
3124
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3125
3126
3127
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3128

f0a594c1c   Andy Whitcroft   update checkpatch...
3129
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
3130
3131
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc88   Joe Perches   checkpatch: add a...
3132
3133
3134
  			if (ERROR("OPEN_BRACE",
  				  "that open brace { should be on the previous line
  " . $hereprev) &&
f2d7e4d43   Joe Perches   checkpatch: add f...
3135
3136
3137
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3138
3139
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3140
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3141
3142
  				$fixedline = $line;
  				$fixedline =~ s/^(.\s*){\s*/$1/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3143
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3144
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3145
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3146
3147
3148
3149
3150
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
3151
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
3152
3153
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3154
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
3155
3156
3157
3158
3159
3160
3161
  				      "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...
3162
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3163
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3164

0a920b5b6   Andy Whitcroft   add a trivial pat...
3165
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
3166
  		if ($line =~ m{//}) {
3705ce5bc   Joe Perches   checkpatch: creat...
3167
3168
3169
3170
  			if (ERROR("C99_COMMENTS",
  				  "do not use C99 // comments
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3171
  				my $line = $fixed[$fixlinenr];
3705ce5bc   Joe Perches   checkpatch: creat...
3172
3173
  				if ($line =~ /\/\/(.*)$/) {
  					my $comment = trim($1);
194f66fc9   Joe Perches   checkpatch: add a...
3174
  					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5bc   Joe Perches   checkpatch: creat...
3175
3176
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3177
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3178
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3179
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
3180
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
3181

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3182
3183
3184
3185
3186
3187
3188
3189
3190
  # 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...
3191
3192
3193
3194
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
3195
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
3196
3197
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
3198
3199
3200
3201
3202
3203
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3204
3205
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
3206
3207
3208
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3209
3210
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
3211
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3212
3213
3214
3215
3216
  #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...
3217
3218
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
  		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...
3229
3230
3231
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3232
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3233

5150bda43   Joe Eloff   checkpatch: chang...
3234
  # check for global initialisers.
5129e87cb   Joe Perches   checkpatch: fix "...
3235
  		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*(?:0|NULL|false)\s*;/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3236
3237
3238
3239
3240
  			if (ERROR("GLOBAL_INITIALISERS",
  				  "do not initialise globals to 0 or NULL
  " .
  				      $herecurr) &&
  			    $fix) {
5129e87cb   Joe Perches   checkpatch: fix "...
3241
  				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*(0|NULL|false)\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3242
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3243
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3244
  # check for static initialisers.
d5e616fc1   Joe Perches   checkpatch: add a...
3245
3246
3247
3248
3249
3250
  		if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
  			if (ERROR("INITIALISED_STATIC",
  				  "do not initialise statics to 0 or NULL
  " .
  				      $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3251
  				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3252
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3253
  		}
1813087db   Joe Perches   checkpatch: add t...
3254
3255
3256
3257
3258
3259
3260
  # 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);
  		}
cb710eca6   Joe Perches   scripts/checkpatc...
3261
3262
  # 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...
3263
3264
3265
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3266
3267
3268
3269
3270
  				$herecurr);
                 }
  
  # check for static char foo[] = "bar" declarations.
  		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3271
3272
3273
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3274
3275
  				$herecurr);
                 }
ab7e23f34   Joe Perches   checkpatch: add t...
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
  # 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...
3289
3290
3291
3292
3293
3294
3295
  # 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 '...
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
  # 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...
3309
3310
3311
3312
3313
3314
  # check for function declarations without arguments like "int foo()"
  		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
  			if (ERROR("FUNCTION_WITHOUT_ARGS",
  				  "Bad function definition - $1() should probably be $1(void)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3315
  				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5f   Joe Perches   checkpatch.pl: ch...
3316
3317
  			}
  		}
92e112fdb   Joe Perches   PCI/checkpatch: D...
3318
3319
3320
3321
3322
3323
  # check for uses of DEFINE_PCI_DEVICE_TABLE
  		if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
  			if (WARN("DEFINE_PCI_DEVICE_TABLE",
  				 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3324
  				$fixed[$fixlinenr] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
92e112fdb   Joe Perches   PCI/checkpatch: D...
3325
  			}
93ed0e2d0   Joe Perches   scripts/checkpatc...
3326
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3327
3328
3329
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
3330
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3331
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
3332
  		    $line !~ /\b$typeTypedefs\b/ &&
021158b4c   Joe Perches   checkpatch: add t...
3333
  		    $line !~ /\b$typeOtherOSTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
3334
  		    $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3335
3336
3337
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3338
3339
3340
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
3341
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
3342
3343
3344
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3345
  			my ($ident, $from, $to) = ($1, $2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
3346
3347
3348
3349
3350
3351
  
  			# 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/...
3352
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
3353
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
3354

3705ce5bc   Joe Perches   checkpatch: creat...
3355
3356
  ##			print "1: from<$from> to<$to> ident<$ident>
  ";
65863862b   Andy Whitcroft   checkpatch: dissa...
3357
  			if ($from ne $to) {
3705ce5bc   Joe Perches   checkpatch: creat...
3358
3359
3360
3361
3362
3363
3364
  				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...
3365
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3366
3367
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
3368
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
3369
3370
3371
3372
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3373
  			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
3374
3375
3376
3377
3378
3379
  
  			# 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/...
3380
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
3381
3382
3383
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
3384

3705ce5bc   Joe Perches   checkpatch: creat...
3385
3386
  ##			print "2: from<$from> to<$to> ident<$ident>
  ";
667026e7b   Andy Whitcroft   checkpatch: a mod...
3387
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3388
3389
3390
3391
3392
3393
3394
3395
  				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...
3396
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3397
3398
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
3399
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3400
3401
3402
3403
3404
3405
3406
3407
3408
  		}
  
  # # no BUG() or BUG_ON()
  # 		if ($line =~ /\b(BUG|BUG_ON)\b/) {
  # 			print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()
  ";
  # 			print "$herecurr";
  # 			$clean = 0;
  # 		}
8905a67c6   Andy Whitcroft   update checkpatch...
3409
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3410
3411
3412
  			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...
3413
  		}
17441227f   Joe Perches   checkpatch: add w...
3414
3415
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3416
  			WARN("PRINTK_RATELIMITED",
101ee6802   Joe Perches   checkpatch: neate...
3417
3418
  			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
3419
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3420
3421
3422
  # printk should use KERN_* levels.  Note that follow on printk's on the
  # same line do not need a level, so we use the current block context
  # to try and find and validate the current printk.  In summary the current
25985edce   Lucas De Marchi   Fix common misspe...
3423
  # printk includes all preceding printk's which have no newline on the end.
00df344fd   Andy Whitcroft   update checkpatch...
3424
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
3425
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
3426
3427
3428
3429
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
25985edce   Lucas De Marchi   Fix common misspe...
3430
  				# we have a preceding printk if it ends
00df344fd   Andy Whitcroft   update checkpatch...
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
  				# with "
  " ignore it, else it is to blame
  				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
  					if ($rawlines[$ln - 1] !~ m{\
  "}) {
  						$ok = 1;
  					}
  					last;
  				}
  			}
  			if ($ok == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3442
3443
3444
  				WARN("PRINTK_WITHOUT_KERN_LEVEL",
  				     "printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
3445
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3446
  		}
243f3803c   Joe Perches   checkpatch: sugge...
3447
3448
3449
3450
  		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...
3451
3452
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
3453
  			WARN("PREFER_PR_LEVEL",
daa8b0592   Yogesh Chaudhari   checkpatch.pl: mo...
3454
3455
  			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
3456
3457
3458
  		}
  
  		if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3459
3460
3461
3462
  			if (WARN("PREFER_PR_LEVEL",
  				 "Prefer pr_warn(... to pr_warning(...
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3463
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
3464
3465
  				    s/\bpr_warning\b/pr_warn/;
  			}
243f3803c   Joe Perches   checkpatch: sugge...
3466
  		}
dc1393130   Joe Perches   checkpatch: prefe...
3467
3468
3469
3470
3471
3472
3473
3474
3475
  		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
  			my $orig = $1;
  			my $level = lc($orig);
  			$level = "warn" if ($level eq "warning");
  			$level = "dbg" if ($level eq "debug");
  			WARN("PREFER_DEV_LEVEL",
  			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...
  " . $herecurr);
  		}
91c9afaf9   Andy Lutomirski   checkpatch.pl: ne...
3476
3477
3478
3479
3480
3481
3482
3483
  # ENOSYS means "bad syscall nr" and nothing else.  This will have a small
  # number of false positives, but assembly files are not checked, so at
  # least the arch entry code will not trigger this warning.
  		if ($line =~ /\bENOSYS\b/) {
  			WARN("ENOSYS",
  			     "ENOSYS means 'invalid syscall nr' and nothing else
  " . $herecurr);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3484
3485
  # function brace can't be on same line, except for #defines of do while,
  # or if closed on same line
8d1824780   Joe Perches   checkpatch: add -...
3486
  		if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
c45dcabd2   Andy Whitcroft   update checkpatch...
3487
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
8d1824780   Joe Perches   checkpatch: add -...
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
  			if (ERROR("OPEN_BRACE",
  				  "open brace '{' following function declarations go on the next line
  " . $herecurr) &&
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  				my $fixed_line = $rawline;
  				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
  				my $line1 = $1;
  				my $line2 = $2;
  				fix_insert_line($fixlinenr, ltrim($line1));
  				fix_insert_line($fixlinenr, "\+{");
  				if ($line2 !~ /^\s*$/) {
  					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3503
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3504

8905a67c6   Andy Whitcroft   update checkpatch...
3505
3506
3507
  # 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 -...
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
  			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;
  				$fixedline =~ s/^(.\s*){\s*/$1\t/;
  				if ($fixedline !~ /^\+\s*$/) {
  					fix_insert_line($fixlinenr, $fixedline);
  				}
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
3522
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
3523
  # missing space after union, struct or enum definition
3705ce5bc   Joe Perches   checkpatch: creat...
3524
3525
3526
3527
3528
  		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...
3529
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3530
3531
  				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
  			}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
3532
  		}
31070b5d4   Joe Perches   checkpatch: add t...
3533
3534
3535
  # Function pointer declarations
  # check spacing between type, funcptr, and args
  # canonical declaration is "type (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
3536
  		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d4   Joe Perches   checkpatch: add t...
3537
3538
3539
3540
3541
3542
  			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...
3543
3544
3545
3546
3547
3548
3549
3550
3551
  # 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...
3552
3553
3554
  				WARN("SPACING",
  				     "missing space after return type
  " . $herecurr);
91f72e9c6   Joe Perches   checkpatch: don't...
3555
  				$post_declare_space = " ";
31070b5d4   Joe Perches   checkpatch: add t...
3556
3557
3558
  			}
  
  # unnecessary space "type  (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
  # 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...
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
  
  # 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...
3603
  				$fixed[$fixlinenr] =~
91f72e9c6   Joe Perches   checkpatch: don't...
3604
  				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d4   Joe Perches   checkpatch: add t...
3605
3606
  			}
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
3607
3608
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
3609
3610
  #  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...
3611
3612
3613
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
3614
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534a   Andy Whitcroft   checkpatch: catch...
3615
  			    $prefix !~ /[{,]\s+$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3616
3617
3618
3619
  				if (ERROR("BRACKET_SPACE",
  					  "space prohibited before open square bracket '['
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3620
  				    $fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3621
3622
  					s/^(\+.*?)\s+\[/$1\[/;
  				}
8d31cfcec   Andy Whitcroft   checkpatch: check...
3623
3624
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3625
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
3626
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3627
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
3628
3629
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
3630
3631
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
3632
3633
3634
3635
3636
3637
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
3638
3639
3640
  			# 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...
3641
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
3642
3643
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
3644
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3645
3646
3647
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
3648
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3649
3650
  
  			} else {
3705ce5bc   Joe Perches   checkpatch: creat...
3651
3652
3653
3654
  				if (WARN("SPACING",
  					 "space prohibited between function name and open parenthesis '('
  " . $herecurr) &&
  					     $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3655
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3656
3657
  					    s/\b$name\s+\(/$name\(/;
  				}
6c72ffaab   Andy Whitcroft   update checkpatch...
3658
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3659
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
3660

653d4876b   Andy Whitcroft   update checkpatch...
3661
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3662
  		if (!($line=~/\#\s*include/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3663
3664
  			my $fixed_line = "";
  			my $line_fixed = 0;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3665
3666
3667
3668
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
3669
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
847316231   Joe Perches   checkpatch: repor...
3670
  				\?:|\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3671
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
3672
  			my @elements = split(/($ops|;)/, $opline);
3705ce5bc   Joe Perches   checkpatch: creat...
3673
3674
3675
3676
3677
3678
3679
3680
3681
  
  ##			print("element count: <" . $#elements . ">
  ");
  ##			foreach my $el (@elements) {
  ##				print("el: <$el>
  ");
  ##			}
  
  			my @fix_elements = ();
00df344fd   Andy Whitcroft   update checkpatch...
3682
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
3683

3705ce5bc   Joe Perches   checkpatch: creat...
3684
3685
3686
3687
3688
3689
  			foreach my $el (@elements) {
  				push(@fix_elements, substr($rawline, $off, length($el)));
  				$off += length($el);
  			}
  
  			$off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
3690
  			my $blank = copy_spacing($opline);
b34c648bb   Joe Perches   checkpatch: bette...
3691
  			my $last_after = -1;
6c72ffaab   Andy Whitcroft   update checkpatch...
3692

0a920b5b6   Andy Whitcroft   add a trivial pat...
3693
  			for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5bc   Joe Perches   checkpatch: creat...
3694
3695
3696
3697
3698
  
  				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
  
  ##				print("n: <$n> good: <$good>
  ");
4a0df2ef4   Andy Whitcroft   update checkpatch...
3699
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
3700
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
3701
3702
3703
3704
3705
3706
  				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...
3707
3708
3709
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
3710
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3711
3712
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
3713
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3714

0a920b5b6   Andy Whitcroft   add a trivial pat...
3715
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
3716
3717
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
3718
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3719
3720
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
3721
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3722
3723
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
3724
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3725
3726
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
3727
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3728
3729
3730
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
3731
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
3732
3733
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
3734

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

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

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

d8aaf1214   Andy Whitcroft   update checkpatch...
3747
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
3748
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
3749
3750
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3751
3752
3753
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3754
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
3755
3756
  							$line_fixed = 1;
  						}
d8aaf1214   Andy Whitcroft   update checkpatch...
3757
3758
3759
3760
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
3761

b00e48148   Joe Perches   checkpatch: don't...
3762
3763
3764
  				#   :   when part of a bitfield
  				} elsif ($opv eq ':B') {
  					# skip the bitfield test for now
1f65f947a   Andy Whitcroft   checkpatch: add c...
3765
3766
  				# No spaces for:
  				#   ->
b00e48148   Joe Perches   checkpatch: don't...
3767
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3768
  					if ($ctx =~ /Wx.|.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3769
3770
3771
  						if (ERROR("SPACING",
  							  "spaces prohibited around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3772
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3773
3774
3775
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3776
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3777
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3778
  					}
2381097b6   Joe Perches   checkpatch: add a...
3779
  				# , must not have a space before and must have a space on the right.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3780
  				} elsif ($op eq ',') {
2381097b6   Joe Perches   checkpatch: add a...
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
  					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...
3791
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3792
3793
3794
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3795
  							$line_fixed = 1;
b34c648bb   Joe Perches   checkpatch: bette...
3796
  							$last_after = $n;
2381097b6   Joe Perches   checkpatch: add a...
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
  							$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...
3808
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3809
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3810
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
3811
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3812
3813
3814
3815
3816
3817
3818
  					#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...
3819
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
3820
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
3821
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3822
3823
3824
  						if (ERROR("SPACING",
  							  "space required before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3825
3826
3827
3828
  							if ($n != $last_after + 2) {
  								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
3829
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3830
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
3831
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
3832
3833
3834
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3835
3836
3837
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3838
  							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3839
3840
3841
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3842
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3843
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3844
3845
3846
3847
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
3848
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3849
3850
3851
  						if (ERROR("SPACING",
  							  "space required one side of that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3852
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
3853
3854
  							$line_fixed = 1;
  						}
773647a09   Andy Whitcroft   update checkpatch...
3855
3856
3857
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3858
3859
3860
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3861
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3862
3863
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3864
  					}
773647a09   Andy Whitcroft   update checkpatch...
3865
  					if ($ctx =~ /ExW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3866
3867
3868
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3869
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3870
3871
3872
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3873
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3874
  						}
653d4876b   Andy Whitcroft   update checkpatch...
3875
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3876

0a920b5b6   Andy Whitcroft   add a trivial pat...
3877
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3878
3879
3880
  				} 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...
3881
3882
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
3883
  				{
d2e025f36   Joe Perches   checkpatch: add -...
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
  					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...
3902
3903
3904
  						if (ERROR("SPACING",
  							  "need consistent spacing around '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3905
3906
3907
3908
  							$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...
3909
3910
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3911
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
3912
3913
3914
3915
  				# 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...
3916
3917
3918
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3919
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3920
3921
  							$line_fixed = 1;
  						}
1f65f947a   Andy Whitcroft   checkpatch: add c...
3922
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3923
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
3924
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
3925
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
3926
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
3927
3928
3929
3930
3931
3932
3933
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
e0df7e1fa   Joe Perches   checkpatch: avoid...
3934
3935
3936
3937
3938
3939
3940
  					# 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...
3941
  					# messages are ERROR, but ?: are CHK
1f65f947a   Andy Whitcroft   checkpatch: add c...
3942
  					if ($ok == 0) {
847316231   Joe Perches   checkpatch: repor...
3943
3944
3945
3946
3947
3948
  						my $msg_type = \&ERROR;
  						$msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
  
  						if (&{$msg_type}("SPACING",
  								 "spaces required around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3949
3950
3951
3952
  							$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...
3953
3954
  							$line_fixed = 1;
  						}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3955
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3956
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3957
  				$off += length($elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3958
3959
3960
3961
3962
3963
3964
3965
3966
  
  ##				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...
3967
  			}
3705ce5bc   Joe Perches   checkpatch: creat...
3968

194f66fc9   Joe Perches   checkpatch: add a...
3969
3970
  			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
  				$fixed[$fixlinenr] = $fixed_line;
3705ce5bc   Joe Perches   checkpatch: creat...
3971
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3972
  		}
786b63262   Joe Perches   checkpatch: move ...
3973
  # check for whitespace before a non-naked semicolon
d2e248e7b   Joe Perches   checkpatch: warn ...
3974
  		if ($line =~ /^\+.*\S\s+;\s*$/) {
786b63262   Joe Perches   checkpatch: move ...
3975
3976
3977
3978
  			if (WARN("SPACING",
  				 "space prohibited before semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3979
  				1 while $fixed[$fixlinenr] =~
786b63262   Joe Perches   checkpatch: move ...
3980
3981
3982
  				    s/^(\+.*\S)\s+;/$1;/;
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3983
3984
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3985
3986
3987
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
3988
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
  ## # 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...
4000
4001
4002
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
4003
4004
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4005

0a920b5b6   Andy Whitcroft   add a trivial pat...
4006
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
4007
4008
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4009
4010
4011
4012
  			if (ERROR("SPACING",
  				  "space required before the open brace '{'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4013
  				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
3705ce5bc   Joe Perches   checkpatch: creat...
4014
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4015
  		}
c4a62ef91   Joe Perches   checkpatch: add a...
4016
4017
4018
4019
4020
4021
4022
4023
  ## # 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...
4024
4025
4026
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4027
4028
4029
4030
  			if (ERROR("SPACING",
  				  "space required after that close brace '}'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4031
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4032
4033
  				    s/}((?!(?:,|;|\)))\S)/} $1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4034
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4035
4036
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4037
4038
4039
4040
  			if (ERROR("SPACING",
  				  "space prohibited after that open square bracket '['
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4041
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4042
4043
  				    s/\[\s+/\[/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4044
4045
  		}
  		if ($line =~ /\s\]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4046
4047
4048
4049
  			if (ERROR("SPACING",
  				  "space prohibited before that close square bracket ']'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4050
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4051
4052
  				    s/\s+\]/\]/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4053
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4054
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4055
4056
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4057
4058
4059
4060
  			if (ERROR("SPACING",
  				  "space prohibited after that open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4061
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4062
4063
  				    s/\(\s+/\(/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4064
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4065
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4066
4067
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4068
4069
4070
4071
  			if (ERROR("SPACING",
  				  "space prohibited before that close parenthesis ')'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4072
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4073
4074
  				    s/\s+\)/\)/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4075
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
4076
4077
4078
4079
  # 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 -...
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
  			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 ...
4103

0a920b5b6   Andy Whitcroft   add a trivial pat...
4104
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
4105
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
4106
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
4107
4108
4109
4110
  			if (WARN("INDENTED_LABEL",
  				 "labels should not be indented
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4111
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4112
4113
  				    s/^(.)\s+/$1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4114
  		}
5b9553abf   Joe Perches   checkpatch: make ...
4115
  # return is not a function
507e51418   Joe Perches   checkpatch: impro...
4116
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
4117
  			my $spacing = $1;
507e51418   Joe Perches   checkpatch: impro...
4118
  			if ($^V && $^V ge 5.10.0 &&
5b9553abf   Joe Perches   checkpatch: make ...
4119
4120
4121
4122
4123
4124
4125
4126
  			    $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...
4127
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4128
4129
4130
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
4131
4132
  			}
  		}
507e51418   Joe Perches   checkpatch: impro...
4133

b43ae21bd   Joe Perches   checkpatch: reduc...
4134
4135
4136
4137
4138
4139
4140
4141
  # 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 ...
4142
  			WARN("RETURN_VOID",
b43ae21bd   Joe Perches   checkpatch: reduc...
4143
4144
4145
  			     "void function return statements are not generally useful
  " . $hereprev);
                 }
9819cf252   Joe Perches   checkpatch: warn ...
4146

189248d8f   Joe Perches   checkpatch: check...
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
  # if statements using unnecessary parentheses - ie: if ((foo == bar))
  		if ($^V && $^V ge 5.10.0 &&
  		    $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);
  			}
  		}
f34e4a4f9   Joe Perches   checkpatch: impro...
4161
4162
  # 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...
4163
4164
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4165
  				WARN("USE_NEGATIVE_ERRNO",
f34e4a4f9   Joe Perches   checkpatch: impro...
4166
4167
  				     "return of an errno should typically be negative (ie: return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
4168
4169
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
4170

0a920b5b6   Andy Whitcroft   add a trivial pat...
4171
  # Need a space before open parenthesis after if, while etc
3705ce5bc   Joe Perches   checkpatch: creat...
4172
4173
4174
4175
4176
  		if ($line =~ /\b(if|while|for|switch)\(/) {
  			if (ERROR("SPACING",
  				  "space required before the open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4177
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4178
4179
  				    s/\b(if|while|for|switch)\(/$1 \(/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4180
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
4181
4182
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
4183
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
4184
4185
4186
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
  			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 "...
4209
  		    defined($stat) && defined($cond) &&
170d3a226   Andy Whitcroft   checkpatch: handl...
4210
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4211
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
4212

b53c8e104   Andy Whitcroft   checkpatch: ensur...
4213
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4214
4215
4216
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
4217
4218
4219
4220
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
4221
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
4222
4223
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
4224
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
4225
4226
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
4227
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4228
4229
4230
4231
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4232
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4233

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4234
4235
4236
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4237
4238
4239
4240
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
4241
4242
4243
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
4244
4245
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
  # 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...
4258
4259
4260
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4261
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
4262
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
4263
4264
4265
4266
  		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
  			my $s = $1;
  			$s =~ s/$;//g; 	# Remove any comments
  			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4267
4268
4269
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4270
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4271
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
4272
4273
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4274
  			ERROR("TRAILING_STATEMENTS",
048b123fa   Rasmus Villemoes   checkpatch.pl: al...
4275
4276
  			      "trailing statements should be on next line (or did you mean 'else if'?)
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
4277
4278
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
4279
4280
4281
  # 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...
4282
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
4283
4284
4285
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
4286
4287
4288
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
4289
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4290
4291
4292
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
8b8856f4b   Joe Perches   checkpatch: fix b...
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
  		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...
4310
  		}
8b8856f4b   Joe Perches   checkpatch: fix b...
4311
4312
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
  		    $previndent == $indent) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4313
4314
4315
4316
  			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...
4317
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
4318
4319
4320
4321
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
8b8856f4b   Joe Perches   checkpatch: fix b...
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
  				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...
4335
4336
  			}
  		}
95e2c6023   Joe Perches   checkpatch: warn ...
4337
  #Specific variable tests
323c1260b   Joe Perches   checkpatch: warn ...
4338
4339
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
95e2c6023   Joe Perches   checkpatch: warn ...
4340
4341
4342
  
  #gcc binary extension
  			if ($var =~ /^$Binary$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4343
4344
4345
4346
4347
  				if (WARN("GCC_BINARY_CONSTANT",
  					 "Avoid gcc v4.3+ binary constant extension: <$var>
  " . $herecurr) &&
  				    $fix) {
  					my $hexval = sprintf("0x%x", oct($var));
194f66fc9   Joe Perches   checkpatch: add a...
4348
  					$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4349
4350
  					    s/\b$var\b/$hexval/;
  				}
95e2c6023   Joe Perches   checkpatch: warn ...
4351
4352
4353
  			}
  
  #CamelCase
807bd26c4   Joe Perches   checkpatch: remov...
4354
  			if ($var !~ /^$Constant$/ &&
be79794bc   Joe Perches   checkpatch: chang...
4355
  			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
4356
  #Ignore Page<foo> variants
807bd26c4   Joe Perches   checkpatch: remov...
4357
  			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
4358
  #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
f51235764   Julius Werner   checkpatch: allow...
4359
4360
4361
  			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
  #Ignore some three character SI units explicitly, like MiB and KHz
  			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
7e781f67d   Joe Perches   checkpatch: check...
4362
4363
4364
  				while ($var =~ m{($Ident)}g) {
  					my $word = $1;
  					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b077101   Joe Perches   checkpatch: exten...
4365
4366
4367
4368
4369
4370
4371
  					if ($check) {
  						seed_camelcase_includes();
  						if (!$file && !$camelcase_file_seeded) {
  							seed_camelcase_file($realfile);
  							$camelcase_file_seeded = 1;
  						}
  					}
7e781f67d   Joe Perches   checkpatch: check...
4372
4373
4374
4375
4376
4377
  					if (!defined $camelcase{$word}) {
  						$camelcase{$word} = 1;
  						CHK("CAMELCASE",
  						    "Avoid CamelCase: <$word>
  " . $herecurr);
  					}
3445686af   Joe Perches   checkpatch: ignor...
4378
  				}
323c1260b   Joe Perches   checkpatch: warn ...
4379
4380
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4381
4382
  
  #no spaces allowed after \ in define
d5e616fc1   Joe Perches   checkpatch: add a...
4383
4384
4385
4386
4387
  		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...
4388
  				$fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
4389
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4390
  		}
0e212e0a7   Fabian Frederick   checkpatch: don't...
4391
4392
  # 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...
4393
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
4394
4395
4396
4397
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
4398
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
4399
  			{
0e212e0a7   Fabian Frederick   checkpatch: don't...
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
  				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...
4411
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4412
4413
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4414
4415
  # 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...
4416
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
4417
4418
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
4419
4420
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
4421
4422
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
08a2843e7   Joe Perches   checkpatch: warn ...
4423
4424
  			my $has_flow_statement = 0;
  			my $has_arg_concat = 0;
c45dcabd2   Andy Whitcroft   update checkpatch...
4425
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
4426
4427
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
4428
4429
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
4430
4431
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
4432

08a2843e7   Joe Perches   checkpatch: warn ...
4433
4434
  			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
  			$has_arg_concat = 1 if ($ctx =~ /\#\#/);
f74bd1942   Andy Whitcroft   checkpatch: corre...
4435
  			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b3   Andy Whitcroft   checkpatch: compl...
4436
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
4437
4438
4439
4440
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
4441

c45dcabd2   Andy Whitcroft   update checkpatch...
4442
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
4443
4444
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
c81769fdc   Andy Whitcroft   checkpatch: fix c...
4445
  			       $dstat =~ s/\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
4446
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
4447
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
4448

e45bab8eb   Andy Whitcroft   checkpatch: handl...
4449
4450
4451
4452
4453
  			# Flatten any obvious string concatentation.
  			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*("X*")/$1/)
  			{
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
4454
4455
4456
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
4457
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
4458
4459
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
4460
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
4461
4462
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
4463
4464
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
4465
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
4466
4467
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f74bd1942   Andy Whitcroft   checkpatch: corre...
4468
4469
4470
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
3cc4b1c3f   Joe Perches   checkpatch: reduc...
4471
  			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd3981   Joe Perches   checkpatch: fix c...
4472
  			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
4473
4474
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
e942e2c3f   Joe Perches   checkpatch: fix s...
4475
  			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
72f115f94   Andy Whitcroft   checkpatch: compl...
4476
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
4477
4478
4479
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
f95a7e6a4   Joe Perches   checkpatch: ignor...
4480
4481
  			    $dstat !~ /^\({/ &&						# ({...
  			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd1942   Andy Whitcroft   checkpatch: corre...
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
  			{
  				$ctx =~ s/
  *$//;
  				my $herectx = $here . "
  ";
  				my $cnt = statement_rawlines($ctx);
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
4492
  				}
f74bd1942   Andy Whitcroft   checkpatch: corre...
4493
4494
4495
4496
4497
  				if ($dstat =~ /;/) {
  					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
  					      "Macros with multiple statements should be enclosed in a do - while loop
  " . "$herectx");
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4498
  					ERROR("COMPLEX_MACRO",
388982b55   Andrew Morton   checkpatch: fix s...
4499
4500
  					      "Macros with complex values should be enclosed in parentheses
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
4501
  				}
653d4876b   Andy Whitcroft   update checkpatch...
4502
  			}
5023d3472   Joe Perches   checkpatch: warn ...
4503

08a2843e7   Joe Perches   checkpatch: warn ...
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
  # 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) {
  				my $herectx = $here . "
  ";
  				my $cnt = statement_rawlines($ctx);
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
  				}
  				WARN("MACRO_WITH_FLOW_CONTROL",
  				     "Macros with flow control statements should be avoided
  " . "$herectx");
  			}
481eb486a   Joe Perches   checkpatch: exten...
4519
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
4520
4521
4522
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
4523
4524
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
4525
4526
4527
4528
4529
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4530
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
  # 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
  		if ($^V && $^V ge 5.10.0 &&
  		    $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...
4547
  			$dstat =~ s/$;/ /g;
b13edf7ff   Joe Perches   checkpatch: add c...
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
  
  			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);
  				my $herectx = $here . "
  ";
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
  				}
ac8e97f8a   Joe Perches   checkpatch: add c...
4563
4564
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
4565
4566
4567
4568
4569
4570
4571
4572
4573
  					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 ...
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
  			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
  				$ctx =~ s/
  *$//;
  				my $cnt = statement_rawlines($ctx);
  				my $herectx = $here . "
  ";
  
  				for (my $n = 0; $n < $cnt; $n++) {
  					$herectx .= raw_line($linenr, $n) . "
  ";
  				}
  
  				WARN("TRAILING_SEMICOLON",
  				     "macros should not use a trailing semicolon
  " . "$herectx");
b13edf7ff   Joe Perches   checkpatch: add c...
4589
4590
  			}
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
4591
4592
4593
4594
4595
4596
  # make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
  # all assignments may have only one of the following with an assignment:
  #	.
  #	ALIGN(...)
  #	VMLINUX_SYMBOL(...)
  		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4597
4598
4599
  			WARN("MISSING_VMLINUX_SYMBOL",
  			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols
  " . $herecurr);
080ba9296   Mike Frysinger   checkpatch: try t...
4600
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4601
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
4602
4603
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
4604
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
4605
4606
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4607
4608
4609
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
4610
4611
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
4612
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
4613
4614
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4615
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
4616
4617
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
4618
4619
4620
4621
  					# 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 -...
4622
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
4623
4624
4625
4626
4627
4628
4629
4630
4631
  					#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...
4632
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
4633
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
4634
4635
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
4636
4637
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4638
4639
4640
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4641
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4642
4643
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
4644
4645
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4646
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4647
  					}
cf655043d   Andy Whitcroft   update checkpatch...
4648
4649
4650
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4651
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4652
  					}
aad4f6149   Joe Perches   checkpatch: add -...
4653
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
4654
  				}
aad4f6149   Joe Perches   checkpatch: add -...
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
  				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...
4670
4671
4672
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
4673
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
4674
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
4675
4676
4677
4678
4679
4680
4681
4682
  			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...
4683
4684
4685
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
4686
4687
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
4688
4689
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4690
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
4691
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
  			}
  			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...
4712
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
4713
4714
4715
4716
4717
4718
4719
4720
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
699324871   Justin P. Mattock   treewide: remove ...
4721
4722
  				my $herectx = $here . "
  ";
f055663c5   Andy Whitcroft   checkpatch: repor...
4723
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
4724

f055663c5   Andy Whitcroft   checkpatch: repor...
4725
  				for (my $n = 0; $n < $cnt; $n++) {
699324871   Justin P. Mattock   treewide: remove ...
4726
4727
  					$herectx .= raw_line($linenr, $n) . "
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
4728
  				}
cf655043d   Andy Whitcroft   update checkpatch...
4729

000d1cc18   Joe Perches   checkpatch.pl: ad...
4730
4731
4732
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
4733
4734
  			}
  		}
0979ae664   Joe Perches   checkpatch: Add -...
4735
  # check for unnecessary blank lines around braces
77b9a53a6   Joe Perches   checkpatch: don't...
4736
  		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
4737
4738
4739
4740
4741
4742
  			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 -...
4743
  		}
77b9a53a6   Joe Perches   checkpatch: don't...
4744
  		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219d   Joe Perches   checkpatch: add a...
4745
4746
4747
4748
4749
4750
  			if (CHK("BRACES",
  				"Blank lines aren't necessary after an open brace '{'
  " . $hereprev) &&
  			    $fix) {
  				fix_delete_line($fixlinenr, $rawline);
  			}
0979ae664   Joe Perches   checkpatch: Add -...
4751
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4752
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
4753
4754
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4755
4756
4757
  			WARN("VOLATILE",
  			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4758
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
  # 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
  		if ($line =~ /^\+\s*"[X\t]*"/ &&
  		    $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);
  		}
  
  # 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 -...
4813
4814
4815
4816
4817
4818
  # concatenated string without spaces between elements
  		if ($line =~ /"X+"[A-Z_]+/ || $line =~ /[A-Z_]+"X+"/) {
  			CHK("CONCATENATED_STRING",
  			    "Concatenated strings should use spaces between elements
  " . $herecurr);
  		}
90ad30e5b   Joe Perches   checkpatch: add t...
4819
4820
4821
4822
4823
4824
  # uncoalesced string fragments
  		if ($line =~ /"X*"\s*"/) {
  			WARN("STRING_FRAGMENTS",
  			     "Consecutive strings are generally better as a single string
  " . $herecurr);
  		}
5e4f6ba5e   Joe Perches   checkpatch: add a...
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
  # check for %L{u,d,i} in strings
  		my $string;
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
  			$string = substr($rawline, $-[1], $+[1] - $-[1]);
  			$string =~ s/%%/__/g;
  			if ($string =~ /(?<!%)%L[udi]/) {
  				WARN("PRINTF_L",
  				     "\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
  				last;
  			}
  		}
  
  # check for line continuations in quoted strings with odd counts of "
  		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
4844
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
4845
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4846
4847
4848
  			CHK("REDUNDANT_CODE",
  			    "if this code is redundant consider removing it
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
4849
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4850
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
4851
4852
4853
4854
4855
  # check for needless "if (<foo>) fn(<foo>)" uses
  		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
  			my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
  			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
  				WARN('NEEDLESS_IF',
15160f90b   Fabio Estevam   checkpatch: impro...
4856
4857
  				     "$1(NULL) is safe and this check is probably not required
  " . $hereprev);
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
4858
4859
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4860

ebfdc4096   Joe Perches   checkpatch: attem...
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
  # 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>
  
  
  ");
  
  			if ($c =~ /(?:^|
  )[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
  				WARN("OOM_MESSAGE",
  				     "Possible unnecessary 'out of memory' message
  " . $hereprev);
  			}
  		}
f78d98f6c   Joe Perches   checkpatch: warn ...
4885
  # check for logging functions with KERN_<LEVEL>
dcaf11236   Paolo Bonzini   checkpatch: fix U...
4886
  		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6c   Joe Perches   checkpatch: warn ...
4887
4888
4889
4890
4891
4892
4893
4894
4895
  		    $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*//;
  			}
  		}
abb08a538   Joe Perches   checkpatch: try t...
4896
4897
4898
4899
4900
4901
4902
4903
  # check for mask then right shift without a parentheses
  		if ($^V && $^V ge 5.10.0 &&
  		    $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 -...
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
  # check for pointer comparisons to NULL
  		if ($^V && $^V ge 5.10.0) {
  			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...
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
  # 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...
4933
  					$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...
4934
4935
4936
  				}
  			}
  		}
e970b8846   Joe Perches   checkpatch: add r...
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
  # 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...
4947
  				$fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
  				    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...
4959
  				my $lead = $fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
4960
4961
4962
4963
  				    /(^\+\s*(?:static\s+))/;
  				$lead = rtrim($1);
  				$lead = "$lead " if ($lead !~ /^\+$/);
  				$lead = "${lead}const ";
194f66fc9   Joe Perches   checkpatch: add a...
4964
  				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b8846   Joe Perches   checkpatch: add r...
4965
4966
  			}
  		}
c17893c74   Joe Perches   checkpatch: add a...
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
  # 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 ...
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
  # 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...
4987
  				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138c   Joe Perches   checkpatch: warn ...
4988
4989
  			}
  		}
1a15a2508   Patrick Pannuto   checkpatch: prefe...
4990
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
4991
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c3   Joe Perches   checkpatch: add t...
4992
  			my $delay = $1;
1a15a2508   Patrick Pannuto   checkpatch: prefe...
4993
  			# ignore udelay's < 10, however
43c1d77c3   Joe Perches   checkpatch: add t...
4994
  			if (! ($delay < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4995
  				CHK("USLEEP_RANGE",
43c1d77c3   Joe Perches   checkpatch: add t...
4996
4997
4998
4999
5000
5001
5002
  				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt
  " . $herecurr);
  			}
  			if ($delay > 2000) {
  				WARN("LONG_UDELAY",
  				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h
  " . $herecurr);
1a15a2508   Patrick Pannuto   checkpatch: prefe...
5003
5004
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
5005
5006
5007
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5008
  				WARN("MSLEEP",
43c1d77c3   Joe Perches   checkpatch: add t...
5009
5010
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $herecurr);
09ef87255   Patrick Pannuto   checkpatch: warn ...
5011
5012
  			}
  		}
36ec19390   Joe Perches   checkpatch: warn ...
5013
5014
5015
5016
5017
5018
  # 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 ...
5019
5020
5021
5022
5023
5024
  # 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...
5025
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
5026
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
5027
5028
5029
5030
5031
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5032
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
5033
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5bc   Joe Perches   checkpatch: creat...
5034
5035
5036
5037
  			if (ERROR("SPACING",
  				  "exactly one space required after that #$1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5038
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
5039
5040
  				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
5041
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
5042
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
5043
5044
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
5045
5046
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5047
5048
5049
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5050
5051
5052
5053
5054
  			}
  		}
  # check for memory barriers without a comment.
  		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
  			if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb99   Joe Perches   checkpatch: make ...
5055
5056
5057
  				WARN("MEMORY_BARRIER",
  				     "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
5058
5059
5060
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
5061
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5062
5063
5064
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
5065
  		}
653d4876b   Andy Whitcroft   update checkpatch...
5066

d4977c78e   Tobias Klauser   checkpatch: warn ...
5067
5068
  # Check that the storage class is at the beginning of a declaration
  		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5069
5070
5071
  			WARN("STORAGE_CLASS",
  			     "storage class should be at the beginning of the declaration
  " . $herecurr)
d4977c78e   Tobias Klauser   checkpatch: warn ...
5072
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
5073
5074
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5075
5076
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5077
5078
5079
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5080
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
5081
  # Check for __inline__ and __inline, prefer inline
2b7ab4539   Joe Perches   checkpatch: don't...
5082
5083
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5084
5085
5086
5087
  			if (WARN("INLINE",
  				 "plain inline is preferred over $1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5088
  				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc1   Joe Perches   checkpatch: add a...
5089
5090
  
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
5091
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
5092
  # Check for __attribute__ packed, prefer __packed
2b7ab4539   Joe Perches   checkpatch: don't...
5093
5094
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5095
5096
5097
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
5098
  		}
39b7e2878   Joe Perches   checkpatch: add a...
5099
  # Check for __attribute__ aligned, prefer __aligned
2b7ab4539   Joe Perches   checkpatch: don't...
5100
5101
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5102
5103
5104
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
5105
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
5106
  # Check for __attribute__ format(printf, prefer __printf
2b7ab4539   Joe Perches   checkpatch: don't...
5107
5108
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5109
5110
5111
5112
  			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...
5113
  				$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...
5114
5115
  
  			}
5f14d3bd8   Joe Perches   checkpatch: prefe...
5116
  		}
6061d949d   Joe Perches   include/ and chec...
5117
  # Check for __attribute__ format(scanf, prefer __scanf
2b7ab4539   Joe Perches   checkpatch: don't...
5118
5119
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5120
5121
5122
5123
  			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...
5124
  				$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...
5125
  			}
6061d949d   Joe Perches   include/ and chec...
5126
  		}
619a908aa   Joe Perches   checkpatch: add e...
5127
5128
5129
5130
5131
5132
5133
5134
5135
  # Check for __attribute__ weak, or __weak declarations (may have link issues)
  		if ($^V && $^V ge 5.10.0 &&
  		    $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);
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
5136
5137
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5138
5139
5140
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
5141
  		}
66c80b607   Joe Perches   checkpatch: Add a...
5142
5143
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5144
5145
5146
5147
  			if (WARN("SIZEOF_PARENTHESIS",
  				 "sizeof $1 should be sizeof($1)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5148
  				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
5149
  			}
66c80b607   Joe Perches   checkpatch: Add a...
5150
  		}
88982fea5   Joe Perches   checkpatch: warn ...
5151
5152
5153
5154
5155
5156
  # 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...
5157
  # check for seq_printf uses that could be seq_puts
066687279   Joe Perches   checkpatch: updat...
5158
  		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d727   Joe Perches   checkpatch: Prefe...
5159
  			my $fmt = get_quoted_string($line, $rawline);
caac1d5fd   Heba Aamer   checkpatch: impro...
5160
5161
  			$fmt =~ s/%%//g;
  			if ($fmt !~ /%/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5162
5163
5164
5165
  				if (WARN("PREFER_SEQ_PUTS",
  					 "Prefer seq_puts to seq_printf
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5166
  					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc1   Joe Perches   checkpatch: add a...
5167
  				}
a6962d727   Joe Perches   checkpatch: Prefe...
5168
5169
  			}
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
5170
  # Check for misused memsets
d1fe9c099   Joe Perches   checkpatch: add s...
5171
5172
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
5173
5174
5175
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
5176
5177
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
5178

554e165cf   Andy Whitcroft   checkpatch: check...
5179
5180
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
5181
5182
5183
5184
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
5185
5186
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
5187
5188
5189
5190
5191
5192
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
98a9bba51   Joe Perches   checkpatch: prefe...
5193
5194
5195
5196
5197
5198
5199
  # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
  		if ($^V && $^V ge 5.10.0 &&
  		    $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
  			if (WARN("PREFER_ETHER_ADDR_COPY",
  				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5200
  				$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...
5201
5202
  			}
  		}
d7c76ba7e   Joe Perches   checkpatch: impro...
5203
  # typecasts on min/max could be min_t/max_t
d1fe9c099   Joe Perches   checkpatch: add s...
5204
5205
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
5206
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
5207
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
5208
5209
5210
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
5211
5212
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
5213
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
5214
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
  					$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...
5226
5227
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
  # check usleep_range arguments
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
  		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
  			my $min = $1;
  			my $max = $7;
  			if ($min eq $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
  				 $min > $max) {
  				WARN("USLEEP_RANGE",
  				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt
  " . "$here
  $stat
  ");
  			}
  		}
823b794ce   Joe Perches   checkpatch: add c...
5249
5250
5251
  # check for naked sscanf
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
6c8bd7076   Joe Perches   checkpatch: avoid...
5252
  		    $line =~ /\bsscanf\b/ &&
823b794ce   Joe Perches   checkpatch: add c...
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
  		    ($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;
  			my $stat_real = raw_line($linenr, 0);
  		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
  				$stat_real = $stat_real . "
  " . raw_line($count, 0);
  			}
  			WARN("NAKED_SSCANF",
  			     "unchecked sscanf return value
  " . "$here
  $stat_real
  ");
  		}
afc819ab0   Joe Perches   checkpatch: prefe...
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
  # check for simple sscanf that should be kstrto<foo>
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
  		    $line =~ /\bsscanf\b/) {
  			my $lc = $stat =~ tr@
  @@;
  			$lc = $lc + $linenr;
  			my $stat_real = raw_line($linenr, 0);
  		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
  				$stat_real = $stat_real . "
  " . raw_line($count, 0);
  			}
  			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 ...
5295
5296
5297
  # check for new externs in .h files.
  		if ($realfile =~ /\.h$/ &&
  		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780d   Joe Perches   checkpatch: make ...
5298
5299
5300
  			if (CHK("AVOID_EXTERNS",
  				"extern prototypes should be avoided in .h files
  " . $herecurr) &&
70dc8a483   Joe Perches   checkpatch: warn ...
5301
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5302
  				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a483   Joe Perches   checkpatch: warn ...
5303
5304
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
5305
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
5306
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
5307
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
5308
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
5309
5310
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
5311
5312
5313
5314
5315
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
5316
5317
5318
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5319
5320
5321
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
5322
5323
5324
5325
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5326
5327
5328
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
5329
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
5330
5331
5332
5333
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5334
5335
5336
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5337
5338
5339
5340
5341
5342
5343
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5344
5345
5346
  				CHK("UNDOCUMENTED_SETUP",
  				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5347
  			}
653d4876b   Andy Whitcroft   update checkpatch...
5348
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5349
5350
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
5351
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5352
5353
5354
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5355
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5356

a640d25ce   Joe Perches   checkpatch: add -...
5357
5358
5359
5360
5361
5362
5363
5364
  # alloc style
  # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
  		if ($^V && $^V ge 5.10.0 &&
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
  			CHK("ALLOC_SIZEOF_STRUCT",
  			    "Prefer $3(sizeof(*$1)...) over $3($4...)
  " . $herecurr);
  		}
60a55369a   Joe Perches   checkpatch: add w...
5365
5366
  # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
  		if ($^V && $^V ge 5.10.0 &&
e367455a9   Joe Perches   checkpatch: emit ...
5367
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
60a55369a   Joe Perches   checkpatch: add w...
5368
5369
5370
5371
5372
  			my $oldfunc = $3;
  			my $a1 = $4;
  			my $a2 = $10;
  			my $newfunc = "kmalloc_array";
  			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a9   Joe Perches   checkpatch: emit ...
5373
5374
5375
5376
5377
5378
5379
5380
  			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_]*$/)) {
60a55369a   Joe Perches   checkpatch: add w...
5381
5382
5383
5384
  				if (WARN("ALLOC_WITH_MULTIPLY",
  					 "Prefer $newfunc over $oldfunc with multiply
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5385
  					$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...
5386
5387
5388
5389
  
  				}
  			}
  		}
972fdea2e   Joe Perches   checkpatch: add c...
5390
5391
5392
5393
5394
5395
5396
  # check for krealloc arg reuse
  		if ($^V && $^V ge 5.10.0 &&
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
  			WARN("KREALLOC_ARG_REUSE",
  			     "Reusing the krealloc arg is almost always a bug
  " . $herecurr);
  		}
5ce59ae0b   Joe Perches   checkpatch: Add c...
5397
5398
5399
5400
5401
5402
  # 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...
5403
5404
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5405
5406
5407
5408
  			if (WARN("ONE_SEMICOLON",
  				 "Statements terminations use 1 semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5409
  				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc1   Joe Perches   checkpatch: add a...
5410
  			}
d1e2ad07e   Joe Perches   checkpatch: add -...
5411
  		}
0ab901918   Joe Perches   checkpatch: add -...
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
  # check for #defines like: 1 << <digit> that could be BIT(digit)
  		if ($line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
  			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)/;
  			}
  		}
e81f239b4   Joe Perches   checkpatch: fix f...
5423
  # check for case / default statements not preceded by break/fallthrough/switch
c34c09a84   Joe Perches   checkpatch: attem...
5424
5425
5426
5427
5428
  		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
  			my $has_break = 0;
  			my $has_statement = 0;
  			my $count = 0;
  			my $prevline = $linenr;
e81f239b4   Joe Perches   checkpatch: fix f...
5429
  			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a84   Joe Perches   checkpatch: attem...
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
  				$prevline--;
  				my $rline = $rawlines[$prevline - 1];
  				my $fline = $lines[$prevline - 1];
  				last if ($fline =~ /^\@\@/);
  				next if ($fline =~ /^\-/);
  				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
  				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
  				next if ($fline =~ /^.[\s$;]*$/);
  				$has_statement = 1;
  				$count++;
  				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
  			}
  			if (!$has_break && $has_statement) {
  				WARN("MISSING_BREAK",
  				     "Possible switch case/default not preceeded by break or fallthrough comment
  " . $herecurr);
  			}
  		}
d1e2ad07e   Joe Perches   checkpatch: add -...
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
  # check for switch/default statements without a break;
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
  		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
  			my $ctx = '';
  			my $herectx = $here . "
  ";
  			my $cnt = statement_rawlines($stat);
  			for (my $n = 0; $n < $cnt; $n++) {
  				$herectx .= raw_line($linenr, $n) . "
  ";
  			}
  			WARN("DEFAULT_NO_BREAK",
  			     "switch default: should use break
  " . $herectx);
caf2a54f1   Joe Perches   scripts/checkpatc...
5463
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5464
  # check for gcc specific __FUNCTION__
d5e616fc1   Joe Perches   checkpatch: add a...
5465
5466
5467
5468
5469
  		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...
5470
  				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc1   Joe Perches   checkpatch: add a...
5471
  			}
13214adf7   Andy Whitcroft   update checkpatch...
5472
  		}
773647a09   Andy Whitcroft   update checkpatch...
5473

62ec818f5   Joe Perches   checkpatch: emit ...
5474
5475
5476
5477
5478
5479
  # 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 ...
5480
5481
5482
5483
5484
5485
  # 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...
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
  # 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...
5514
5515
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5516
5517
5518
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
5519
  		}
6712d8585   Joe Perches   checkpatch: white...
5520

67d0a0754   Joe Perches   kernel.h/checkpat...
5521
5522
  # 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...
5523
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
5524
5525
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
5526
  		}
6712d8585   Joe Perches   checkpatch: white...
5527

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

0f3c5aab5   Joe Perches   checkpatch: add o...
5535
5536
5537
  # check for various structs that are normally const (ops, kgdb, device_tree)
  		my $const_structs = qr{
  				acpi_dock_ops|
79404849e   Emese Revfy   checkpatch.pl: ex...
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
  				address_space_operations|
  				backlight_ops|
  				block_device_operations|
  				dentry_operations|
  				dev_pm_ops|
  				dma_map_ops|
  				extent_io_ops|
  				file_lock_operations|
  				file_operations|
  				hv_ops|
  				ide_dma_ops|
  				intel_dvo_dev_ops|
  				item_operations|
  				iwl_ops|
  				kgdb_arch|
  				kgdb_io|
  				kset_uevent_ops|
  				lock_manager_operations|
  				microcode_ops|
  				mtrr_ops|
  				neigh_ops|
  				nlmsvc_binding|
0f3c5aab5   Joe Perches   checkpatch: add o...
5560
  				of_device_id|
79404849e   Emese Revfy   checkpatch.pl: ex...
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
  				pci_raw_ops|
  				pipe_buf_operations|
  				platform_hibernation_ops|
  				platform_suspend_ops|
  				proto_ops|
  				rpc_pipe_ops|
  				seq_operations|
  				snd_ac97_build_ops|
  				soc_pcmcia_socket_ops|
  				stacktrace_ops|
  				sysfs_ops|
  				tty_operations|
6d07d01b6   Joe Perches   checkpatch: add u...
5573
  				uart_ops|
79404849e   Emese Revfy   checkpatch.pl: ex...
5574
5575
  				usb_mon_operations|
  				wd_ops}x;
6903ffb22   Andy Whitcroft   checkpatch: struc...
5576
  		if ($line !~ /\bconst\b/ &&
0f3c5aab5   Joe Perches   checkpatch: add o...
5577
  		    $line =~ /\bstruct\s+($const_structs)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5578
5579
5580
  			WARN("CONST_STRUCT",
  			     "struct $1 should normally be const
  " .
6903ffb22   Andy Whitcroft   checkpatch: struc...
5581
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
5582
  		}
773647a09   Andy Whitcroft   update checkpatch...
5583
5584
5585
5586
  
  # 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...
5587
5588
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
5589
5590
5591
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
5592
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5593
5594
5595
  			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...
5596
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
5597

52ea85061   Joe Perches   checkpatch: add t...
5598
5599
5600
5601
5602
5603
  # 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...
5604
5605
5606
5607
5608
5609
5610
  # likely/unlikely comparisons similar to "(likely(foo) > 0)"
  		if ($^V && $^V ge 5.10.0 &&
  		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
  			WARN("LIKELY_MISUSE",
  			     "Using $1 should generally have parentheses around the comparison
  " . $herecurr);
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
5611
5612
5613
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5614
5615
5616
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
5617
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5618
5619
5620
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
5621
5622
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
5623
5624
5625
5626
5627
5628
5629
  
  # 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...
5630
5631
5632
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
5633
5634
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
5635

b392c64f5   Joe Perches   checkpatch: match...
5636
5637
  		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...
5638
5639
5640
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
5641
  		}
2435880fe   Joe Perches   checkpatch: add c...
5642

515a235ef   Joe Perches   checkpatch: impro...
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
  # Mode permission misuses where it seems decimal should be octal
  # This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
  		if ($^V && $^V ge 5.10.0 &&
  		    $line =~ /$mode_perms_search/) {
  			foreach my $entry (@mode_permission_funcs) {
  				my $func = $entry->[0];
  				my $arg_pos = $entry->[1];
  
  				my $skip_args = "";
  				if ($arg_pos > 1) {
  					$arg_pos--;
  					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
  				}
  				my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
  				if ($line =~ /$test/) {
  					my $val = $1;
  					$val = $6 if ($skip_args ne "");
  
  					if ($val !~ /^0$/ &&
  					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
  					     length($val) ne 4)) {
  						ERROR("NON_OCTAL_PERMISSIONS",
  						      "Use 4 digit octal (0777) not decimal permissions
  " . $herecurr);
c0a5c8985   Joe Perches   checkpatch: impro...
5667
5668
5669
5670
  					} elsif ($val =~ /^$Octal$/ && (oct($val) & 02)) {
  						ERROR("EXPORTED_WORLD_WRITABLE",
  						      "Exporting writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
515a235ef   Joe Perches   checkpatch: impro...
5671
  					}
2435880fe   Joe Perches   checkpatch: add c...
5672
5673
5674
  				}
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5675
5676
5677
5678
5679
5680
  	}
  
  	# 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...
5681
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
  	# In mailback mode only produce a report in the negative, for
  	# things that appear to be patches.
  	if ($mailback && ($clean == 1 || !$is_patch)) {
  		exit(0);
  	}
  
  	# This is not a patch, and we are are in 'no-patch' mode so
  	# just keep quiet.
  	if (!$chk_patch && !$is_patch) {
  		exit(0);
  	}
  
  	if (!$is_patch) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5695
5696
5697
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
5698
5699
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5700
5701
5702
  		ERROR("MISSING_SIGN_OFF",
  		      "Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
5703
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5704
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
5705
5706
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
5707
5708
5709
5710
5711
5712
  		print "total: $cnt_error errors, $cnt_warn warnings, " .
  			(($check)? "$cnt_chk checks, " : "") .
  			"$cnt_lines lines checked
  ";
  		print "
  " if ($quiet == 0);
f0a594c1c   Andy Whitcroft   update checkpatch...
5713
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5714

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
5715
  	if ($quiet == 0) {
d1fe9c099   Joe Perches   checkpatch: add s...
5716
5717
5718
5719
5720
5721
5722
5723
  
  		if ($^V lt 5.10.0) {
  			print("NOTE: perl $^V is not modern enough to detect all possible issues.
  ");
  			print("An upgrade to at least perl v5.10.0 is suggested.
  
  ");
  		}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
5724
5725
5726
5727
5728
5729
5730
5731
  		# If there were whitespace errors which cleanpatch can fix
  		# then suggest that.
  		if ($rpt_cleaners) {
  			print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
  ";
  			print "      scripts/cleanfile
  
  ";
b0781216e   Mike Frysinger   scripts/checkpatc...
5732
  			$rpt_cleaners = 0;
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
5733
5734
  		}
  	}
91bfe4843   Joe Perches   checkpatch: add -...
5735
5736
  	hash_show_words(\%use_type, "Used");
  	hash_show_words(\%ignore_type, "Ignored");
000d1cc18   Joe Perches   checkpatch.pl: ad...
5737

d752fcc88   Joe Perches   checkpatch: add a...
5738
5739
5740
  	if ($clean == 0 && $fix &&
  	    ("@rawlines" ne "@fixed" ||
  	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d65   Joe Perches   checkpatch: add a...
5741
5742
  		my $newfile = $filename;
  		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5bc   Joe Perches   checkpatch: creat...
5743
5744
  		my $linecount = 0;
  		my $f;
d752fcc88   Joe Perches   checkpatch: add a...
5745
  		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
3705ce5bc   Joe Perches   checkpatch: creat...
5746
5747
5748
5749
5750
5751
5752
5753
  		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...
5754
5755
  					print $f $fixed_line . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
  				}
  			} else {
  				print $f $fixed_line . "
  ";
  			}
  		}
  		close($f);
  
  		if (!$quiet) {
  			print << "EOM";
  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...
  
  EOM
  		}
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
5777
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
5778
5779
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
5780
5781
  	}
  	if ($clean == 0 && $quiet == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5782
5783
5784
5785
5786
5787
  		print << "EOM";
  $vname has style problems, please review.
  
  If any of these errors are false positives, please report
  them to the maintainer, see CHECKPATCH in MAINTAINERS.
  EOM
0a920b5b6   Andy Whitcroft   add a trivial pat...
5788
  	}
13214adf7   Andy Whitcroft   update checkpatch...
5789

0a920b5b6   Andy Whitcroft   add a trivial pat...
5790
5791
  	return $clean;
  }