Blame view

scripts/checkpatch.pl 148 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;
0a920b5b6   Andy Whitcroft   add a trivial pat...
10
11
  
  my $P = $0;
66b47b4a9   Kees Cook   checkpatch: look ...
12
13
  $P =~ s@(.*)/@@g;
  my $D = $1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
14

000d1cc18   Joe Perches   checkpatch.pl: ad...
15
  my $V = '0.32';
0a920b5b6   Andy Whitcroft   add a trivial pat...
16
17
18
19
20
21
22
  
  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...
23
  my $tst_only;
6c72ffaab   Andy Whitcroft   update checkpatch...
24
  my $emacs = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
25
  my $terse = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
26
27
  my $file = 0;
  my $check = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
28
  my $check_orig = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
29
30
  my $summary = 1;
  my $mailback = 0;
13214adf7   Andy Whitcroft   update checkpatch...
31
  my $summary_file = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
32
  my $show_types = 0;
3705ce5bc   Joe Perches   checkpatch: creat...
33
  my $fix = 0;
9624b8d65   Joe Perches   checkpatch: add a...
34
  my $fix_inplace = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
35
  my $root;
c2fdda0df   Andy Whitcroft   update checkpatch...
36
  my %debug;
3445686af   Joe Perches   checkpatch: ignor...
37
  my %camelcase = ();
91bfe4843   Joe Perches   checkpatch: add -...
38
39
40
  my %use_type = ();
  my @use = ();
  my %ignore_type = ();
000d1cc18   Joe Perches   checkpatch.pl: ad...
41
  my @ignore = ();
77f5b10a8   Hannes Eder   checkpatch: make ...
42
  my $help = 0;
000d1cc18   Joe Perches   checkpatch.pl: ad...
43
  my $configuration_file = ".checkpatch.conf";
6cd7f3869   Joe Perches   checkpatch: allow...
44
  my $max_line_length = 80;
d62a201f2   Dave Hansen   checkpatch: enfor...
45
46
  my $ignore_perl_version = 0;
  my $minimum_perl_version = 5.10.0;
56193274e   Vadim Bendebury   checkpatch: allow...
47
  my $min_conf_desc_length = 4;
66b47b4a9   Kees Cook   checkpatch: look ...
48
  my $spelling_file = "$D/spelling.txt";
77f5b10a8   Hannes Eder   checkpatch: make ...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  
  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 -...
66
    --types TYPE(,TYPE2...)    show only these comma separated message types
000d1cc18   Joe Perches   checkpatch.pl: ad...
67
    --ignore TYPE(,TYPE2...)   ignore various comma separated message types
6cd7f3869   Joe Perches   checkpatch: allow...
68
    --max-line-length=n        set the maximum line length, if exceeded, warn
56193274e   Vadim Bendebury   checkpatch: allow...
69
    --min-conf-desc-length=n   set the min description length, if shorter, warn
000d1cc18   Joe Perches   checkpatch.pl: ad...
70
    --show-types               show the message "types" in the output
77f5b10a8   Hannes Eder   checkpatch: make ...
71
72
73
74
75
76
77
78
79
    --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...
80
81
82
83
84
    --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...
85
86
87
    --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...
88
89
    --ignore-perl-version      override checking of perl version.  expect
                               runtime errors.
77f5b10a8   Hannes Eder   checkpatch: make ...
90
91
92
93
94
95
96
    -h, --help, --version      display this help and exit
  
  When FILE is - read standard input.
  EOM
  
  	exit($exitcode);
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  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...
124
  GetOptions(
6c72ffaab   Andy Whitcroft   update checkpatch...
125
  	'q|quiet+'	=> \$quiet,
0a920b5b6   Andy Whitcroft   add a trivial pat...
126
127
128
  	'tree!'		=> \$tree,
  	'signoff!'	=> \$chk_signoff,
  	'patch!'	=> \$chk_patch,
6c72ffaab   Andy Whitcroft   update checkpatch...
129
  	'emacs!'	=> \$emacs,
8905a67c6   Andy Whitcroft   update checkpatch...
130
  	'terse!'	=> \$terse,
77f5b10a8   Hannes Eder   checkpatch: make ...
131
  	'f|file!'	=> \$file,
6c72ffaab   Andy Whitcroft   update checkpatch...
132
133
  	'subjective!'	=> \$check,
  	'strict!'	=> \$check,
000d1cc18   Joe Perches   checkpatch.pl: ad...
134
  	'ignore=s'	=> \@ignore,
91bfe4843   Joe Perches   checkpatch: add -...
135
  	'types=s'	=> \@use,
000d1cc18   Joe Perches   checkpatch.pl: ad...
136
  	'show-types!'	=> \$show_types,
6cd7f3869   Joe Perches   checkpatch: allow...
137
  	'max-line-length=i' => \$max_line_length,
56193274e   Vadim Bendebury   checkpatch: allow...
138
  	'min-conf-desc-length=i' => \$min_conf_desc_length,
6c72ffaab   Andy Whitcroft   update checkpatch...
139
  	'root=s'	=> \$root,
8905a67c6   Andy Whitcroft   update checkpatch...
140
141
  	'summary!'	=> \$summary,
  	'mailback!'	=> \$mailback,
13214adf7   Andy Whitcroft   update checkpatch...
142
  	'summary-file!'	=> \$summary_file,
3705ce5bc   Joe Perches   checkpatch: creat...
143
  	'fix!'		=> \$fix,
9624b8d65   Joe Perches   checkpatch: add a...
144
  	'fix-inplace!'	=> \$fix_inplace,
d62a201f2   Dave Hansen   checkpatch: enfor...
145
  	'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0df   Andy Whitcroft   update checkpatch...
146
  	'debug=s'	=> \%debug,
773647a09   Andy Whitcroft   update checkpatch...
147
  	'test-only=s'	=> \$tst_only,
77f5b10a8   Hannes Eder   checkpatch: make ...
148
149
150
151
152
  	'h|help'	=> \$help,
  	'version'	=> \$help
  ) or help(1);
  
  help(0) if ($help);
0a920b5b6   Andy Whitcroft   add a trivial pat...
153

9624b8d65   Joe Perches   checkpatch: add a...
154
  $fix = 1 if ($fix_inplace);
2ac73b4f6   Joe Perches   checkpatch: make ...
155
  $check_orig = $check;
9624b8d65   Joe Perches   checkpatch: add a...
156

0a920b5b6   Andy Whitcroft   add a trivial pat...
157
  my $exit = 0;
d62a201f2   Dave Hansen   checkpatch: enfor...
158
159
160
161
162
163
164
  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...
165
  if ($#ARGV < 0) {
77f5b10a8   Hannes Eder   checkpatch: make ...
166
167
  	print "$P: no input files
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
168
169
  	exit(1);
  }
91bfe4843   Joe Perches   checkpatch: add -...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  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...
187

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

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

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

15662b3e8   Joe Perches   checkpatch: add a...
318
319
  our $NON_ASCII_UTF8	= qr{
  	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
171ae1a49   Andy Whitcroft   update checkpatch...
320
321
322
323
324
325
326
  	|  \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...
327
328
329
330
  our $UTF8	= qr{
  	[\x09\x0A\x0D\x20-\x7E]              # ASCII
  	| $NON_ASCII_UTF8
  }x;
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
331
  our $typeTypedefs = qr{(?x:
fb9e9096b   Andy Whitcroft   checkpatch: limit...
332
  	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
333
334
  	atomic_t
  )};
691e669ba   Joe Perches   checkpatch.pl: al...
335
  our $logFunctions = qr{(?x:
6e60c02e9   Joe Perches   checkpatch.pl: up...
336
  	printk(?:_ratelimited|_once|)|
7d0b6594e   Jacob Keller   checkpatch: allow...
337
  	(?:[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...
338
  	WARN(?:_RATELIMIT|_ONCE|)|
b05317221   Joe Perches   checkpatch: add <...
339
  	panic|
066687279   Joe Perches   checkpatch: updat...
340
341
  	MODULE_[A-Z_]+|
  	seq_vprintf|seq_printf|seq_puts
691e669ba   Joe Perches   checkpatch.pl: al...
342
  )};
201124755   Joe Perches   checkpatch: valid...
343
344
345
346
347
348
  our $signature_tags = qr{(?xi:
  	Signed-off-by:|
  	Acked-by:|
  	Tested-by:|
  	Reviewed-by:|
  	Reported-by:|
8543ae129   Mugunthan V N   checkpatch: add S...
349
  	Suggested-by:|
201124755   Joe Perches   checkpatch: valid...
350
351
352
  	To:|
  	Cc:
  )};
1813087db   Joe Perches   checkpatch: add t...
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  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...
371
372
  our @typeList = (
  	qr{void},
0c773d9d6   Joe Perches   checkpatch: add s...
373
374
375
376
377
378
379
380
381
  	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...
382
383
384
  	qr{float},
  	qr{double},
  	qr{bool},
8905a67c6   Andy Whitcroft   update checkpatch...
385
386
387
388
389
390
  	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...
391
  	@typeListMisordered,
8905a67c6   Andy Whitcroft   update checkpatch...
392
  );
8716de383   Joe Perches   checkpatch: add t...
393
394
395
396
397
  our @typeListWithAttr = (
  	@typeList,
  	qr{struct\s+$InitAttribute\s+$Ident},
  	qr{union\s+$InitAttribute\s+$Ident},
  );
c45dcabd2   Andy Whitcroft   update checkpatch...
398
399
400
  our @modifierList = (
  	qr{fastcall},
  );
8905a67c6   Andy Whitcroft   update checkpatch...
401

2435880fe   Joe Perches   checkpatch: add c...
402
403
404
405
406
407
408
409
  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...
410
411
412
413
414
415
  #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];
  }
7840a94cd   Wolfram Sang   checkpatch: refac...
416
417
  our $allowed_asm_includes = qr{(?x:
  	irq|
cdcee686e   Sergey Ryazanov   checkpatch: updat...
418
419
420
  	memory|
  	time|
  	reboot
7840a94cd   Wolfram Sang   checkpatch: refac...
421
422
  )};
  # memory.h: ARM has a custom one
66b47b4a9   Kees Cook   checkpatch: look ...
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  # Load common spelling mistakes and build regular expression list.
  my $misspellings;
  my @spelling_list;
  my %spelling_fix;
  open(my $spelling, '<', $spelling_file)
      or die "$P: Can't open $spelling_file for reading: $!
  ";
  while (<$spelling>) {
  	my $line = $_;
  
  	$line =~ s/\s*
  ?$//g;
  	$line =~ s/^\s*//g;
  
  	next if ($line =~ m/^\s*#/);
  	next if ($line =~ m/^\s*$/);
  
  	my ($suspect, $fix) = split(/\|\|/, $line);
  
  	push(@spelling_list, $suspect);
  	$spelling_fix{$suspect} = $fix;
  }
  close($spelling);
  $misspellings = join("|", @spelling_list);
8905a67c6   Andy Whitcroft   update checkpatch...
447
  sub build_types {
d2172eb5b   Andy Whitcroft   checkpatch: possi...
448
449
450
451
452
453
454
455
  	my $mods = "(?x:  
  " . join("|
    ", @modifierList) . "
  )";
  	my $all = "(?x:  
  " . join("|
    ", @typeList) . "
  )";
1813087db   Joe Perches   checkpatch: add t...
456
457
458
459
  	my $Misordered = "(?x:  
  " . join("|
    ", @typeListMisordered) . "
  )";
8716de383   Joe Perches   checkpatch: add t...
460
461
462
463
  	my $allWithAttr = "(?x:  
  " . join("|
    ", @typeListWithAttr) . "
  )";
c8cb2ca37   Andy Whitcroft   checkpatch: types...
464
  	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
8905a67c6   Andy Whitcroft   update checkpatch...
465
  	$NonptrType	= qr{
d2172eb5b   Andy Whitcroft   checkpatch: possi...
466
  			(?:$Modifier\s+|const\s+)*
cf655043d   Andy Whitcroft   update checkpatch...
467
  			(?:
6b48db24e   Andy Whitcroft   checkpatch: typeo...
468
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
469
  				(?:$typeTypedefs\b)|
c45dcabd2   Andy Whitcroft   update checkpatch...
470
  				(?:${all}\b)
cf655043d   Andy Whitcroft   update checkpatch...
471
  			)
c8cb2ca37   Andy Whitcroft   checkpatch: types...
472
  			(?:\s+$Modifier|\s+const)*
8905a67c6   Andy Whitcroft   update checkpatch...
473
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
474
475
476
477
478
479
480
  	$NonptrTypeMisordered	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:${Misordered}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8716de383   Joe Perches   checkpatch: add t...
481
482
483
484
485
486
487
488
489
  	$NonptrTypeWithAttr	= qr{
  			(?:$Modifier\s+|const\s+)*
  			(?:
  				(?:typeof|__typeof__)\s*\([^\)]*\)|
  				(?:$typeTypedefs\b)|
  				(?:${allWithAttr}\b)
  			)
  			(?:\s+$Modifier|\s+const)*
  		  }x;
8905a67c6   Andy Whitcroft   update checkpatch...
490
  	$Type	= qr{
c45dcabd2   Andy Whitcroft   update checkpatch...
491
  			$NonptrType
1574a29f8   Joe Perches   checkpatch: allow...
492
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca37   Andy Whitcroft   checkpatch: types...
493
  			(?:\s+$Inline|\s+$Modifier)*
8905a67c6   Andy Whitcroft   update checkpatch...
494
  		  }x;
1813087db   Joe Perches   checkpatch: add t...
495
496
497
498
499
  	$TypeMisordered	= qr{
  			$NonptrTypeMisordered
  			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
  			(?:\s+$Inline|\s+$Modifier)*
  		  }x;
91cb5195f   Joe Perches   checkpatch: expan...
500
  	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087db   Joe Perches   checkpatch: add t...
501
  	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c6   Andy Whitcroft   update checkpatch...
502
503
  }
  build_types();
6c72ffaab   Andy Whitcroft   update checkpatch...
504

7d2367af0   Joe Perches   checkpatch: sugge...
505
  our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c099   Joe Perches   checkpatch: add s...
506
507
508
509
510
511
  
  # 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...
512
  our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
d7c76ba7e   Joe Perches   checkpatch: impro...
513
  our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
7d2367af0   Joe Perches   checkpatch: sugge...
514

f84223087   Joe Perches   checkpatch: updat...
515
516
517
518
519
  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...
520
521
522
  sub deparenthesize {
  	my ($string) = @_;
  	return "" if (!defined($string));
5b9553abf   Joe Perches   checkpatch: make ...
523
524
525
526
527
  
  	while ($string =~ /^\s*\(.*\)\s*$/) {
  		$string =~ s@^\s*\(\s*@@;
  		$string =~ s@\s*\)\s*$@@;
  	}
7d2367af0   Joe Perches   checkpatch: sugge...
528
  	$string =~ s@\s+@ @g;
5b9553abf   Joe Perches   checkpatch: make ...
529

7d2367af0   Joe Perches   checkpatch: sugge...
530
531
  	return $string;
  }
3445686af   Joe Perches   checkpatch: ignor...
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
  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 ...
552
553
554
  		} 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...
555
556
557
558
559
560
561
562
563
564
  			$camelcase{$1} = 1;
  		}
  	}
  }
  
  my $camelcase_seeded = 0;
  sub seed_camelcase_includes {
  	return if ($camelcase_seeded);
  
  	my $files;
c707a81de   Joe Perches   checkpatch: make ...
565
566
567
568
  	my $camelcase_cache = "";
  	my @include_files = ();
  
  	$camelcase_seeded = 1;
351b2a1fe   Joe Perches   checkpatch: cache...
569

3645e3283   Richard Genoud   checkpatch: fix d...
570
  	if (-e ".git") {
351b2a1fe   Joe Perches   checkpatch: cache...
571
572
  		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 ...
573
  		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686af   Joe Perches   checkpatch: ignor...
574
  	} else {
c707a81de   Joe Perches   checkpatch: make ...
575
  		my $last_mod_date = 0;
3445686af   Joe Perches   checkpatch: ignor...
576
  		$files = `find $root/include -name "*.h"`;
c707a81de   Joe Perches   checkpatch: make ...
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
  		@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...
598
  	}
c707a81de   Joe Perches   checkpatch: make ...
599

3645e3283   Richard Genoud   checkpatch: fix d...
600
  	if (-e ".git") {
c707a81de   Joe Perches   checkpatch: make ...
601
602
603
604
  		$files = `git ls-files "include/*.h"`;
  		@include_files = split('
  ', $files);
  	}
3445686af   Joe Perches   checkpatch: ignor...
605
606
607
  	foreach my $file (@include_files) {
  		seed_camelcase_file($file);
  	}
351b2a1fe   Joe Perches   checkpatch: cache...
608

c707a81de   Joe Perches   checkpatch: make ...
609
  	if ($camelcase_cache ne "") {
351b2a1fe   Joe Perches   checkpatch: cache...
610
  		unlink glob ".checkpatch-camelcase.*";
c707a81de   Joe Perches   checkpatch: make ...
611
612
613
  		open(my $camelcase_file, '>', "$camelcase_cache")
  		    or warn "$P: Can't write '$camelcase_cache' $!
  ";
351b2a1fe   Joe Perches   checkpatch: cache...
614
615
616
617
618
619
  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
  			print $camelcase_file ("$_
  ");
  		}
  		close($camelcase_file);
  	}
3445686af   Joe Perches   checkpatch: ignor...
620
  }
d311cd445   Joe Perches   checkpatch: add t...
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
  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);
  
  	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...
649
  $chk_signoff = 0 if ($file);
00df344fd   Andy Whitcroft   update checkpatch...
650
  my @rawlines = ();
c2fdda0df   Andy Whitcroft   update checkpatch...
651
  my @lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
652
  my @fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
653
654
  my @fixed_inserted = ();
  my @fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
655
  my $fixlinenr = -1;
c2fdda0df   Andy Whitcroft   update checkpatch...
656
  my $vname;
6c72ffaab   Andy Whitcroft   update checkpatch...
657
  for my $filename (@ARGV) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
658
  	my $FILE;
6c72ffaab   Andy Whitcroft   update checkpatch...
659
  	if ($file) {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
660
  		open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
661
662
  			die "$P: $filename: diff failed - $!
  ";
21caa13c0   Andy Whitcroft   checkpatch: fix t...
663
664
  	} elsif ($filename eq '-') {
  		open($FILE, '<&STDIN');
6c72ffaab   Andy Whitcroft   update checkpatch...
665
  	} else {
21caa13c0   Andy Whitcroft   checkpatch: fix t...
666
  		open($FILE, '<', "$filename") ||
6c72ffaab   Andy Whitcroft   update checkpatch...
667
668
  			die "$P: $filename: open failed - $!
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
669
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
670
671
672
673
674
  	if ($filename eq '-') {
  		$vname = 'Your patch';
  	} else {
  		$vname = $filename;
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
675
  	while (<$FILE>) {
6c72ffaab   Andy Whitcroft   update checkpatch...
676
677
678
  		chomp;
  		push(@rawlines, $_);
  	}
21caa13c0   Andy Whitcroft   checkpatch: fix t...
679
  	close($FILE);
c2fdda0df   Andy Whitcroft   update checkpatch...
680
  	if (!process($filename)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
681
682
683
  		$exit = 1;
  	}
  	@rawlines = ();
13214adf7   Andy Whitcroft   update checkpatch...
684
  	@lines = ();
3705ce5bc   Joe Perches   checkpatch: creat...
685
  	@fixed = ();
d752fcc88   Joe Perches   checkpatch: add a...
686
687
  	@fixed_inserted = ();
  	@fixed_deleted = ();
194f66fc9   Joe Perches   checkpatch: add a...
688
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
689
690
691
692
693
  }
  
  exit($exit);
  
  sub top_of_kernel_tree {
6c72ffaab   Andy Whitcroft   update checkpatch...
694
695
696
697
698
699
700
701
702
703
704
705
  	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...
706
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
707
  	return 1;
8f26b8376   Joe Perches   checkpatch: updat...
708
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
709

201124755   Joe Perches   checkpatch: valid...
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
  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...
729
  		$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
730
731
732
733
734
735
736
737
738
739
740
741
742
  		$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...
743
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
744
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
745
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
746
747
748
749
750
751
752
753
754
755
756
757
758
759
  	$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...
760
  	$name = trim($name);
201124755   Joe Perches   checkpatch: valid...
761
  	$name =~ s/^\"|\"$//g;
3705ce5bc   Joe Perches   checkpatch: creat...
762
  	$address = trim($address);
201124755   Joe Perches   checkpatch: valid...
763
764
765
766
767
768
769
770
771
772
773
774
775
776
  
  	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...
777
  sub which {
bd474ca07   Joe Perches   checkpatch: use t...
778
  	my ($bin) = @_;
d311cd445   Joe Perches   checkpatch: add t...
779

bd474ca07   Joe Perches   checkpatch: use t...
780
781
782
783
  	foreach my $path (split(/:/, $ENV{PATH})) {
  		if (-e "$path/$bin") {
  			return "$path/$bin";
  		}
d311cd445   Joe Perches   checkpatch: add t...
784
  	}
d311cd445   Joe Perches   checkpatch: add t...
785

bd474ca07   Joe Perches   checkpatch: use t...
786
  	return "";
d311cd445   Joe Perches   checkpatch: add t...
787
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
788
789
790
791
792
793
794
795
796
797
798
  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...
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
  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...
819
  sub copy_spacing {
773647a09   Andy Whitcroft   update checkpatch...
820
  	(my $res = shift) =~ tr/\t/ /c;
6c72ffaab   Andy Whitcroft   update checkpatch...
821
822
  	return $res;
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
823

4a0df2ef4   Andy Whitcroft   update checkpatch...
824
825
826
827
828
829
830
831
832
833
834
835
  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...
836
837
838
839
840
841
842
843
844
845
846
  my $sanitise_quote = '';
  
  sub sanitise_line_reset {
  	my ($in_comment) = @_;
  
  	if ($in_comment) {
  		$sanitise_quote = '*/';
  	} else {
  		$sanitise_quote = '';
  	}
  }
00df344fd   Andy Whitcroft   update checkpatch...
847
848
849
850
851
  sub sanitise_line {
  	my ($line) = @_;
  
  	my $res = '';
  	my $l = '';
c2fdda0df   Andy Whitcroft   update checkpatch...
852
  	my $qlen = 0;
773647a09   Andy Whitcroft   update checkpatch...
853
854
  	my $off = 0;
  	my $c;
00df344fd   Andy Whitcroft   update checkpatch...
855

773647a09   Andy Whitcroft   update checkpatch...
856
857
858
859
860
861
862
863
864
865
866
867
868
869
  	# 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...
870
  		}
81bc0e020   Andy Whitcroft   checkpatch: handl...
871
  		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a09   Andy Whitcroft   update checkpatch...
872
873
874
875
  			$sanitise_quote = '';
  			substr($res, $off, 2, "$;$;");
  			$off++;
  			next;
c2fdda0df   Andy Whitcroft   update checkpatch...
876
  		}
113f04a83   Daniel Walker   checkpatch: handl...
877
878
879
880
881
882
883
  		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
  			$sanitise_quote = '//';
  
  			substr($res, $off, 2, $sanitise_quote);
  			$off++;
  			next;
  		}
773647a09   Andy Whitcroft   update checkpatch...
884
885
886
887
888
889
890
  
  		# 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...
891
  		}
773647a09   Andy Whitcroft   update checkpatch...
892
893
894
895
  		# Regular quotes.
  		if ($c eq "'" || $c eq '"') {
  			if ($sanitise_quote eq '') {
  				$sanitise_quote = $c;
00df344fd   Andy Whitcroft   update checkpatch...
896

773647a09   Andy Whitcroft   update checkpatch...
897
898
899
900
901
902
  				substr($res, $off, 1, $c);
  				next;
  			} elsif ($sanitise_quote eq $c) {
  				$sanitise_quote = '';
  			}
  		}
00df344fd   Andy Whitcroft   update checkpatch...
903

fae17daed   Andy Whitcroft   checkpatch: comme...
904
905
  		#print "c<$c> SQ<$sanitise_quote>
  ";
773647a09   Andy Whitcroft   update checkpatch...
906
907
  		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
  			substr($res, $off, 1, $;);
113f04a83   Daniel Walker   checkpatch: handl...
908
909
  		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
  			substr($res, $off, 1, $;);
773647a09   Andy Whitcroft   update checkpatch...
910
911
912
913
914
  		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
  			substr($res, $off, 1, 'X');
  		} else {
  			substr($res, $off, 1, $c);
  		}
c2fdda0df   Andy Whitcroft   update checkpatch...
915
  	}
113f04a83   Daniel Walker   checkpatch: handl...
916
917
918
  	if ($sanitise_quote eq '//') {
  		$sanitise_quote = '';
  	}
c2fdda0df   Andy Whitcroft   update checkpatch...
919
  	# The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd2   Andy Whitcroft   update checkpatch...
920
  	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
921
922
923
924
  		my $clean = 'X' x length($1);
  		$res =~ s@\<.*\>@<$clean>@;
  
  	# The whole of a #error is a string.
c45dcabd2   Andy Whitcroft   update checkpatch...
925
  	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
926
  		my $clean = 'X' x length($1);
c45dcabd2   Andy Whitcroft   update checkpatch...
927
  		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0df   Andy Whitcroft   update checkpatch...
928
  	}
00df344fd   Andy Whitcroft   update checkpatch...
929
930
  	return $res;
  }
a6962d727   Joe Perches   checkpatch: Prefe...
931
932
933
934
935
936
  sub get_quoted_string {
  	my ($line, $rawline) = @_;
  
  	return "" if ($line !~ m/(\"[X]+\")/g);
  	return substr($rawline, $-[0], $+[0] - $-[0]);
  }
8905a67c6   Andy Whitcroft   update checkpatch...
937
938
939
940
941
942
  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...
943
  	my $coff_set = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
944

13214adf7   Andy Whitcroft   update checkpatch...
945
  	my $loff = 0;
8905a67c6   Andy Whitcroft   update checkpatch...
946
947
  	my $type = '';
  	my $level = 0;
a27506459   Andy Whitcroft   checkpatch: handl...
948
  	my @stack = ();
cf655043d   Andy Whitcroft   update checkpatch...
949
  	my $p;
8905a67c6   Andy Whitcroft   update checkpatch...
950
951
  	my $c;
  	my $len = 0;
13214adf7   Andy Whitcroft   update checkpatch...
952
953
  
  	my $remainder;
8905a67c6   Andy Whitcroft   update checkpatch...
954
  	while (1) {
a27506459   Andy Whitcroft   checkpatch: handl...
955
  		@stack = (['', 0]) if ($#stack == -1);
773647a09   Andy Whitcroft   update checkpatch...
956
957
  		#warn "CSB: blk<$blk> remain<$remain>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
958
959
960
961
  		# 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...
962
  				last if (!defined $lines[$line]);
c2fdda0df   Andy Whitcroft   update checkpatch...
963
  				next if ($lines[$line] =~ /^-/);
8905a67c6   Andy Whitcroft   update checkpatch...
964
  				$remain--;
13214adf7   Andy Whitcroft   update checkpatch...
965
  				$loff = $len;
c2fdda0df   Andy Whitcroft   update checkpatch...
966
967
  				$blk .= $lines[$line] . "
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
968
969
970
971
972
973
974
  				$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...
975
  			if ($off >= $len) {
8905a67c6   Andy Whitcroft   update checkpatch...
976
977
  				last;
  			}
f74bd1942   Andy Whitcroft   checkpatch: corre...
978
979
980
981
  			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
  				$level++;
  				$type = '#';
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
982
  		}
cf655043d   Andy Whitcroft   update checkpatch...
983
  		$p = $c;
8905a67c6   Andy Whitcroft   update checkpatch...
984
  		$c = substr($blk, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
985
  		$remainder = substr($blk, $off);
8905a67c6   Andy Whitcroft   update checkpatch...
986

773647a09   Andy Whitcroft   update checkpatch...
987
988
  		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>
  ";
4635f4fba   Andy Whitcroft   checkpatch: track...
989
990
991
992
993
994
995
996
997
  
  		# 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...
998
999
1000
1001
1002
  		# Statement ends at the ';' or a close '}' at the
  		# outermost level.
  		if ($level == 0 && $c eq ';') {
  			last;
  		}
13214adf7   Andy Whitcroft   update checkpatch...
1003
  		# An else is really a conditional as long as its not else if
773647a09   Andy Whitcroft   update checkpatch...
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
  		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...
1014
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
  		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...
1025
1026
1027
  				$coff_set = 1;
  				#warn "CSB: mark coff<$coff>
  ";
8905a67c6   Andy Whitcroft   update checkpatch...
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
  			}
  		}
  		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...
1039
1040
1041
  				if (substr($blk, $off + 1, 1) eq ';') {
  					$off++;
  				}
8905a67c6   Andy Whitcroft   update checkpatch...
1042
1043
1044
  				last;
  			}
  		}
f74bd1942   Andy Whitcroft   checkpatch: corre...
1045
1046
1047
1048
1049
1050
1051
1052
  		# Preprocessor commands end at the newline unless escaped.
  		if ($type eq '#' && $c eq "
  " && $p ne "\\") {
  			$level--;
  			$type = '';
  			$off++;
  			last;
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1053
1054
  		$off++;
  	}
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1055
  	# We are truly at the end, so shuffle to the next line.
13214adf7   Andy Whitcroft   update checkpatch...
1056
  	if ($off == $len) {
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
1057
  		$loff = $len + 1;
13214adf7   Andy Whitcroft   update checkpatch...
1058
1059
1060
  		$line++;
  		$remain--;
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1061
1062
1063
1064
1065
1066
1067
1068
  
  	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...
1069
1070
  	#print "coff<$coff> soff<$off> loff<$loff>
  ";
13214adf7   Andy Whitcroft   update checkpatch...
1071
1072
1073
1074
  
  	return ($statement, $condition,
  			$line, $remain + 1, $off - $loff + 1, $level);
  }
cf655043d   Andy Whitcroft   update checkpatch...
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
  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...
1122
1123
1124
1125
1126
  sub ctx_statement_full {
  	my ($linenr, $remain, $off) = @_;
  	my ($statement, $condition, $level);
  
  	my (@chunks);
cf655043d   Andy Whitcroft   update checkpatch...
1127
  	# Grab the first conditional/block pair.
13214adf7   Andy Whitcroft   update checkpatch...
1128
1129
  	($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
773647a09   Andy Whitcroft   update checkpatch...
1130
1131
  	#print "F: c<$condition> s<$statement> remain<$remain>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
1132
1133
1134
1135
1136
1137
1138
1139
  	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...
1140
  	for (;;) {
13214adf7   Andy Whitcroft   update checkpatch...
1141
1142
  		($statement, $condition, $linenr, $remain, $off, $level) =
  				ctx_statement_block($linenr, $remain, $off);
cf655043d   Andy Whitcroft   update checkpatch...
1143
1144
  		#print "C: c<$condition> s<$statement> remain<$remain>
  ";
773647a09   Andy Whitcroft   update checkpatch...
1145
1146
  		last if (!($remain > 0 && $condition =~ /^(?:\s*
  [+-])*\s*(?:else|do)\b/s));
cf655043d   Andy Whitcroft   update checkpatch...
1147
1148
1149
  		#print "C: push
  ";
  		push(@chunks, [ $condition, $statement ]);
13214adf7   Andy Whitcroft   update checkpatch...
1150
1151
1152
  	}
  
  	return ($level, $linenr, @chunks);
8905a67c6   Andy Whitcroft   update checkpatch...
1153
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1154
  sub ctx_block_get {
f0a594c1c   Andy Whitcroft   update checkpatch...
1155
  	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1156
1157
  	my $line;
  	my $start = $linenr - 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1158
1159
1160
1161
  	my $blk = '';
  	my @o;
  	my @c;
  	my @res = ();
f0a594c1c   Andy Whitcroft   update checkpatch...
1162
  	my $level = 0;
4635f4fba   Andy Whitcroft   checkpatch: track...
1163
  	my @stack = ($level);
00df344fd   Andy Whitcroft   update checkpatch...
1164
1165
1166
1167
1168
  	for ($line = $start; $remain > 0; $line++) {
  		next if ($rawlines[$line] =~ /^-/);
  		$remain--;
  
  		$blk .= $rawlines[$line];
4635f4fba   Andy Whitcroft   checkpatch: track...
1169
1170
  
  		# Handle nested #if/#else.
01464f30a   Andy Whitcroft   checkpatch: state...
1171
  		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1172
  			push(@stack, $level);
01464f30a   Andy Whitcroft   checkpatch: state...
1173
  		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1174
  			$level = $stack[$#stack - 1];
01464f30a   Andy Whitcroft   checkpatch: state...
1175
  		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fba   Andy Whitcroft   checkpatch: track...
1176
1177
  			$level = pop(@stack);
  		}
01464f30a   Andy Whitcroft   checkpatch: state...
1178
  		foreach my $c (split(//, $lines[$line])) {
f0a594c1c   Andy Whitcroft   update checkpatch...
1179
1180
1181
1182
1183
1184
  			##print "C<$c>L<$level><$open$close>O<$off>
  ";
  			if ($off > 0) {
  				$off--;
  				next;
  			}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1185

f0a594c1c   Andy Whitcroft   update checkpatch...
1186
1187
1188
1189
1190
1191
1192
  			if ($c eq $close && $level > 0) {
  				$level--;
  				last if ($level == 0);
  			} elsif ($c eq $open) {
  				$level++;
  			}
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
1193

f0a594c1c   Andy Whitcroft   update checkpatch...
1194
  		if (!$outer || $level <= 1) {
00df344fd   Andy Whitcroft   update checkpatch...
1195
  			push(@res, $rawlines[$line]);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1196
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
1197
  		last if ($level == 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1198
  	}
f0a594c1c   Andy Whitcroft   update checkpatch...
1199
  	return ($level, @res);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1200
1201
1202
  }
  sub ctx_block_outer {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1203
1204
  	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
  	return @r;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1205
1206
1207
  }
  sub ctx_block {
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1208
1209
  	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
  	return @r;
653d4876b   Andy Whitcroft   update checkpatch...
1210
1211
  }
  sub ctx_statement {
f0a594c1c   Andy Whitcroft   update checkpatch...
1212
1213
1214
1215
1216
1217
  	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...
1218
  	my ($linenr, $remain) = @_;
f0a594c1c   Andy Whitcroft   update checkpatch...
1219
  	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1220
  }
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1221
1222
1223
1224
1225
  sub ctx_statement_level {
  	my ($linenr, $remain, $off) = @_;
  
  	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
  }
4a0df2ef4   Andy Whitcroft   update checkpatch...
1226
1227
1228
1229
1230
  
  sub ctx_locate_comment {
  	my ($first_line, $end_line) = @_;
  
  	# Catch a comment on the end of the line itself.
beae63324   Andy Whitcroft   checkpatch: comme...
1231
  	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef4   Andy Whitcroft   update checkpatch...
1232
1233
1234
1235
1236
1237
1238
  	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...
1239
1240
1241
  		my $line = $rawlines[$linenr - 1];
  		#warn "           $line
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
  		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...
1264
1265
  	##print "LINE: $rawlines[$end_line - 1 ]
  ";
4a0df2ef4   Andy Whitcroft   update checkpatch...
1266
1267
1268
1269
1270
  	##print "CMMT: $cmt
  ";
  
  	return ($cmt ne '');
  }
4d001e4d8   Andy Whitcroft   checkpatch: repor...
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
  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...
1286
1287
1288
  sub cat_vet {
  	my ($vet) = @_;
  	my ($res, $coded);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1289

6c72ffaab   Andy Whitcroft   update checkpatch...
1290
1291
1292
1293
1294
1295
  	$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...
1296
1297
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1298
  	$res =~ s/$/\$/;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1299

6c72ffaab   Andy Whitcroft   update checkpatch...
1300
  	return $res;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1301
  }
c2fdda0df   Andy Whitcroft   update checkpatch...
1302
  my $av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1303
  my $av_pending;
c2fdda0df   Andy Whitcroft   update checkpatch...
1304
  my @av_paren_type;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1305
  my $av_pend_colon;
c2fdda0df   Andy Whitcroft   update checkpatch...
1306
1307
1308
  
  sub annotate_reset {
  	$av_preprocessor = 0;
cf655043d   Andy Whitcroft   update checkpatch...
1309
1310
  	$av_pending = '_';
  	@av_paren_type = ('E');
1f65f947a   Andy Whitcroft   checkpatch: add c...
1311
  	$av_pend_colon = 'O';
c2fdda0df   Andy Whitcroft   update checkpatch...
1312
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1313
1314
  sub annotate_values {
  	my ($stream, $type) = @_;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1315

6c72ffaab   Andy Whitcroft   update checkpatch...
1316
  	my $res;
1f65f947a   Andy Whitcroft   checkpatch: add c...
1317
  	my $var = '_' x length($stream);
6c72ffaab   Andy Whitcroft   update checkpatch...
1318
  	my $cur = $stream;
c2fdda0df   Andy Whitcroft   update checkpatch...
1319
1320
  	print "$stream
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1321

6c72ffaab   Andy Whitcroft   update checkpatch...
1322
  	while (length($cur)) {
773647a09   Andy Whitcroft   update checkpatch...
1323
  		@av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043d   Andy Whitcroft   update checkpatch...
1324
  		print " <" . join('', @av_paren_type) .
171ae1a49   Andy Whitcroft   update checkpatch...
1325
  				"> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1326
  		if ($cur =~ /^(\s+)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1327
1328
1329
1330
  			print "WS($1)
  " if ($dbg_values > 1);
  			if ($1 =~ /
  / && $av_preprocessor) {
cf655043d   Andy Whitcroft   update checkpatch...
1331
  				$type = pop(@av_paren_type);
c2fdda0df   Andy Whitcroft   update checkpatch...
1332
  				$av_preprocessor = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
1333
  			}
c023e4734   Florian Mickler   checkpatch.pl: fi...
1334
  		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef569   Andy Whitcroft   checkpatch: handl...
1335
1336
1337
  			print "CAST($1)
  " if ($dbg_values > 1);
  			push(@av_paren_type, $type);
addcdcea9   Andy Whitcroft   checkpatch: ensur...
1338
  			$type = 'c';
9446ef569   Andy Whitcroft   checkpatch: handl...
1339

e91b6e263   Andy Whitcroft   checkpatch: types...
1340
  		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1341
1342
  			print "DECLARE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1343
  			$type = 'T';
389a2fe57   Andy Whitcroft   checkpatch: allow...
1344
1345
1346
1347
  		} elsif ($cur =~ /^($Modifier)\s*/) {
  			print "MODIFIER($1)
  " if ($dbg_values > 1);
  			$type = 'T';
c45dcabd2   Andy Whitcroft   update checkpatch...
1348
  		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1349
1350
  			print "DEFINE($1,$2)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1351
  			$av_preprocessor = 1;
171ae1a49   Andy Whitcroft   update checkpatch...
1352
1353
1354
1355
1356
  			push(@av_paren_type, $type);
  			if ($2 ne '') {
  				$av_pending = 'N';
  			}
  			$type = 'E';
c45dcabd2   Andy Whitcroft   update checkpatch...
1357
  		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a49   Andy Whitcroft   update checkpatch...
1358
1359
1360
1361
  			print "UNDEF($1)
  " if ($dbg_values > 1);
  			$av_preprocessor = 1;
  			push(@av_paren_type, $type);
6c72ffaab   Andy Whitcroft   update checkpatch...
1362

c45dcabd2   Andy Whitcroft   update checkpatch...
1363
  		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1364
1365
  			print "PRE_START($1)
  " if ($dbg_values > 1);
c2fdda0df   Andy Whitcroft   update checkpatch...
1366
  			$av_preprocessor = 1;
cf655043d   Andy Whitcroft   update checkpatch...
1367
1368
1369
  
  			push(@av_paren_type, $type);
  			push(@av_paren_type, $type);
171ae1a49   Andy Whitcroft   update checkpatch...
1370
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1371

c45dcabd2   Andy Whitcroft   update checkpatch...
1372
  		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1373
1374
1375
1376
1377
  			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...
1378
  			$type = 'E';
cf655043d   Andy Whitcroft   update checkpatch...
1379

c45dcabd2   Andy Whitcroft   update checkpatch...
1380
  		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1381
1382
1383
1384
1385
1386
1387
1388
1389
  			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...
1390
  			$type = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1391
1392
1393
  
  		} elsif ($cur =~ /^(\\
  )/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1394
1395
  			print "PRECONT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1396

171ae1a49   Andy Whitcroft   update checkpatch...
1397
1398
1399
1400
1401
  		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
  			print "ATTR($1)
  " if ($dbg_values > 1);
  			$av_pending = $type;
  			$type = 'N';
6c72ffaab   Andy Whitcroft   update checkpatch...
1402
  		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1403
1404
  			print "SIZEOF($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1405
  			if (defined $2) {
cf655043d   Andy Whitcroft   update checkpatch...
1406
  				$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1407
1408
  			}
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1409
  		} elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1410
1411
  			print "COND($1)
  " if ($dbg_values > 1);
14b111c15   Andy Whitcroft   checkpatch: condi...
1412
  			$av_pending = 'E';
6c72ffaab   Andy Whitcroft   update checkpatch...
1413
  			$type = 'N';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1414
1415
1416
1417
1418
  		} elsif ($cur =~/^(case)/o) {
  			print "CASE($1)
  " if ($dbg_values > 1);
  			$av_pend_colon = 'C';
  			$type = 'N';
14b111c15   Andy Whitcroft   checkpatch: condi...
1419
  		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1420
1421
  			print "KEYWORD($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1422
1423
1424
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\()/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1425
1426
  			print "PAREN('$1')
  " if ($dbg_values > 1);
cf655043d   Andy Whitcroft   update checkpatch...
1427
1428
  			push(@av_paren_type, $av_pending);
  			$av_pending = '_';
6c72ffaab   Andy Whitcroft   update checkpatch...
1429
1430
1431
  			$type = 'N';
  
  		} elsif ($cur =~ /^(\))/o) {
cf655043d   Andy Whitcroft   update checkpatch...
1432
1433
1434
  			my $new_type = pop(@av_paren_type);
  			if ($new_type ne '_') {
  				$type = $new_type;
c2fdda0df   Andy Whitcroft   update checkpatch...
1435
1436
1437
  				print "PAREN('$1') -> $type
  "
  							if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1438
  			} else {
c2fdda0df   Andy Whitcroft   update checkpatch...
1439
1440
  				print "PAREN('$1')
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1441
  			}
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1442
  		} elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1443
1444
  			print "FUNC($1)
  " if ($dbg_values > 1);
c8cb2ca37   Andy Whitcroft   checkpatch: types...
1445
  			$type = 'V';
cf655043d   Andy Whitcroft   update checkpatch...
1446
  			$av_pending = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1447

8e761b04a   Andy Whitcroft   checkpatch: detec...
1448
1449
  		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
  			if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947a   Andy Whitcroft   checkpatch: add c...
1450
  				$av_pend_colon = 'B';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1451
1452
  			} elsif ($type eq 'E') {
  				$av_pend_colon = 'L';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1453
1454
1455
1456
  			}
  			print "IDENT_COLON($1,$type>$av_pend_colon)
  " if ($dbg_values > 1);
  			$type = 'V';
6c72ffaab   Andy Whitcroft   update checkpatch...
1457
  		} elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1458
1459
  			print "IDENT($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1460
1461
1462
  			$type = 'V';
  
  		} elsif ($cur =~ /^($Assignment)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1463
1464
  			print "ASSIGN($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1465
  			$type = 'N';
cf655043d   Andy Whitcroft   update checkpatch...
1466
  		} elsif ($cur =~/^(;|{|})/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1467
1468
  			print "END($1)
  " if ($dbg_values > 1);
13214adf7   Andy Whitcroft   update checkpatch...
1469
  			$type = 'E';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1470
  			$av_pend_colon = 'O';
8e761b04a   Andy Whitcroft   checkpatch: detec...
1471
1472
1473
1474
  		} elsif ($cur =~/^(,)/) {
  			print "COMMA($1)
  " if ($dbg_values > 1);
  			$type = 'C';
1f65f947a   Andy Whitcroft   checkpatch: add c...
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
  		} 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...
1491

8e761b04a   Andy Whitcroft   checkpatch: detec...
1492
  		} elsif ($cur =~ /^(\[)/o) {
13214adf7   Andy Whitcroft   update checkpatch...
1493
1494
  			print "CLOSE($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1495
  			$type = 'N';
0d413866c   Andy Whitcroft   checkpatch: value...
1496
  		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed81   Andy Whitcroft   checkpatch: varia...
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
  			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...
1509
  		} elsif ($cur =~ /^($Operators)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1510
1511
  			print "OP($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1512
1513
1514
1515
1516
  			if ($1 ne '++' && $1 ne '--') {
  				$type = 'N';
  			}
  
  		} elsif ($cur =~ /(^.)/o) {
c2fdda0df   Andy Whitcroft   update checkpatch...
1517
1518
  			print "C($1)
  " if ($dbg_values > 1);
6c72ffaab   Andy Whitcroft   update checkpatch...
1519
1520
1521
1522
1523
  		}
  		if (defined $1) {
  			$cur = substr($cur, length($1));
  			$res .= $type x length($1);
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
1524
  	}
0a920b5b6   Andy Whitcroft   add a trivial pat...
1525

1f65f947a   Andy Whitcroft   checkpatch: add c...
1526
  	return ($res, $var);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1527
  }
8905a67c6   Andy Whitcroft   update checkpatch...
1528
  sub possible {
13214adf7   Andy Whitcroft   update checkpatch...
1529
  	my ($possible, $line) = @_;
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1530
  	my $notPermitted = qr{(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1531
1532
1533
1534
  		^(?:
  			$Modifier|
  			$Storage|
  			$Type|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1535
1536
1537
  			DEFINE_\S+
  		)$|
  		^(?:
0776e5946   Andy Whitcroft   checkpatch: do is...
1538
1539
1540
1541
1542
  			goto|
  			return|
  			case|
  			else|
  			asm|__asm__|
89a883530   Andy Whitcroft   checkpatch: ## is...
1543
1544
1545
  			do|
  			\#|
  			\#\#|
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1546
  		)(?:\s|$)|
0776e5946   Andy Whitcroft   checkpatch: do is...
1547
  		^(?:typedef|struct|enum)\b
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1548
1549
1550
1551
  	    )}x;
  	warn "CHECK<$possible> ($line)
  " if ($dbg_possible > 2);
  	if ($possible !~ $notPermitted) {
c45dcabd2   Andy Whitcroft   update checkpatch...
1552
1553
1554
1555
1556
1557
1558
  		# 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...
1559
  			for my $modifier (split(' ', $possible)) {
9a974fdbe   Andy Whitcroft   checkpatch: possi...
1560
1561
1562
1563
1564
  				if ($modifier !~ $notPermitted) {
  					warn "MODIFIER: $modifier ($possible) ($line)
  " if ($dbg_possible);
  					push(@modifierList, $modifier);
  				}
d25065865   Andy Whitcroft   checkpatch: possi...
1565
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
1566
1567
1568
1569
1570
1571
  
  		} else {
  			warn "POSSIBLE: $possible ($line)
  " if ($dbg_possible);
  			push(@typeList, $possible);
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
1572
  		build_types();
0776e5946   Andy Whitcroft   checkpatch: do is...
1573
1574
1575
  	} else {
  		warn "NOTPOSS: $possible ($line)
  " if ($dbg_possible > 1);
8905a67c6   Andy Whitcroft   update checkpatch...
1576
1577
  	}
  }
6c72ffaab   Andy Whitcroft   update checkpatch...
1578
  my $prefix = '';
000d1cc18   Joe Perches   checkpatch.pl: ad...
1579
  sub show_type {
cbec18afc   Joe Perches   checkpatch: use a...
1580
  	my ($type) = @_;
91bfe4843   Joe Perches   checkpatch: add -...
1581

cbec18afc   Joe Perches   checkpatch: use a...
1582
1583
1584
  	return defined $use_type{$type} if (scalar keys %use_type > 0);
  
  	return !defined $ignore_type{$type};
000d1cc18   Joe Perches   checkpatch.pl: ad...
1585
  }
f0a594c1c   Andy Whitcroft   update checkpatch...
1586
  sub report {
cbec18afc   Joe Perches   checkpatch: use a...
1587
1588
1589
1590
  	my ($level, $type, $msg) = @_;
  
  	if (!show_type($type) ||
  	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a09   Andy Whitcroft   update checkpatch...
1591
1592
  		return 0;
  	}
000d1cc18   Joe Perches   checkpatch.pl: ad...
1593
1594
  	my $line;
  	if ($show_types) {
cbec18afc   Joe Perches   checkpatch: use a...
1595
1596
  		$line = "$prefix$level:$type: $msg
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1597
  	} else {
cbec18afc   Joe Perches   checkpatch: use a...
1598
1599
  		$line = "$prefix$level: $msg
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
1600
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
1601
1602
1603
  	$line = (split('
  ', $line))[0] . "
  " if ($terse);
13214adf7   Andy Whitcroft   update checkpatch...
1604
  	push(our @report, $line);
773647a09   Andy Whitcroft   update checkpatch...
1605
1606
  
  	return 1;
f0a594c1c   Andy Whitcroft   update checkpatch...
1607
  }
cbec18afc   Joe Perches   checkpatch: use a...
1608

f0a594c1c   Andy Whitcroft   update checkpatch...
1609
  sub report_dump {
13214adf7   Andy Whitcroft   update checkpatch...
1610
  	our @report;
f0a594c1c   Andy Whitcroft   update checkpatch...
1611
  }
000d1cc18   Joe Perches   checkpatch.pl: ad...
1612

d752fcc88   Joe Perches   checkpatch: add a...
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
  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
  		if ($line =~ /^(?:\+\+\+\|\-\-\-)\s+\S+/) {	#new filename
  			$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...
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
  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...
1695
  sub ERROR {
cbec18afc   Joe Perches   checkpatch: use a...
1696
1697
1698
  	my ($type, $msg) = @_;
  
  	if (report("ERROR", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
1699
1700
  		our $clean = 0;
  		our $cnt_error++;
3705ce5bc   Joe Perches   checkpatch: creat...
1701
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
1702
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1703
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1704
1705
  }
  sub WARN {
cbec18afc   Joe Perches   checkpatch: use a...
1706
1707
1708
  	my ($type, $msg) = @_;
  
  	if (report("WARNING", $type, $msg)) {
773647a09   Andy Whitcroft   update checkpatch...
1709
1710
  		our $clean = 0;
  		our $cnt_warn++;
3705ce5bc   Joe Perches   checkpatch: creat...
1711
  		return 1;
773647a09   Andy Whitcroft   update checkpatch...
1712
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1713
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1714
1715
  }
  sub CHK {
cbec18afc   Joe Perches   checkpatch: use a...
1716
1717
1718
  	my ($type, $msg) = @_;
  
  	if ($check && report("CHECK", $type, $msg)) {
6c72ffaab   Andy Whitcroft   update checkpatch...
1719
1720
  		our $clean = 0;
  		our $cnt_chk++;
3705ce5bc   Joe Perches   checkpatch: creat...
1721
  		return 1;
6c72ffaab   Andy Whitcroft   update checkpatch...
1722
  	}
3705ce5bc   Joe Perches   checkpatch: creat...
1723
  	return 0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1724
  }
6ecd96744   Andy Whitcroft   checkpatch: repor...
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
  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...
1751
1752
1753
  		WARN("USE_RELATIVE_PATH",
  		     "use relative pathname instead of absolute in changelog text
  " . $herecurr);
6ecd96744   Andy Whitcroft   checkpatch: repor...
1754
1755
  	}
  }
3705ce5bc   Joe Perches   checkpatch: creat...
1756
1757
  sub trim {
  	my ($string) = @_;
b34c648bb   Joe Perches   checkpatch: bette...
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
  	$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...
1775
1776
1777
  
  	return $string;
  }
52ea85061   Joe Perches   checkpatch: add t...
1778
1779
1780
1781
1782
1783
1784
  sub string_find_replace {
  	my ($string, $find, $replace) = @_;
  
  	$string =~ s/$find/$replace/g;
  
  	return $string;
  }
3705ce5bc   Joe Perches   checkpatch: creat...
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
  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...
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
  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...
1825
  	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c099   Joe Perches   checkpatch: add s...
1826
  }
0a920b5b6   Andy Whitcroft   add a trivial pat...
1827
1828
  sub process {
  	my $filename = shift;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1829
1830
1831
  
  	my $linenr=0;
  	my $prevline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1832
  	my $prevrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1833
  	my $stashline="";
c2fdda0df   Andy Whitcroft   update checkpatch...
1834
  	my $stashrawline="";
0a920b5b6   Andy Whitcroft   add a trivial pat...
1835

4a0df2ef4   Andy Whitcroft   update checkpatch...
1836
  	my $length;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1837
1838
1839
  	my $indent;
  	my $previndent=0;
  	my $stashindent=0;
de7d4f0e1   Andy Whitcroft   update checkpatch...
1840
  	our $clean = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1841
1842
  	my $signoff = 0;
  	my $is_patch = 0;
29ee1b0c6   Joe Perches   checkpatch: ignor...
1843
  	my $in_header_lines = $file ? 0 : 1;
15662b3e8   Joe Perches   checkpatch: add a...
1844
  	my $in_commit_log = 0;		#Scanning lines before patch
13f1937ef   Joe Perches   checkpatch: emit ...
1845
  	my $reported_maintainer_file = 0;
fa64205df   Pasi Savanainen   checkpatch: check...
1846
  	my $non_utf8_charset = 0;
365dd4eaa   Joe Perches   checkpatch: add a...
1847
  	my $last_blank_line = 0;
13214adf7   Andy Whitcroft   update checkpatch...
1848
  	our @report = ();
6c72ffaab   Andy Whitcroft   update checkpatch...
1849
1850
1851
1852
  	our $cnt_lines = 0;
  	our $cnt_error = 0;
  	our $cnt_warn = 0;
  	our $cnt_chk = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1853
1854
1855
1856
1857
1858
  	# 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...
1859
  	my $comment_edge = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1860
  	my $first_line = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
1861
  	my $p1_prefix = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
1862

13214adf7   Andy Whitcroft   update checkpatch...
1863
1864
1865
  	my $prev_values = 'E';
  
  	# suppression flags
773647a09   Andy Whitcroft   update checkpatch...
1866
  	my %suppress_ifbraces;
170d3a226   Andy Whitcroft   checkpatch: handl...
1867
  	my %suppress_whiletrailers;
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1868
  	my %suppress_export;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1869
  	my $suppress_statement = 0;
653d4876b   Andy Whitcroft   update checkpatch...
1870

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

c2fdda0df   Andy Whitcroft   update checkpatch...
1873
  	# Pre-scan the patch sanitizing the lines.
de7d4f0e1   Andy Whitcroft   update checkpatch...
1874
  	# Pre-scan the patch looking for any __setup documentation.
c2fdda0df   Andy Whitcroft   update checkpatch...
1875
  	#
de7d4f0e1   Andy Whitcroft   update checkpatch...
1876
1877
  	my @setup_docs = ();
  	my $setup_docs = 0;
773647a09   Andy Whitcroft   update checkpatch...
1878

d8b077101   Joe Perches   checkpatch: exten...
1879
  	my $camelcase_file_seeded = 0;
773647a09   Andy Whitcroft   update checkpatch...
1880
  	sanitise_line_reset();
c2fdda0df   Andy Whitcroft   update checkpatch...
1881
1882
  	my $line;
  	foreach my $rawline (@rawlines) {
773647a09   Andy Whitcroft   update checkpatch...
1883
1884
  		$linenr++;
  		$line = $rawline;
c2fdda0df   Andy Whitcroft   update checkpatch...
1885

3705ce5bc   Joe Perches   checkpatch: creat...
1886
  		push(@fixed, $rawline) if ($fix);
773647a09   Andy Whitcroft   update checkpatch...
1887
  		if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e1   Andy Whitcroft   update checkpatch...
1888
1889
1890
1891
  			$setup_docs = 0;
  			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
  				$setup_docs = 1;
  			}
773647a09   Andy Whitcroft   update checkpatch...
1892
1893
1894
1895
1896
1897
1898
1899
1900
  			#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...
1901
  			$in_comment = 0;
773647a09   Andy Whitcroft   update checkpatch...
1902
1903
1904
1905
1906
1907
  
  			# 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...
1908
1909
1910
1911
1912
1913
1914
  			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...
1915
  				last if (!defined $rawlines[$ln - 1]);
fae17daed   Andy Whitcroft   checkpatch: comme...
1916
1917
1918
1919
1920
  				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
  				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
  					($edge) = $1;
  					last;
  				}
773647a09   Andy Whitcroft   update checkpatch...
1921
1922
1923
1924
1925
1926
1927
1928
1929
  			}
  			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...
1930
  			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a09   Andy Whitcroft   update checkpatch...
1931
1932
1933
1934
1935
1936
1937
  			{
  				$in_comment = 1;
  			}
  
  			##print "COMMENT:$in_comment edge<$edge> $rawline
  ";
  			sanitise_line_reset($in_comment);
171ae1a49   Andy Whitcroft   update checkpatch...
1938
  		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a09   Andy Whitcroft   update checkpatch...
1939
  			# Standardise the strings and chars within the input to
171ae1a49   Andy Whitcroft   update checkpatch...
1940
  			# simplify matching -- only bother with positive lines.
773647a09   Andy Whitcroft   update checkpatch...
1941
  			$line = sanitise_line($rawline);
de7d4f0e1   Andy Whitcroft   update checkpatch...
1942
  		}
773647a09   Andy Whitcroft   update checkpatch...
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
  		push(@lines, $line);
  
  		if ($realcnt > 1) {
  			$realcnt-- if ($line =~ /^(?:\+| |$)/);
  		} else {
  			$realcnt = 0;
  		}
  
  		#print "==>$rawline
  ";
  		#print "-->$line
  ";
de7d4f0e1   Andy Whitcroft   update checkpatch...
1955
1956
1957
1958
1959
  
  		if ($setup_docs && $line =~ /^\+/) {
  			push(@setup_docs, $line);
  		}
  	}
6c72ffaab   Andy Whitcroft   update checkpatch...
1960
  	$prefix = '';
773647a09   Andy Whitcroft   update checkpatch...
1961
1962
  	$realcnt = 0;
  	$linenr = 0;
194f66fc9   Joe Perches   checkpatch: add a...
1963
  	$fixlinenr = -1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1964
1965
  	foreach my $line (@lines) {
  		$linenr++;
194f66fc9   Joe Perches   checkpatch: add a...
1966
  		$fixlinenr++;
1b5539b1f   Joe Perches   checkpatch: reduc...
1967
1968
  		my $sline = $line;	#copy of $line
  		$sline =~ s/$;/ /g;	#with comments as spaces
0a920b5b6   Andy Whitcroft   add a trivial pat...
1969

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

0a920b5b6   Andy Whitcroft   add a trivial pat...
1972
  #extract the line range in the file after the patch is applied
6c72ffaab   Andy Whitcroft   update checkpatch...
1973
  		if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1974
  			$is_patch = 1;
4a0df2ef4   Andy Whitcroft   update checkpatch...
1975
  			$first_line = $linenr + 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1976
1977
1978
1979
1980
1981
  			$realline=$1-1;
  			if (defined $2) {
  				$realcnt=$3+1;
  			} else {
  				$realcnt=1+1;
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
1982
  			annotate_reset();
13214adf7   Andy Whitcroft   update checkpatch...
1983
  			$prev_values = 'E';
773647a09   Andy Whitcroft   update checkpatch...
1984
  			%suppress_ifbraces = ();
170d3a226   Andy Whitcroft   checkpatch: handl...
1985
  			%suppress_whiletrailers = ();
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
1986
  			%suppress_export = ();
3e469cdc0   Andy Whitcroft   checkpatch: optim...
1987
  			$suppress_statement = 0;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1988
  			next;
0a920b5b6   Andy Whitcroft   add a trivial pat...
1989

4a0df2ef4   Andy Whitcroft   update checkpatch...
1990
1991
1992
  # 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...
1993
  		} elsif ($line =~ /^( |\+|$)/) {
0a920b5b6   Andy Whitcroft   add a trivial pat...
1994
  			$realline++;
d8aaf1214   Andy Whitcroft   update checkpatch...
1995
  			$realcnt-- if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1996

4a0df2ef4   Andy Whitcroft   update checkpatch...
1997
  			# Measure the line length and indent.
c2fdda0df   Andy Whitcroft   update checkpatch...
1998
  			($length, $indent) = line_stats($rawline);
0a920b5b6   Andy Whitcroft   add a trivial pat...
1999
2000
2001
2002
  
  			# Track the previous line.
  			($prevline, $stashline) = ($stashline, $line);
  			($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0df   Andy Whitcroft   update checkpatch...
2003
  			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
773647a09   Andy Whitcroft   update checkpatch...
2004
2005
  			#warn "line<$line>
  ";
6c72ffaab   Andy Whitcroft   update checkpatch...
2006

d8aaf1214   Andy Whitcroft   update checkpatch...
2007
2008
  		} elsif ($realcnt == 1) {
  			$realcnt--;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2009
  		}
cc77cdca5   Andy Whitcroft   checkpatch: corre...
2010
  		my $hunk_line = ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2011
  #make up the handle for any error we report on this line
773647a09   Andy Whitcroft   update checkpatch...
2012
2013
  		$prefix = "$filename:$realline: " if ($emacs && $file);
  		$prefix = "$filename:$linenr: " if ($emacs && !$file);
6c72ffaab   Andy Whitcroft   update checkpatch...
2014
2015
  		$here = "#$linenr: " if (!$file);
  		$here = "#$realline: " if ($file);
773647a09   Andy Whitcroft   update checkpatch...
2016

2ac73b4f6   Joe Perches   checkpatch: make ...
2017
  		my $found_file = 0;
773647a09   Andy Whitcroft   update checkpatch...
2018
  		# extract the filename as it passes
3bf9a009f   Rabin Vincent   checkpatch: check...
2019
2020
  		if ($line =~ /^diff --git.*?(\S+)$/) {
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2021
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2022
  			$in_commit_log = 0;
2ac73b4f6   Joe Perches   checkpatch: make ...
2023
  			$found_file = 1;
3bf9a009f   Rabin Vincent   checkpatch: check...
2024
  		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a09   Andy Whitcroft   update checkpatch...
2025
  			$realfile = $1;
2b7ab4539   Joe Perches   checkpatch: don't...
2026
  			$realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a08   Joe Perches   checkpatch: updat...
2027
  			$in_commit_log = 0;
1e8557269   Wolfram Sang   checkpatch: Add w...
2028
2029
  
  			$p1_prefix = $1;
e2f7aa4b8   Andy Whitcroft   checkpatch: do no...
2030
2031
  			if (!$file && $tree && $p1_prefix ne '' &&
  			    -e "$root/$p1_prefix") {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2032
2033
2034
  				WARN("PATCH_PREFIX",
  				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch
  ");
1e8557269   Wolfram Sang   checkpatch: Add w...
2035
  			}
773647a09   Andy Whitcroft   update checkpatch...
2036

c1ab33269   Andy Whitcroft   checkpatch: inclu...
2037
  			if ($realfile =~ m@^include/asm/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2038
2039
2040
2041
  				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...
2042
  			}
2ac73b4f6   Joe Perches   checkpatch: make ...
2043
2044
2045
2046
2047
2048
2049
2050
2051
  			$found_file = 1;
  		}
  
  		if ($found_file) {
  			if ($realfile =~ m@^(drivers/net/|net/)@) {
  				$check = 1;
  			} else {
  				$check = $check_orig;
  			}
773647a09   Andy Whitcroft   update checkpatch...
2052
2053
  			next;
  		}
389834b68   Randy Dunlap   checkpatch: produ...
2054
  		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2055

c2fdda0df   Andy Whitcroft   update checkpatch...
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
  		my $hereline = "$here
  $rawline
  ";
  		my $herecurr = "$here
  $rawline
  ";
  		my $hereprev = "$here
  $prevrawline
  $rawline
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
2066

6c72ffaab   Andy Whitcroft   update checkpatch...
2067
  		$cnt_lines++ if ($realcnt != 0);
3bf9a009f   Rabin Vincent   checkpatch: check...
2068
2069
2070
2071
  # Check for incorrect file permissions
  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
  			my $permhere = $here . "FILE: $realfile
  ";
04db4d25d   Joe Perches   checkpatch: compl...
2072
2073
  			if ($realfile !~ m@scripts/@ &&
  			    $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2074
2075
2076
  				ERROR("EXECUTE_PERMISSIONS",
  				      "do not set execute permissions for source files
  " . $permhere);
3bf9a009f   Rabin Vincent   checkpatch: check...
2077
2078
  			}
  		}
201124755   Joe Perches   checkpatch: valid...
2079
  # Check the patch for a signoff:
d8aaf1214   Andy Whitcroft   update checkpatch...
2080
  		if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
2081
  			$signoff++;
15662b3e8   Joe Perches   checkpatch: add a...
2082
  			$in_commit_log = 0;
201124755   Joe Perches   checkpatch: valid...
2083
2084
2085
  		}
  
  # Check signature styles
270c49a08   Joe Perches   checkpatch: updat...
2086
  		if (!$in_header_lines &&
ce0338df3   Joe Perches   checkpatch: test ...
2087
  		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
201124755   Joe Perches   checkpatch: valid...
2088
2089
2090
2091
2092
  			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 ...
2093
2094
2095
2096
2097
  			if ($sign_off !~ /$signature_tags/) {
  				WARN("BAD_SIGN_OFF",
  				     "Non-standard signature: $sign_off
  " . $herecurr);
  			}
201124755   Joe Perches   checkpatch: valid...
2098
  			if (defined $space_before && $space_before ne "") {
3705ce5bc   Joe Perches   checkpatch: creat...
2099
2100
2101
2102
  				if (WARN("BAD_SIGN_OFF",
  					 "Do not use whitespace before $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2103
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2104
2105
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2106
2107
  			}
  			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5bc   Joe Perches   checkpatch: creat...
2108
2109
2110
2111
  				if (WARN("BAD_SIGN_OFF",
  					 "'$ucfirst_sign_off' is the preferred signature form
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2112
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2113
2114
  					    "$ucfirst_sign_off $email";
  				}
201124755   Joe Perches   checkpatch: valid...
2115
2116
  			}
  			if (!defined $space_after || $space_after ne " ") {
3705ce5bc   Joe Perches   checkpatch: creat...
2117
2118
2119
2120
  				if (WARN("BAD_SIGN_OFF",
  					 "Use a single space after $ucfirst_sign_off
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2121
  					$fixed[$fixlinenr] =
3705ce5bc   Joe Perches   checkpatch: creat...
2122
2123
  					    "$ucfirst_sign_off $email";
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2124
  			}
201124755   Joe Perches   checkpatch: valid...
2125
2126
2127
2128
  
  			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...
2129
2130
2131
  				ERROR("BAD_SIGN_OFF",
  				      "Unrecognized email address: '$email'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2132
2133
2134
2135
2136
2137
2138
2139
2140
  			} 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...
2141
2142
2143
  					WARN("BAD_SIGN_OFF",
  					     "email address '$email' might be better as '$suggested_email$comment'
  " . $herecurr);
201124755   Joe Perches   checkpatch: valid...
2144
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2145
  			}
7e51f1979   Joe Perches   checkpatch: check...
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
  
  # 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...
2158
  		}
9b3189eb4   Joe Perches   checkpatch: check...
2159
2160
2161
2162
2163
2164
  # 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...
2165
2166
2167
2168
2169
2170
  # 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);
  		}
d311cd445   Joe Perches   checkpatch: add t...
2171
2172
2173
  # Check for improperly formed commit descriptions
  		if ($in_commit_log &&
  		    $line =~ /\bcommit\s+[0-9a-f]{5,}/i &&
668817350   Joe Perches   checkpatch: allow...
2174
2175
2176
2177
  		    !($line =~ /\b[Cc]ommit [0-9a-f]{12,40} \("/ ||
  		      ($line =~ /\b[Cc]ommit [0-9a-f]{12,40}\s*$/ &&
  		       defined $rawlines[$linenr] &&
  		       $rawlines[$linenr] =~ /^\s*\("/))) {
d311cd445   Joe Perches   checkpatch: add t...
2178
2179
2180
2181
2182
2183
2184
  			$line =~ /\b(c)ommit\s+([0-9a-f]{5,})/i;
  			my $init_char = $1;
  			my $orig_commit = lc($2);
  			my $id = '01234567890ab';
  			my $desc = 'commit description';
  		        ($id, $desc) = git_commit_info($orig_commit, $id, $desc);
  			ERROR("GIT_COMMIT_ID",
3f6316b43   Joe Perches   checkpatch: relax...
2185
2186
  			      "Please use 12 or more chars for the git commit ID like: '${init_char}ommit $id (\"$desc\")'
  " . $herecurr);
d311cd445   Joe Perches   checkpatch: add t...
2187
  		}
13f1937ef   Joe Perches   checkpatch: emit ...
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
  # 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...
2199
  # Check for wrappage within a valid hunk of the file
8905a67c6   Andy Whitcroft   update checkpatch...
2200
  		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2201
2202
2203
  			ERROR("CORRUPTED_PATCH",
  			      "patch seems to be corrupt (line wrapped?)
  " .
6c72ffaab   Andy Whitcroft   update checkpatch...
2204
  				$herecurr) if (!$emitted_corrupt++);
de7d4f0e1   Andy Whitcroft   update checkpatch...
2205
  		}
6ecd96744   Andy Whitcroft   checkpatch: repor...
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
  # 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...
2219
2220
  # 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...
2221
2222
2223
2224
2225
2226
2227
  		    $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 ...
2228
2229
2230
  			CHK("INVALID_UTF8",
  			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8
  " . $hereptr);
00df344fd   Andy Whitcroft   update checkpatch...
2231
  		}
15662b3e8   Joe Perches   checkpatch: add a...
2232
2233
2234
  # 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...
2235
2236
  		    !($rawline =~ /^\s+\S/ ||
  		      $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
15662b3e8   Joe Perches   checkpatch: add a...
2237
2238
2239
  			$in_header_lines = 0;
  			$in_commit_log = 1;
  		}
fa64205df   Pasi Savanainen   checkpatch: check...
2240
2241
2242
2243
2244
2245
2246
2247
2248
  # 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...
2249
  		    $rawline =~ /$NON_ASCII_UTF8/) {
fa64205df   Pasi Savanainen   checkpatch: check...
2250
  			WARN("UTF8_BEFORE_PATCH",
15662b3e8   Joe Perches   checkpatch: add a...
2251
2252
2253
  			    "8-bit UTF-8 used in possible commit log
  " . $herecurr);
  		}
66b47b4a9   Kees Cook   checkpatch: look ...
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
  # Check for various typo / spelling mistakes
  		if ($in_commit_log || $line =~ /^\+/) {
  			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:$|[^a-z@])/gi) {
  				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...
2271
2272
  # ignore non-hunk lines and lines being removed
  		next if (!$hunk_line || $line =~ /^-/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2273

0a920b5b6   Andy Whitcroft   add a trivial pat...
2274
  #trailing whitespace
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2275
  		if ($line =~ /^\+.*\015/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2276
2277
2278
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d5e616fc1   Joe Perches   checkpatch: add a...
2279
2280
2281
2282
  			if (ERROR("DOS_LINE_ENDINGS",
  				  "DOS line endings
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2283
  				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
2284
  			}
c2fdda0df   Andy Whitcroft   update checkpatch...
2285
2286
2287
2288
  		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2289
2290
2291
2292
  			if (ERROR("TRAILING_WHITESPACE",
  				  "trailing whitespace
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2293
  				$fixed[$fixlinenr] =~ s/\s+$//;
3705ce5bc   Joe Perches   checkpatch: creat...
2294
  			}
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2295
  			$rpt_cleaners = 1;
0a920b5b6   Andy Whitcroft   add a trivial pat...
2296
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2297

4783f894d   Josh Triplett   checkpatch.pl: ch...
2298
  # Check for FSF mailing addresses.
109d8cb20   Alexander Duyck   checkpatch: only ...
2299
  		if ($rawline =~ /\bwrite to the Free/i ||
3e2232f2d   Joe Perches   checkpatch: updat...
2300
2301
  		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
  		    $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894d   Josh Triplett   checkpatch.pl: ch...
2302
2303
2304
2305
2306
2307
  			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...
2308
2309
  				     "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...
2310
  		}
3354957a4   Andi Kleen   checkpatch: add c...
2311
  # check for Kconfig help text having a real description
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2312
2313
  # 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...
2314
  		if ($realfile =~ /Kconfig/ &&
8d73e0e7d   Joe Perches   checkpatch: quiet...
2315
  		    $line =~ /^\+\s*config\s+/) {
3354957a4   Andi Kleen   checkpatch: add c...
2316
  			my $length = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2317
2318
2319
  			my $cnt = $realcnt;
  			my $ln = $linenr + 1;
  			my $f;
a13858033   Andy Whitcroft   checkpatch: only ...
2320
  			my $is_start = 0;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2321
  			my $is_end = 0;
a13858033   Andy Whitcroft   checkpatch: only ...
2322
  			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2323
2324
2325
  				$f = $lines[$ln - 1];
  				$cnt-- if ($lines[$ln - 1] !~ /^-/);
  				$is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2326
2327
  
  				next if ($f =~ /^-/);
8d73e0e7d   Joe Perches   checkpatch: quiet...
2328
  				last if (!$file && $f =~ /^\@\@/);
a13858033   Andy Whitcroft   checkpatch: only ...
2329

8d73e0e7d   Joe Perches   checkpatch: quiet...
2330
  				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2331
  					$is_start = 1;
8d73e0e7d   Joe Perches   checkpatch: quiet...
2332
  				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
a13858033   Andy Whitcroft   checkpatch: only ...
2333
2334
  					$length = -1;
  				}
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2335
  				$f =~ s/^.//;
3354957a4   Andi Kleen   checkpatch: add c...
2336
2337
2338
  				$f =~ s/#.*//;
  				$f =~ s/^\s+//;
  				next if ($f =~ /^$/);
9fe287d79   Andy Whitcroft   checkpatch: ensur...
2339
2340
2341
2342
  				if ($f =~ /^\s*config\s/) {
  					$is_end = 1;
  					last;
  				}
3354957a4   Andi Kleen   checkpatch: add c...
2343
2344
  				$length++;
  			}
56193274e   Vadim Bendebury   checkpatch: allow...
2345
2346
2347
2348
2349
  			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 ...
2350
2351
  			#print "is_start<$is_start> is_end<$is_end> length<$length>
  ";
3354957a4   Andi Kleen   checkpatch: add c...
2352
  		}
1ba8dfd17   Kees Cook   checkpatch: warn ...
2353
2354
2355
2356
2357
2358
2359
  # 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
  ");
  		}
c68e58783   Arnaud Lacombe   script/checkpatch...
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
  		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...
2374
  # check for DT compatible documentation
7dd05b38e   Florian Vaussard   checkpatch: check...
2375
2376
2377
  		if (defined $root &&
  			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
  			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
bff5da433   Rob Herring   checkpatch: add D...
2378
  			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
cc93319b5   Florian Vaussard   checkpatch: impro...
2379
2380
  			my $dt_path = $root . "/Documentation/devicetree/bindings/";
  			my $vp_file = $dt_path . "vendor-prefixes.txt";
bff5da433   Rob Herring   checkpatch: add D...
2381
2382
  			foreach my $compat (@compats) {
  				my $compat2 = $compat;
185d566bc   Rob Herring   checkpatch: fix w...
2383
2384
2385
2386
  				$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...
2387
2388
2389
2390
2391
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
  					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path
  " . $herecurr);
  				}
4fbf32a69   Florian Vaussard   checkpatch: fix s...
2392
2393
  				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
  				my $vendor = $1;
cc93319b5   Florian Vaussard   checkpatch: impro...
2394
  				`grep -Eq "^$vendor\\b" $vp_file`;
bff5da433   Rob Herring   checkpatch: add D...
2395
2396
  				if ( $? >> 8 ) {
  					WARN("UNDOCUMENTED_DT_STRING",
cc93319b5   Florian Vaussard   checkpatch: impro...
2397
2398
  					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file
  " . $herecurr);
bff5da433   Rob Herring   checkpatch: add D...
2399
2400
2401
  				}
  			}
  		}
5368df20f   Andy Whitcroft   checkpatch: check...
2402
  # check we are in a valid source file if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
2403
  		next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/);
5368df20f   Andy Whitcroft   checkpatch: check...
2404

6cd7f3869   Joe Perches   checkpatch: allow...
2405
  #line length limit
c45dcabd2   Andy Whitcroft   update checkpatch...
2406
  		if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0d   Andy Whitcroft   checkpatch: allow...
2407
  		    $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
0fccc6221   Joe Perches   checkpatch: fix d...
2408
  		    !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
8bbea968f   Joe Perches   checkpatch: add m...
2409
  		    $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
6cd7f3869   Joe Perches   checkpatch: allow...
2410
  		    $length > $max_line_length)
c45dcabd2   Andy Whitcroft   update checkpatch...
2411
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
2412
  			WARN("LONG_LINE",
6cd7f3869   Joe Perches   checkpatch: allow...
2413
2414
  			     "line over $max_line_length characters
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2415
  		}
ca56dc098   Josh Triplett   checkpatch: check...
2416
  # Check for user-visible strings broken across lines, which breaks the ability
8c5fcd24a   Joe Perches   checkpatch: more ...
2417
2418
2419
  # 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
ca56dc098   Josh Triplett   checkpatch: check...
2420
2421
  		if ($line =~ /^\+\s*"/ &&
  		    $prevline =~ /"\s*$/ &&
8c5fcd24a   Joe Perches   checkpatch: more ...
2422
  		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
ca56dc098   Josh Triplett   checkpatch: check...
2423
2424
2425
2426
  			WARN("SPLIT_STRING",
  			     "quoted string split across lines
  " . $hereprev);
  		}
ece9659f1   Dan Carpenter   checkpatch: warn ...
2427
2428
2429
2430
2431
2432
  # check for missing a space in a string concatination
  		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
  			WARN('MISSING_SPACE',
  			     "break quoted strings at a space character
  " . $hereprev);
  		}
5e79d96ee   Joe Perches   checkpatch: warn ...
2433
2434
2435
  # check for spaces before a quoted newline
  		if ($rawline =~ /^.*\".*\s\
  /) {
3705ce5bc   Joe Perches   checkpatch: creat...
2436
2437
2438
2439
  			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
  				 "unnecessary whitespace before a quoted newline
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2440
2441
2442
  				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\
  /$1\
  /;
3705ce5bc   Joe Perches   checkpatch: creat...
2443
  			}
5e79d96ee   Joe Perches   checkpatch: warn ...
2444
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
2445
2446
  # 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...
2447
2448
2449
  			WARN("MISSING_EOF_NEWLINE",
  			     "adding a line without newline at end of file
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
2450
  		}
42e41c54d   Mike Frysinger   checkpatch: add s...
2451
2452
2453
2454
2455
2456
  # 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...
2457
2458
2459
  				ERROR("LO_MACRO",
  				      "use the LO() macro, not (... & 0xFFFF)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2460
2461
2462
2463
2464
  			}
  			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
  				my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2465
2466
2467
  				ERROR("HI_MACRO",
  				      "use the HI() macro, not (... >> 16)
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2468
2469
  			}
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
2470
  # check we are in a valid source file C or perl if not then ignore this hunk
de4c924c2   Geert Uytterhoeven   checkpatch: enabl...
2471
  		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b6   Andy Whitcroft   add a trivial pat...
2472
2473
2474
  
  # at the beginning of a line any tabs must come first and anything
  # more than 8 must use tabs.
c2fdda0df   Andy Whitcroft   update checkpatch...
2475
2476
2477
2478
2479
  		if ($rawline =~ /^\+\s* \t\s*\S/ ||
  		    $rawline =~ /^\+\s*        \s*/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
2480
  			$rpt_cleaners = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
2481
2482
2483
2484
  			if (ERROR("CODE_INDENT",
  				  "code indent should use tabs where possible
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2485
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
2486
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
2487
  		}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
2488
2489
2490
2491
2492
  # check for space before tabs.
  		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2493
2494
2495
2496
  			if (WARN("SPACE_BEFORE_TAB",
  				"please, no space before tabs
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2497
  				while ($fixed[$fixlinenr] =~
d2207ccbc   Joe Perches   checkpatch: remov...
2498
  					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc9   Joe Perches   checkpatch: add a...
2499
  				while ($fixed[$fixlinenr] =~
c76f4cb3d   Joe Perches   checkpatch: impro...
2500
  					   s/(^\+.*) +\t/$1\t/) {}
3705ce5bc   Joe Perches   checkpatch: creat...
2501
  			}
08e443656   Alberto Panizzo   checkpatch.pl: wa...
2502
  		}
d1fe9c099   Joe Perches   checkpatch: add s...
2503
2504
2505
2506
2507
2508
2509
2510
2511
  # 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...
2512
  		    $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...
2513
2514
2515
2516
2517
2518
  			$prevline =~ /^\+(\t*)(.*)$/;
  			my $oldindent = $1;
  			my $rest = $2;
  
  			my $pos = pos_last_openparen($rest);
  			if ($pos >= 0) {
b34a26f31   Joe Perches   checkpatch: Updat...
2519
2520
  				$line =~ /^(\+| )([ \t]*)/;
  				my $newindent = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
2521
2522
2523
2524
2525
2526
2527
2528
  
  				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...
2529
2530
2531
2532
2533
  
  					if (CHK("PARENTHESIS_ALIGNMENT",
  						"Alignment should match open parenthesis
  " . $hereprev) &&
  					    $fix && $line =~ /^\+/) {
194f66fc9   Joe Perches   checkpatch: add a...
2534
  						$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
2535
2536
  						    s/^\+[ \t]*/\+$goodtabindent/;
  					}
d1fe9c099   Joe Perches   checkpatch: add s...
2537
2538
2539
  				}
  			}
  		}
308cc8d8f   Joe Perches   checkpatch: fix f...
2540
  		if ($line =~ /^\+.*\(\s*$Type\s*\)[ \t]+(?!$Assignment|$Arithmetic|{)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
2541
  			if (CHK("SPACING",
f27c95db1   Joe Perches   checkpatch: impro...
2542
2543
  				"No space is necessary after a cast
  " . $herecurr) &&
3705ce5bc   Joe Perches   checkpatch: creat...
2544
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2545
  				$fixed[$fixlinenr] =~
f27c95db1   Joe Perches   checkpatch: impro...
2546
  				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5bc   Joe Perches   checkpatch: creat...
2547
  			}
aad4f6149   Joe Perches   checkpatch: add -...
2548
  		}
058806007   Joe Perches   checkpatch: check...
2549
  		if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd61   Joe Perches   checkpatch: impro...
2550
  		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c6   Joe Perches   checkpatch: ignor...
2551
2552
  		    $rawline =~ /^\+[ \t]*\*/ &&
  		    $realline > 2) {
058806007   Joe Perches   checkpatch: check...
2553
2554
2555
2556
2557
2558
  			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 ...
2559
2560
  		    $prevrawline =~ /^\+[ \t]*\/\*/ &&		#starting /*
  		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
61135e966   Joe Perches   checkpatch: fix n...
2561
  		    $rawline =~ /^\+/ &&			#line is new
a605e32eb   Joe Perches   checkpatch: warn ...
2562
2563
2564
2565
2566
2567
2568
  		    $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...
2569
2570
2571
2572
  		    $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...
2573
2574
2575
2576
  			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
  			     "networking block comments put the trailing */ on a separate line
  " . $herecurr);
  		}
7f6191914   Joe Perches   checkpatch: add t...
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
  # 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...
2589
2590
2591
2592
  			if (CHK("LINE_SPACING",
  				"Please use a blank line after function/struct/union/enum declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2593
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
2594
  			}
7f6191914   Joe Perches   checkpatch: add t...
2595
  		}
365dd4eaa   Joe Perches   checkpatch: add a...
2596
2597
2598
2599
  # check for multiple consecutive blank lines
  		if ($prevline =~ /^[\+ ]\s*$/ &&
  		    $line =~ /^\+\s*$/ &&
  		    $last_blank_line != ($linenr - 1)) {
d752fcc88   Joe Perches   checkpatch: add a...
2600
2601
2602
2603
  			if (CHK("LINE_SPACING",
  				"Please don't use multiple blank lines
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2604
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
2605
  			}
365dd4eaa   Joe Perches   checkpatch: add a...
2606
2607
  			$last_blank_line = $linenr;
  		}
3b617e3b8   Joe Perches   checkpatch: net a...
2608
  # check for missing blank lines after declarations
3f7bac031   Joe Perches   checkpatch: alway...
2609
2610
2611
  		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
  			# actual declarations
  		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd37   Joe Perches   checkpatch: fix f...
2612
2613
  			# function pointer declarations
  		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
  			# 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...
2626
2627
  			# function pointer declarations
  		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2628
2629
2630
2631
2632
  			# 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...
2633
  		      $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3f7bac031   Joe Perches   checkpatch: alway...
2634
2635
2636
2637
2638
2639
2640
2641
  			# 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...
2642
2643
2644
2645
  			if (WARN("LINE_SPACING",
  				 "Missing a blank line after declarations
  " . $hereprev) &&
  			    $fix) {
f2d7e4d43   Joe Perches   checkpatch: add f...
2646
  				fix_insert_line($fixlinenr, "\+");
d752fcc88   Joe Perches   checkpatch: add a...
2647
  			}
3b617e3b8   Joe Perches   checkpatch: net a...
2648
  		}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2649
  # check for spaces at the beginning of a line.
6b4c5bebc   Andy Whitcroft   checkpatch: fix r...
2650
2651
2652
2653
  # Exceptions:
  #  1) within comments
  #  2) indented preprocessor commands
  #  3) hanging labels
3705ce5bc   Joe Perches   checkpatch: creat...
2654
  		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2655
2656
2657
  			my $herevet = "$here
  " . cat_vet($rawline) . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
2658
2659
2660
2661
  			if (WARN("LEADING_SPACE",
  				 "please, no spaces at the start of a line
  " . $herevet) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
2662
  				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5bc   Joe Perches   checkpatch: creat...
2663
  			}
5f7ddae61   Raffaele Recalcati   checkpatch: fix h...
2664
  		}
b9ea10d69   Andy Whitcroft   checkpatch: perfo...
2665
2666
  # 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 ...
2667
  # check indentation of any line with a bare else
840080a08   Joe Perches   checkpatch: add e...
2668
  # (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f9   Joe Perches   checkpatch: warn ...
2669
2670
2671
  # 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...
2672
2673
2674
2675
  			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 ...
2676
2677
2678
2679
2680
  				WARN("UNNECESSARY_ELSE",
  				     "else is not generally useful after a break or return
  " . $hereprev);
  			}
  		}
c00df19a5   Joe Perches   checkpatch: warn ...
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
  # 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 ...
2691
2692
2693
2694
2695
2696
  # 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...
2697
  # check for RCS/CVS revision markers
cf655043d   Andy Whitcroft   update checkpatch...
2698
  		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2699
2700
2701
  			WARN("CVS_KEYWORD",
  			     "CVS style keyword markers, these will _not_ be updated
  ". $herecurr);
c2fdda0df   Andy Whitcroft   update checkpatch...
2702
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
2703

42e41c54d   Mike Frysinger   checkpatch: add s...
2704
2705
2706
2707
2708
  # 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...
2709
2710
2711
  			ERROR("CSYNC",
  			      "use the CSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2712
2713
2714
2715
2716
  		}
  		if ($line =~ /__builtin_bfin_ssync/) {
  			my $herevet = "$here
  " . cat_vet($line) . "
  ";
000d1cc18   Joe Perches   checkpatch.pl: ad...
2717
2718
2719
  			ERROR("SSYNC",
  			      "use the SSYNC() macro in asm/blackfin.h
  " . $herevet);
42e41c54d   Mike Frysinger   checkpatch: add s...
2720
  		}
56e77d709   Joe Perches   checkpatch: warn ...
2721
2722
2723
2724
2725
2726
  # 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...
2727
  # Check for potential 'bare' types
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2728
2729
  		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
  		    $realline_next);
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2730
2731
2732
  #print "LINE<$line>
  ";
  		if ($linenr >= $suppress_statement &&
1b5539b1f   Joe Perches   checkpatch: reduc...
2733
  		    $realcnt && $sline =~ /.\s*\S/) {
170d3a226   Andy Whitcroft   checkpatch: handl...
2734
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
2735
  				ctx_statement_block($linenr, $realcnt, 0);
171ae1a49   Andy Whitcroft   update checkpatch...
2736
2737
2738
2739
2740
2741
  			$stat =~ s/
  ./
   /g;
  			$cond =~ s/
  ./
   /g;
3e469cdc0   Andy Whitcroft   checkpatch: optim...
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
  #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...
2753

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
2754
2755
2756
2757
2758
2759
2760
  			# 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...
2761
2762
  			my $s = $stat;
  			$s =~ s/{.*$//s;
cf655043d   Andy Whitcroft   update checkpatch...
2763

c2fdda0df   Andy Whitcroft   update checkpatch...
2764
  			# Ignore goto labels.
171ae1a49   Andy Whitcroft   update checkpatch...
2765
  			if ($s =~ /$Ident:\*$/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2766
2767
  
  			# Ignore functions being called
171ae1a49   Andy Whitcroft   update checkpatch...
2768
  			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0df   Andy Whitcroft   update checkpatch...
2769

463f28648   Andy Whitcroft   checkpatch: possi...
2770
  			} elsif ($s =~ /^.\s*else\b/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2771
  			# declarations always start with types
d25065865   Andy Whitcroft   checkpatch: possi...
2772
  			} 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...
2773
2774
2775
  				my $type = $1;
  				$type =~ s/\s+/ /g;
  				possible($type, "A:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2776
  			# definitions in global scope can only start with types
a6a840628   Andy Whitcroft   checkpatch: label...
2777
  			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2778
  				possible($1, "B:" . $s);
c2fdda0df   Andy Whitcroft   update checkpatch...
2779
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2780
2781
  
  			# any (foo ... *) is a pointer cast, and foo is a type
65863862b   Andy Whitcroft   checkpatch: dissa...
2782
  			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd2   Andy Whitcroft   update checkpatch...
2783
  				possible($1, "C:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2784
2785
2786
2787
2788
  			}
  
  			# Check for any sort of function declaration.
  			# int foo(something bar, other baz);
  			# void (*store_gdt)(x86_descr_ptr *);
171ae1a49   Andy Whitcroft   update checkpatch...
2789
  			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...
2790
  				my ($name_len) = length($1);
8905a67c6   Andy Whitcroft   update checkpatch...
2791

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

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

c45dcabd2   Andy Whitcroft   update checkpatch...
2799
  						possible($1, "D:" . $s);
8905a67c6   Andy Whitcroft   update checkpatch...
2800
2801
  					}
  				}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2802
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
2803

9c0ca6f9a   Andy Whitcroft   update checkpatch...
2804
  		}
653d4876b   Andy Whitcroft   update checkpatch...
2805
2806
2807
  #
  # Checks which may be anchored in the context.
  #
00df344fd   Andy Whitcroft   update checkpatch...
2808

653d4876b   Andy Whitcroft   update checkpatch...
2809
2810
  # Check for switch () and associated case and default
  # statements should be at the same indent.
00df344fd   Andy Whitcroft   update checkpatch...
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
  		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...
2829
2830
2831
  				ERROR("SWITCH_CASE_INDENT_LEVEL",
  				      "switch and case should be at the same indent
  $hereline$err");
de7d4f0e1   Andy Whitcroft   update checkpatch...
2832
2833
2834
2835
2836
  			}
  		}
  
  # 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...
2837
  		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...
2838
  			my $pre_ctx = "$1$2";
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2839
  			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd3   Joe Perches   checkpatch: Warn ...
2840
2841
2842
2843
2844
2845
  
  			if ($line =~ /^\+\t{6,}/) {
  				WARN("DEEP_INDENTATION",
  				     "Too many leading tabs - consider code refactoring
  " . $herecurr);
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
2846
2847
2848
  			my $ctx_cnt = $realcnt - $#ctx - 1;
  			my $ctx = join("
  ", @ctx);
548596d52   Andy Whitcroft   checkpatch: trail...
2849
2850
  			my $ctx_ln = $linenr;
  			my $ctx_skip = $realcnt;
773647a09   Andy Whitcroft   update checkpatch...
2851

548596d52   Andy Whitcroft   checkpatch: trail...
2852
2853
2854
2855
2856
2857
  			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...
2858
  				$ctx_ln++;
de7d4f0e1   Andy Whitcroft   update checkpatch...
2859
  			}
548596d52   Andy Whitcroft   checkpatch: trail...
2860

53210168f   Andy Whitcroft   checkpatch: tough...
2861
2862
2863
2864
2865
2866
2867
  			#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...
2868

d752fcc88   Joe Perches   checkpatch: add a...
2869
  			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2870
2871
2872
  				ERROR("OPEN_BRACE",
  				      "that open brace { should be on the previous line
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2873
2874
2875
2876
  					"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
00df344fd   Andy Whitcroft   update checkpatch...
2877
  			}
773647a09   Andy Whitcroft   update checkpatch...
2878
2879
2880
2881
  			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
  			    $ctx =~ /\)\s*\;\s*$/ &&
  			    defined $lines[$ctx_ln - 1])
  			{
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2882
2883
  				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
  				if ($nindent > $indent) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2884
2885
2886
  					WARN("TRAILING_SEMICOLON",
  					     "trailing semicolon indicates no statements, indent implies otherwise
  " .
01464f30a   Andy Whitcroft   checkpatch: state...
2887
2888
2889
2890
  						"$here
  $ctx
  $rawlines[$ctx_ln - 1]
  ");
9c0ca6f9a   Andy Whitcroft   update checkpatch...
2891
2892
  				}
  			}
00df344fd   Andy Whitcroft   update checkpatch...
2893
  		}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2894
  # Check relative indent for conditionals and blocks.
0fe3dc2bc   Joe Perches   checkpatch: add f...
2895
  		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...
2896
2897
2898
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
  			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...
2911
2912
2913
  			my @newlines = ($c =~ /
  /gs);
  			my $cond_lines = 1 + $#newlines;
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
  
  			# 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...
2927
2928
  			if ($s =~ s/^\s*?
  //) {
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
  				$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...
2939
  			my $cond_ptr = -1;
740504c61   Andy Whitcroft   checkpatch: suspe...
2940
  			$continuation = 0;
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2941
2942
  			while ($cond_ptr != $cond_lines) {
  				$cond_ptr = $cond_lines;
f16fa28f7   Andy Whitcroft   checkpatch: suspe...
2943
2944
2945
2946
2947
  				# 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...
2948
2949
2950
2951
  				# Ignore:
  				#  1) blank lines, they should be at 0,
  				#  2) preprocessor lines, and
  				#  3) labels.
740504c61   Andy Whitcroft   checkpatch: suspe...
2952
2953
2954
  				if ($continuation ||
  				    $s =~ /^\s*?
  / ||
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2955
2956
  				    $s =~ /^\s*#\s*?/ ||
  				    $s =~ /^\s*$Ident\s*:/) {
740504c61   Andy Whitcroft   checkpatch: suspe...
2957
2958
  					$continuation = ($s =~ /^.*?\\
  /) ? 1 : 0;
30dad6ebe   Andy Whitcroft   checkpatch: inden...
2959
2960
2961
2962
  					if ($s =~ s/^.*?
  //) {
  						$cond_lines++;
  					}
9bd49efe4   Andy Whitcroft   checkpatch: suspe...
2963
  				}
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
  			}
  
  			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...
2979
2980
  			#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...
2981
2982
2983
  
  			if ($check && (($sindent % 8) != 0 ||
  			    ($sindent <= $indent && $s ne ''))) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
2984
2985
2986
2987
  				WARN("SUSPECT_CODE_INDENT",
  				     "suspect code indent for conditional statements ($indent, $sindent)
  " . $herecurr . "$stat_real
  ");
4d001e4d8   Andy Whitcroft   checkpatch: repor...
2988
2989
  			}
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
2990
2991
  		# Track the 'values' across context and added lines.
  		my $opline = $line; $opline =~ s/^./ /;
1f65f947a   Andy Whitcroft   checkpatch: add c...
2992
2993
2994
  		my ($curr_values, $curr_vars) =
  				annotate_values($opline . "
  ", $prev_values);
6c72ffaab   Andy Whitcroft   update checkpatch...
2995
  		$curr_values = $prev_values . $curr_values;
c2fdda0df   Andy Whitcroft   update checkpatch...
2996
2997
  		if ($dbg_values) {
  			my $outline = $opline; $outline =~ s/\t/ /g;
cf655043d   Andy Whitcroft   update checkpatch...
2998
2999
3000
3001
  			print "$linenr > .$outline
  ";
  			print "$linenr > $curr_values
  ";
1f65f947a   Andy Whitcroft   checkpatch: add c...
3002
3003
  			print "$linenr >  $curr_vars
  ";
c2fdda0df   Andy Whitcroft   update checkpatch...
3004
  		}
6c72ffaab   Andy Whitcroft   update checkpatch...
3005
  		$prev_values = substr($curr_values, -1);
00df344fd   Andy Whitcroft   update checkpatch...
3006
  #ignore lines not being added
3705ce5bc   Joe Perches   checkpatch: creat...
3007
  		next if ($line =~ /^[^\+]/);
00df344fd   Andy Whitcroft   update checkpatch...
3008

653d4876b   Andy Whitcroft   update checkpatch...
3009
  # TEST: allow direct testing of the type matcher.
7429c6903   Andy Whitcroft   checkpatch: impro...
3010
3011
  		if ($dbg_type) {
  			if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3012
3013
3014
  				ERROR("TEST_TYPE",
  				      "TEST: is type
  " . $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3015
  			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3016
3017
3018
  				ERROR("TEST_NOT_TYPE",
  				      "TEST: is not type ($1 is)
  ". $herecurr);
7429c6903   Andy Whitcroft   checkpatch: impro...
3019
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3020
3021
  			next;
  		}
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3022
3023
  # TEST: allow direct testing of the attribute matcher.
  		if ($dbg_attr) {
9360b0e50   Andy Whitcroft   checkpatch: exten...
3024
  			if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3025
3026
3027
  				ERROR("TEST_ATTR",
  				      "TEST: is attr
  " . $herecurr);
9360b0e50   Andy Whitcroft   checkpatch: exten...
3028
  			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3029
3030
3031
  				ERROR("TEST_NOT_ATTR",
  				      "TEST: is not attr ($1 is)
  ". $herecurr);
a1ef277e2   Andy Whitcroft   checkpatch: add t...
3032
3033
3034
  			}
  			next;
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3035

f0a594c1c   Andy Whitcroft   update checkpatch...
3036
  # check for initialisation to aggregates open brace on the next line
99423c206   Andy Whitcroft   checkpatch: fix _...
3037
3038
  		if ($line =~ /^.\s*{/ &&
  		    $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc88   Joe Perches   checkpatch: add a...
3039
3040
3041
  			if (ERROR("OPEN_BRACE",
  				  "that open brace { should be on the previous line
  " . $hereprev) &&
f2d7e4d43   Joe Perches   checkpatch: add f...
3042
3043
3044
  			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
  				fix_delete_line($fixlinenr - 1, $prevrawline);
  				fix_delete_line($fixlinenr, $rawline);
d752fcc88   Joe Perches   checkpatch: add a...
3045
3046
  				my $fixedline = $prevrawline;
  				$fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3047
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3048
3049
  				$fixedline = $line;
  				$fixedline =~ s/^(.\s*){\s*/$1/;
f2d7e4d43   Joe Perches   checkpatch: add f...
3050
  				fix_insert_line($fixlinenr, $fixedline);
d752fcc88   Joe Perches   checkpatch: add a...
3051
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3052
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3053
3054
3055
3056
3057
  #
  # Checks which are anchored on the added line.
  #
  
  # check for malformed paths in #include statements (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
3058
  		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876b   Andy Whitcroft   update checkpatch...
3059
3060
  			my $path = $1;
  			if ($path =~ m{//}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3061
  				ERROR("MALFORMED_INCLUDE",
495e9d846   Joe Perches   checkpatch: warn ...
3062
3063
3064
3065
3066
3067
3068
  				      "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...
3069
  			}
653d4876b   Andy Whitcroft   update checkpatch...
3070
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3071

0a920b5b6   Andy Whitcroft   add a trivial pat...
3072
  # no C99 // comments
00df344fd   Andy Whitcroft   update checkpatch...
3073
  		if ($line =~ m{//}) {
3705ce5bc   Joe Perches   checkpatch: creat...
3074
3075
3076
3077
  			if (ERROR("C99_COMMENTS",
  				  "do not use C99 // comments
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3078
  				my $line = $fixed[$fixlinenr];
3705ce5bc   Joe Perches   checkpatch: creat...
3079
3080
  				if ($line =~ /\/\/(.*)$/) {
  					my $comment = trim($1);
194f66fc9   Joe Perches   checkpatch: add a...
3081
  					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5bc   Joe Perches   checkpatch: creat...
3082
3083
  				}
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3084
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3085
  		# Remove C99 comments.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3086
  		$line =~ s@//.*@@;
6c72ffaab   Andy Whitcroft   update checkpatch...
3087
  		$opline =~ s@//.*@@;
0a920b5b6   Andy Whitcroft   add a trivial pat...
3088

2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3089
3090
3091
3092
3093
3094
3095
3096
3097
  # 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...
3098
3099
3100
3101
  			# Handle definitions which produce identifiers with
  			# a prefix:
  			#   XXX(foo);
  			#   EXPORT_SYMBOL(something_foo);
653d4876b   Andy Whitcroft   update checkpatch...
3102
  			my $name = $1;
87a538771   Andy Whitcroft   checkpatch: fix E...
3103
3104
  			if ($stat =~ /^(?:.\s*}\s*
  )?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df3   Andy Whitcroft   checkpatch: handl...
3105
3106
3107
3108
3109
3110
  			    $name =~ /^${Ident}_$2/) {
  #print "FOO C name<$name>
  ";
  				$suppress_export{$realline_next} = 1;
  
  			} elsif ($stat !~ /(?:
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3111
3112
  				
  .}\s*$|
480120586   Andy Whitcroft   checkpatch: DEFIN...
3113
3114
3115
  				^.DEFINE_$Ident\(\Q$name\E\)|
  				^.DECLARE_$Ident\(\Q$name\E\)|
  				^.LIST_HEAD\(\Q$name\E\)|
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3116
3117
  				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
  				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
480120586   Andy Whitcroft   checkpatch: DEFIN...
3118
  			    )/x) {
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3119
3120
3121
3122
3123
  #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...
3124
3125
  			}
  		}
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
  		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...
3136
3137
3138
  			WARN("EXPORT_SYMBOL",
  			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable
  " . $herecurr);
2b474a1a5   Andy Whitcroft   checkpatch: fix f...
3139
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3140

5150bda43   Joe Eloff   checkpatch: chang...
3141
  # check for global initialisers.
d5e616fc1   Joe Perches   checkpatch: add a...
3142
3143
3144
3145
3146
3147
  		if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
  			if (ERROR("GLOBAL_INITIALISERS",
  				  "do not initialise globals to 0 or NULL
  " .
  				      $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3148
  				$fixed[$fixlinenr] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3149
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3150
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3151
  # check for static initialisers.
d5e616fc1   Joe Perches   checkpatch: add a...
3152
3153
3154
3155
3156
3157
  		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...
3158
  				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
d5e616fc1   Joe Perches   checkpatch: add a...
3159
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3160
  		}
1813087db   Joe Perches   checkpatch: add t...
3161
3162
3163
3164
3165
3166
3167
  # 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...
3168
3169
  # 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...
3170
3171
3172
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static const char * array should probably be static const char * const
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3173
3174
3175
3176
3177
  				$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...
3178
3179
3180
  			WARN("STATIC_CONST_CHAR_ARRAY",
  			     "static char array declaration should probably be static const char
  " .
cb710eca6   Joe Perches   scripts/checkpatc...
3181
3182
  				$herecurr);
                 }
9b0fa60d9   Joe Perches   checkpatch: add t...
3183
3184
3185
3186
3187
3188
3189
  # 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);
                 }
b36190c5f   Joe Perches   checkpatch.pl: ch...
3190
3191
3192
3193
3194
3195
  # 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...
3196
  				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5f   Joe Perches   checkpatch.pl: ch...
3197
3198
  			}
  		}
92e112fdb   Joe Perches   PCI/checkpatch: D...
3199
3200
3201
3202
3203
3204
  # 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...
3205
  				$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...
3206
  			}
93ed0e2d0   Joe Perches   scripts/checkpatc...
3207
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3208
3209
3210
  # check for new typedefs, only function parameters and sparse annotations
  # make sense.
  		if ($line =~ /\btypedef\s/ &&
8054576dc   Andy Whitcroft   checkpatch: loose...
3211
  		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3212
  		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad9   Andy Whitcroft   checkpatch: pull ...
3213
  		    $line !~ /\b$typeTypedefs\b/ &&
653d4876b   Andy Whitcroft   update checkpatch...
3214
  		    $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3215
3216
3217
  			WARN("NEW_TYPEDEFS",
  			     "do not add new typedefs
  " . $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
3218
3219
3220
  		}
  
  # * goes on variable not on type
65863862b   Andy Whitcroft   checkpatch: dissa...
3221
  		# (char*[ const])
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
3222
3223
3224
  		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
  			#print "AA<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3225
  			my ($ident, $from, $to) = ($1, $2, $2);
65863862b   Andy Whitcroft   checkpatch: dissa...
3226
3227
3228
3229
3230
3231
  
  			# 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/...
3232
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
3233
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
3234

3705ce5bc   Joe Perches   checkpatch: creat...
3235
3236
  ##			print "1: from<$from> to<$to> ident<$ident>
  ";
65863862b   Andy Whitcroft   checkpatch: dissa...
3237
  			if ($from ne $to) {
3705ce5bc   Joe Perches   checkpatch: creat...
3238
3239
3240
3241
3242
3243
3244
  				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...
3245
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3246
3247
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
3248
  			}
bfcb2cc79   Andy Whitcroft   checkpatch: catch...
3249
3250
3251
3252
  		}
  		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
  			#print "BB<$1>
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
3253
  			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862b   Andy Whitcroft   checkpatch: dissa...
3254
3255
3256
3257
3258
3259
  
  			# 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/...
3260
  			while ($to =~ s/\*\s+\*/\*\*/) {
65863862b   Andy Whitcroft   checkpatch: dissa...
3261
3262
3263
  			}
  			# Modifiers should have spaces.
  			$to =~ s/(\b$Modifier$)/$1 /;
d8aaf1214   Andy Whitcroft   update checkpatch...
3264

3705ce5bc   Joe Perches   checkpatch: creat...
3265
3266
  ##			print "2: from<$from> to<$to> ident<$ident>
  ";
667026e7b   Andy Whitcroft   checkpatch: a mod...
3267
  			if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3268
3269
3270
3271
3272
3273
3274
3275
  				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...
3276
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3277
3278
  					    s@\Q$sub_from\E@$sub_to@;
  				}
65863862b   Andy Whitcroft   checkpatch: dissa...
3279
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3280
3281
3282
3283
3284
3285
3286
3287
3288
  		}
  
  # # 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...
3289
  		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3290
3291
3292
  			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...
3293
  		}
17441227f   Joe Perches   checkpatch: add w...
3294
3295
  # check for uses of printk_ratelimit
  		if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3296
3297
3298
  			WARN("PRINTK_RATELIMITED",
  "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit
  " . $herecurr);
17441227f   Joe Perches   checkpatch: add w...
3299
  		}
00df344fd   Andy Whitcroft   update checkpatch...
3300
3301
3302
  # 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...
3303
  # printk includes all preceding printk's which have no newline on the end.
00df344fd   Andy Whitcroft   update checkpatch...
3304
  # we assume the first bad printk is the one to report.
f0a594c1c   Andy Whitcroft   update checkpatch...
3305
  		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344fd   Andy Whitcroft   update checkpatch...
3306
3307
3308
3309
  			my $ok = 0;
  			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
  				#print "CHECK<$lines[$ln - 1]
  ";
25985edce   Lucas De Marchi   Fix common misspe...
3310
  				# we have a preceding printk if it ends
00df344fd   Andy Whitcroft   update checkpatch...
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
  				# 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...
3322
3323
3324
  				WARN("PRINTK_WITHOUT_KERN_LEVEL",
  				     "printk() should include KERN_ facility level
  " . $herecurr);
00df344fd   Andy Whitcroft   update checkpatch...
3325
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3326
  		}
243f3803c   Joe Perches   checkpatch: sugge...
3327
3328
3329
3330
  		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...
3331
3332
  			my $level2 = $level;
  			$level2 = "dbg" if ($level eq "debug");
243f3803c   Joe Perches   checkpatch: sugge...
3333
  			WARN("PREFER_PR_LEVEL",
daa8b0592   Yogesh Chaudhari   checkpatch.pl: mo...
3334
3335
  			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...
  " . $herecurr);
243f3803c   Joe Perches   checkpatch: sugge...
3336
3337
3338
  		}
  
  		if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3339
3340
3341
3342
  			if (WARN("PREFER_PR_LEVEL",
  				 "Prefer pr_warn(... to pr_warning(...
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3343
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
3344
3345
  				    s/\bpr_warning\b/pr_warn/;
  			}
243f3803c   Joe Perches   checkpatch: sugge...
3346
  		}
dc1393130   Joe Perches   checkpatch: prefe...
3347
3348
3349
3350
3351
3352
3353
3354
3355
  		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);
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3356
3357
  # 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 -...
3358
  		if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
c45dcabd2   Andy Whitcroft   update checkpatch...
3359
  		    !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
8d1824780   Joe Perches   checkpatch: add -...
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
  			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...
3375
  		}
653d4876b   Andy Whitcroft   update checkpatch...
3376

8905a67c6   Andy Whitcroft   update checkpatch...
3377
3378
3379
  # 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 -...
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
  			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...
3394
  		}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
3395
  # missing space after union, struct or enum definition
3705ce5bc   Joe Perches   checkpatch: creat...
3396
3397
3398
3399
3400
  		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...
3401
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3402
3403
  				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
  			}
0c73b4eb7   Andy Whitcroft   checkpatch: simpl...
3404
  		}
31070b5d4   Joe Perches   checkpatch: add t...
3405
3406
3407
  # Function pointer declarations
  # check spacing between type, funcptr, and args
  # canonical declaration is "type (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
3408
  		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d4   Joe Perches   checkpatch: add t...
3409
3410
3411
3412
3413
3414
  			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...
3415
3416
3417
3418
3419
3420
3421
3422
3423
  # 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...
3424
3425
3426
  				WARN("SPACING",
  				     "missing space after return type
  " . $herecurr);
91f72e9c6   Joe Perches   checkpatch: don't...
3427
  				$post_declare_space = " ";
31070b5d4   Joe Perches   checkpatch: add t...
3428
3429
3430
  			}
  
  # unnecessary space "type  (*funcptr)(args...)"
91f72e9c6   Joe Perches   checkpatch: don't...
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
  # 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...
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
  
  # 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...
3475
  				$fixed[$fixlinenr] =~
91f72e9c6   Joe Perches   checkpatch: don't...
3476
  				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d4   Joe Perches   checkpatch: add t...
3477
3478
  			}
  		}
8d31cfcec   Andy Whitcroft   checkpatch: check...
3479
3480
  # check for spacing round square brackets; allowed:
  #  1. with a type on the left -- int [] a;
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
3481
3482
  #  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...
3483
3484
3485
  		while ($line =~ /(.*?\s)\[/g) {
  			my ($where, $prefix) = ($-[1], $1);
  			if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc8   Andy Whitcroft   checkpatch: squar...
3486
  			    ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534a   Andy Whitcroft   checkpatch: catch...
3487
  			    $prefix !~ /[{,]\s+$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3488
3489
3490
3491
  				if (ERROR("BRACKET_SPACE",
  					  "space prohibited before open square bracket '['
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3492
  				    $fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3493
3494
  					s/^(\+.*?)\s+\[/$1\[/;
  				}
8d31cfcec   Andy Whitcroft   checkpatch: check...
3495
3496
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3497
  # check for spaces between functions and their parentheses.
6c72ffaab   Andy Whitcroft   update checkpatch...
3498
  		while ($line =~ /($Ident)\s+\(/g) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3499
  			my $name = $1;
773647a09   Andy Whitcroft   update checkpatch...
3500
3501
  			my $ctx_before = substr($line, 0, $-[1]);
  			my $ctx = "$ctx_before$name";
c2fdda0df   Andy Whitcroft   update checkpatch...
3502
3503
  
  			# Ignore those directives where spaces _are_ permitted.
773647a09   Andy Whitcroft   update checkpatch...
3504
3505
3506
3507
3508
3509
  			if ($name =~ /^(?:
  				if|for|while|switch|return|case|
  				volatile|__volatile__|
  				__attribute__|format|__extension__|
  				asm|__asm__)$/x)
  			{
c2fdda0df   Andy Whitcroft   update checkpatch...
3510
3511
3512
  			# 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...
3513
  			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a09   Andy Whitcroft   update checkpatch...
3514
3515
  
  			# cpp #elif statement condition may start with a (
c45dcabd2   Andy Whitcroft   update checkpatch...
3516
  			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3517
3518
3519
  
  			# If this whole things ends with a type its most
  			# likely a typedef for a function.
773647a09   Andy Whitcroft   update checkpatch...
3520
  			} elsif ($ctx =~ /$Type$/) {
c2fdda0df   Andy Whitcroft   update checkpatch...
3521
3522
  
  			} else {
3705ce5bc   Joe Perches   checkpatch: creat...
3523
3524
3525
3526
  				if (WARN("SPACING",
  					 "space prohibited between function name and open parenthesis '('
  " . $herecurr) &&
  					     $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3527
  					$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3528
3529
  					    s/\b$name\s+\(/$name\(/;
  				}
6c72ffaab   Andy Whitcroft   update checkpatch...
3530
  			}
f0a594c1c   Andy Whitcroft   update checkpatch...
3531
  		}
9a4cad4e2   Eric Nelson   checkpatch: check...
3532

653d4876b   Andy Whitcroft   update checkpatch...
3533
  # Check operator spacing.
0a920b5b6   Andy Whitcroft   add a trivial pat...
3534
  		if (!($line=~/\#\s*include/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3535
3536
  			my $fixed_line = "";
  			my $line_fixed = 0;
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3537
3538
3539
3540
  			my $ops = qr{
  				<<=|>>=|<=|>=|==|!=|
  				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
  				=>|->|<<|>>|<|>|=|!|~|
1f65f947a   Andy Whitcroft   checkpatch: add c...
3541
  				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
847316231   Joe Perches   checkpatch: repor...
3542
  				\?:|\?|:
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3543
  			}x;
cf655043d   Andy Whitcroft   update checkpatch...
3544
  			my @elements = split(/($ops|;)/, $opline);
3705ce5bc   Joe Perches   checkpatch: creat...
3545
3546
3547
3548
3549
3550
3551
3552
3553
  
  ##			print("element count: <" . $#elements . ">
  ");
  ##			foreach my $el (@elements) {
  ##				print("el: <$el>
  ");
  ##			}
  
  			my @fix_elements = ();
00df344fd   Andy Whitcroft   update checkpatch...
3554
  			my $off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
3555

3705ce5bc   Joe Perches   checkpatch: creat...
3556
3557
3558
3559
3560
3561
  			foreach my $el (@elements) {
  				push(@fix_elements, substr($rawline, $off, length($el)));
  				$off += length($el);
  			}
  
  			$off = 0;
6c72ffaab   Andy Whitcroft   update checkpatch...
3562
  			my $blank = copy_spacing($opline);
b34c648bb   Joe Perches   checkpatch: bette...
3563
  			my $last_after = -1;
6c72ffaab   Andy Whitcroft   update checkpatch...
3564

0a920b5b6   Andy Whitcroft   add a trivial pat...
3565
  			for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5bc   Joe Perches   checkpatch: creat...
3566
3567
3568
3569
3570
  
  				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
  
  ##				print("n: <$n> good: <$good>
  ");
4a0df2ef4   Andy Whitcroft   update checkpatch...
3571
  				$off += length($elements[$n]);
25985edce   Lucas De Marchi   Fix common misspe...
3572
  				# Pick up the preceding and succeeding characters.
773647a09   Andy Whitcroft   update checkpatch...
3573
3574
3575
3576
3577
3578
  				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...
3579
3580
3581
  				my $a = '';
  				$a = 'V' if ($elements[$n] ne '');
  				$a = 'W' if ($elements[$n] =~ /\s$/);
cf655043d   Andy Whitcroft   update checkpatch...
3582
  				$a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3583
3584
  				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
  				$a = 'O' if ($elements[$n] eq '');
773647a09   Andy Whitcroft   update checkpatch...
3585
  				$a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3586

0a920b5b6   Andy Whitcroft   add a trivial pat...
3587
  				my $op = $elements[$n + 1];
4a0df2ef4   Andy Whitcroft   update checkpatch...
3588
3589
  
  				my $c = '';
0a920b5b6   Andy Whitcroft   add a trivial pat...
3590
  				if (defined $elements[$n + 2]) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3591
3592
  					$c = 'V' if ($elements[$n + 2] ne '');
  					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043d   Andy Whitcroft   update checkpatch...
3593
  					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3594
3595
  					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
  					$c = 'O' if ($elements[$n + 2] eq '');
8b1b33786   Andy Whitcroft   checkpatch: fix c...
3596
  					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef4   Andy Whitcroft   update checkpatch...
3597
3598
  				} else {
  					$c = 'E';
0a920b5b6   Andy Whitcroft   add a trivial pat...
3599
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3600
3601
3602
  				my $ctx = "${a}x${c}";
  
  				my $at = "(ctx:$ctx)";
6c72ffaab   Andy Whitcroft   update checkpatch...
3603
  				my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e1   Andy Whitcroft   update checkpatch...
3604
3605
  				my $hereptr = "$hereline$ptr
  ";
0a920b5b6   Andy Whitcroft   add a trivial pat...
3606

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

1f65f947a   Andy Whitcroft   checkpatch: add c...
3610
3611
  				# Get the full operator variant.
  				my $opv = $op . substr($curr_vars, $off, 1);
13214adf7   Andy Whitcroft   update checkpatch...
3612
3613
3614
  				# Ignore operators passed as parameters.
  				if ($op_type ne 'V' &&
  				    $ca =~ /\s$/ && $cc =~ /^\s*,/) {
cf655043d   Andy Whitcroft   update checkpatch...
3615
3616
  #				# Ignore comments
  #				} elsif ($op =~ /^$;+$/) {
13214adf7   Andy Whitcroft   update checkpatch...
3617

d8aaf1214   Andy Whitcroft   update checkpatch...
3618
  				# ; should have either the end of line or a space or \ after it
13214adf7   Andy Whitcroft   update checkpatch...
3619
  				} elsif ($op eq ';') {
cf655043d   Andy Whitcroft   update checkpatch...
3620
3621
  					if ($ctx !~ /.x[WEBC]/ &&
  					    $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3622
3623
3624
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3625
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
3626
3627
  							$line_fixed = 1;
  						}
d8aaf1214   Andy Whitcroft   update checkpatch...
3628
3629
3630
3631
  					}
  
  				# // is a comment
  				} elsif ($op eq '//') {
0a920b5b6   Andy Whitcroft   add a trivial pat...
3632

b00e48148   Joe Perches   checkpatch: don't...
3633
3634
3635
  				#   :   when part of a bitfield
  				} elsif ($opv eq ':B') {
  					# skip the bitfield test for now
1f65f947a   Andy Whitcroft   checkpatch: add c...
3636
3637
  				# No spaces for:
  				#   ->
b00e48148   Joe Perches   checkpatch: don't...
3638
  				} elsif ($op eq '->') {
4a0df2ef4   Andy Whitcroft   update checkpatch...
3639
  					if ($ctx =~ /Wx.|.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3640
3641
3642
  						if (ERROR("SPACING",
  							  "spaces prohibited around that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3643
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3644
3645
3646
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3647
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3648
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3649
3650
3651
3652
  					}
  
  				# , must have a space on the right.
  				} elsif ($op eq ',') {
cf655043d   Andy Whitcroft   update checkpatch...
3653
  					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3654
3655
3656
  						if (ERROR("SPACING",
  							  "space required after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3657
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
3658
  							$line_fixed = 1;
b34c648bb   Joe Perches   checkpatch: bette...
3659
  							$last_after = $n;
3705ce5bc   Joe Perches   checkpatch: creat...
3660
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3661
  					}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3662
  				# '*' as part of a type definition -- reported already.
74048ed81   Andy Whitcroft   checkpatch: varia...
3663
  				} elsif ($opv eq '*_') {
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3664
3665
3666
3667
3668
3669
3670
  					#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...
3671
  					 $opv eq '*U' || $opv eq '-U' ||
0d413866c   Andy Whitcroft   checkpatch: value...
3672
  					 $opv eq '&U' || $opv eq '&&U') {
cf655043d   Andy Whitcroft   update checkpatch...
3673
  					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3674
3675
3676
  						if (ERROR("SPACING",
  							  "space required before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3677
3678
3679
3680
  							if ($n != $last_after + 2) {
  								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
  								$line_fixed = 1;
  							}
3705ce5bc   Joe Perches   checkpatch: creat...
3681
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3682
  					}
a3340b357   Andy Whitcroft   checkpatch: point...
3683
  					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a49   Andy Whitcroft   update checkpatch...
3684
3685
3686
  						# A unary '*' may be const
  
  					} elsif ($ctx =~ /.xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3687
3688
3689
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3690
  							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3691
3692
3693
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3694
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3695
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3696
3697
3698
3699
  					}
  
  				# unary ++ and unary -- are allowed no space on one side.
  				} elsif ($op eq '++' or $op eq '--') {
773647a09   Andy Whitcroft   update checkpatch...
3700
  					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3701
3702
3703
  						if (ERROR("SPACING",
  							  "space required one side of that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3704
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5bc   Joe Perches   checkpatch: creat...
3705
3706
  							$line_fixed = 1;
  						}
773647a09   Andy Whitcroft   update checkpatch...
3707
3708
3709
  					}
  					if ($ctx =~ /Wx[BE]/ ||
  					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3710
3711
3712
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3713
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3714
3715
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3716
  					}
773647a09   Andy Whitcroft   update checkpatch...
3717
  					if ($ctx =~ /ExW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3718
3719
3720
  						if (ERROR("SPACING",
  							  "space prohibited after that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3721
  							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3722
3723
3724
  							if (defined $fix_elements[$n + 2]) {
  								$fix_elements[$n + 2] =~ s/^\s+//;
  							}
b34c648bb   Joe Perches   checkpatch: bette...
3725
  							$line_fixed = 1;
3705ce5bc   Joe Perches   checkpatch: creat...
3726
  						}
653d4876b   Andy Whitcroft   update checkpatch...
3727
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3728

0a920b5b6   Andy Whitcroft   add a trivial pat...
3729
  				# << and >> may either have or not have spaces both sides
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3730
3731
3732
  				} 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...
3733
3734
  					 $op eq '*' or $op eq '/' or
  					 $op eq '%')
0a920b5b6   Andy Whitcroft   add a trivial pat...
3735
  				{
773647a09   Andy Whitcroft   update checkpatch...
3736
  					if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3737
3738
3739
  						if (ERROR("SPACING",
  							  "need consistent spacing around '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3740
3741
3742
3743
  							$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...
3744
3745
  							$line_fixed = 1;
  						}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3746
  					}
1f65f947a   Andy Whitcroft   checkpatch: add c...
3747
3748
3749
3750
  				# 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...
3751
3752
3753
  						if (ERROR("SPACING",
  							  "space prohibited before that '$op' $at
  " . $hereptr)) {
b34c648bb   Joe Perches   checkpatch: bette...
3754
  							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3755
3756
  							$line_fixed = 1;
  						}
1f65f947a   Andy Whitcroft   checkpatch: add c...
3757
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3758
  				# All the others need spaces both sides.
cf655043d   Andy Whitcroft   update checkpatch...
3759
  				} elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947a   Andy Whitcroft   checkpatch: add c...
3760
  					my $ok = 0;
22f2a2ef9   Andy Whitcroft   update checkpatch...
3761
  					# Ignore email addresses <foo@bar>
1f65f947a   Andy Whitcroft   checkpatch: add c...
3762
3763
3764
3765
3766
3767
3768
  					if (($op eq '<' &&
  					     $cc =~ /^\S+\@\S+>/) ||
  					    ($op eq '>' &&
  					     $ca =~ /<\S+\@\S+$/))
  					{
  					    	$ok = 1;
  					}
847316231   Joe Perches   checkpatch: repor...
3769
  					# messages are ERROR, but ?: are CHK
1f65f947a   Andy Whitcroft   checkpatch: add c...
3770
  					if ($ok == 0) {
847316231   Joe Perches   checkpatch: repor...
3771
3772
3773
3774
3775
3776
  						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...
3777
3778
3779
3780
  							$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...
3781
3782
  							$line_fixed = 1;
  						}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3783
  					}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3784
  				}
4a0df2ef4   Andy Whitcroft   update checkpatch...
3785
  				$off += length($elements[$n + 1]);
3705ce5bc   Joe Perches   checkpatch: creat...
3786
3787
3788
3789
3790
3791
3792
3793
3794
  
  ##				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...
3795
  			}
3705ce5bc   Joe Perches   checkpatch: creat...
3796

194f66fc9   Joe Perches   checkpatch: add a...
3797
3798
  			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
  				$fixed[$fixlinenr] = $fixed_line;
3705ce5bc   Joe Perches   checkpatch: creat...
3799
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3800
  		}
786b63262   Joe Perches   checkpatch: move ...
3801
  # check for whitespace before a non-naked semicolon
d2e248e7b   Joe Perches   checkpatch: warn ...
3802
  		if ($line =~ /^\+.*\S\s+;\s*$/) {
786b63262   Joe Perches   checkpatch: move ...
3803
3804
3805
3806
  			if (WARN("SPACING",
  				 "space prohibited before semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3807
  				1 while $fixed[$fixlinenr] =~
786b63262   Joe Perches   checkpatch: move ...
3808
3809
3810
  				    s/^(\+.*\S)\s+;/$1;/;
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3811
3812
  # check for multiple assignments
  		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3813
3814
3815
  			CHK("MULTIPLE_ASSIGNMENTS",
  			    "multiple assignments should be avoided
  " . $herecurr);
f0a594c1c   Andy Whitcroft   update checkpatch...
3816
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
  ## # 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...
3828
3829
3830
  ## 				WARN("MULTIPLE_DECLARATION",
  ##				     "declaring multiple variables together should be avoided
  " . $herecurr);
22f2a2ef9   Andy Whitcroft   update checkpatch...
3831
3832
  ## 			}
  ## 		}
f0a594c1c   Andy Whitcroft   update checkpatch...
3833

0a920b5b6   Andy Whitcroft   add a trivial pat...
3834
  #need space before brace following if, while, etc
22f2a2ef9   Andy Whitcroft   update checkpatch...
3835
3836
  		if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
  		    $line =~ /do{/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3837
3838
3839
3840
  			if (ERROR("SPACING",
  				  "space required before the open brace '{'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3841
  				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
3705ce5bc   Joe Perches   checkpatch: creat...
3842
  			}
de7d4f0e1   Andy Whitcroft   update checkpatch...
3843
  		}
c4a62ef91   Joe Perches   checkpatch: add a...
3844
3845
3846
3847
3848
3849
3850
3851
  ## # 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...
3852
3853
3854
  # closing brace should have a space following it when it has anything
  # on the line
  		if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc1   Joe Perches   checkpatch: add a...
3855
3856
3857
3858
  			if (ERROR("SPACING",
  				  "space required after that close brace '}'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3859
  				$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
3860
3861
  				    s/}((?!(?:,|;|\)))\S)/} $1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3862
  		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3863
3864
  # check spacing on square brackets
  		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3865
3866
3867
3868
  			if (ERROR("SPACING",
  				  "space prohibited after that open square bracket '['
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3869
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3870
3871
  				    s/\[\s+/\[/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3872
3873
  		}
  		if ($line =~ /\s\]/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3874
3875
3876
3877
  			if (ERROR("SPACING",
  				  "space prohibited before that close square bracket ']'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3878
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3879
3880
  				    s/\s+\]/\]/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3881
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
3882
  # check spacing on parentheses
9c0ca6f9a   Andy Whitcroft   update checkpatch...
3883
3884
  		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
  		    $line !~ /for\s*\(\s+;/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3885
3886
3887
3888
  			if (ERROR("SPACING",
  				  "space prohibited after that open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3889
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3890
3891
  				    s/\(\s+/\(/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3892
  		}
13214adf7   Andy Whitcroft   update checkpatch...
3893
  		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd2   Andy Whitcroft   update checkpatch...
3894
3895
  		    $line !~ /for\s*\(.*;\s+\)/ &&
  		    $line !~ /:\s+\)/) {
3705ce5bc   Joe Perches   checkpatch: creat...
3896
3897
3898
3899
  			if (ERROR("SPACING",
  				  "space prohibited before that close parenthesis ')'
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3900
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3901
3902
  				    s/\s+\)/\)/;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
3903
  		}
e2826fd07   Joe Perches   checkpatch: warn ...
3904
3905
3906
3907
3908
3909
3910
3911
  # 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) {
  			CHK("UNNECESSARY_PARENTHESES",
  			    "Unnecessary parentheses around $1
  " . $herecurr);
  		    }
0a920b5b6   Andy Whitcroft   add a trivial pat...
3912
  #goto labels aren't indented, allow a single space however
4a0df2ef4   Andy Whitcroft   update checkpatch...
3913
  		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b6   Andy Whitcroft   add a trivial pat...
3914
  		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5bc   Joe Perches   checkpatch: creat...
3915
3916
3917
3918
  			if (WARN("INDENTED_LABEL",
  				 "labels should not be indented
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3919
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3920
3921
  				    s/^(.)\s+/$1/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3922
  		}
5b9553abf   Joe Perches   checkpatch: make ...
3923
  # return is not a function
507e51418   Joe Perches   checkpatch: impro...
3924
  		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd2   Andy Whitcroft   update checkpatch...
3925
  			my $spacing = $1;
507e51418   Joe Perches   checkpatch: impro...
3926
  			if ($^V && $^V ge 5.10.0 &&
5b9553abf   Joe Perches   checkpatch: make ...
3927
3928
3929
3930
3931
3932
3933
3934
  			    $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...
3935
  			} elsif ($spacing !~ /\s+/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3936
3937
3938
  				ERROR("SPACING",
  				      "space required before the open parenthesis '('
  " . $herecurr);
c45dcabd2   Andy Whitcroft   update checkpatch...
3939
3940
  			}
  		}
507e51418   Joe Perches   checkpatch: impro...
3941

b43ae21bd   Joe Perches   checkpatch: reduc...
3942
3943
3944
3945
3946
3947
3948
3949
  # 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 ...
3950
  			WARN("RETURN_VOID",
b43ae21bd   Joe Perches   checkpatch: reduc...
3951
3952
3953
  			     "void function return statements are not generally useful
  " . $hereprev);
                 }
9819cf252   Joe Perches   checkpatch: warn ...
3954

189248d8f   Joe Perches   checkpatch: check...
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
  # 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);
  			}
  		}
53a3c4487   Andy Whitcroft   checkpatch: retur...
3969
3970
3971
3972
  # Return of what appears to be an errno should normally be -'ve
  		if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
  			my $name = $1;
  			if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc18   Joe Perches   checkpatch.pl: ad...
3973
3974
3975
  				WARN("USE_NEGATIVE_ERRNO",
  				     "return of an errno should typically be -ve (return -$1)
  " . $herecurr);
53a3c4487   Andy Whitcroft   checkpatch: retur...
3976
3977
  			}
  		}
c45dcabd2   Andy Whitcroft   update checkpatch...
3978

0a920b5b6   Andy Whitcroft   add a trivial pat...
3979
  # Need a space before open parenthesis after if, while etc
3705ce5bc   Joe Perches   checkpatch: creat...
3980
3981
3982
3983
3984
  		if ($line =~ /\b(if|while|for|switch)\(/) {
  			if (ERROR("SPACING",
  				  "space required before the open parenthesis '('
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
3985
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
3986
3987
  				    s/\b(if|while|for|switch)\(/$1 \(/;
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
3988
  		}
f5fe35dd9   Andy Whitcroft   checkpatch: condi...
3989
3990
  # Check for illegal assignment in if conditional -- and check for trailing
  # statements after the conditional.
170d3a226   Andy Whitcroft   checkpatch: handl...
3991
  		if ($line =~ /do\s*(?!{)/) {
3e469cdc0   Andy Whitcroft   checkpatch: optim...
3992
3993
3994
  			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
  				ctx_statement_block($linenr, $realcnt, 0)
  					if (!defined $stat);
170d3a226   Andy Whitcroft   checkpatch: handl...
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
  			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 "...
4017
  		    defined($stat) && defined($cond) &&
170d3a226   Andy Whitcroft   checkpatch: handl...
4018
  		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a49   Andy Whitcroft   update checkpatch...
4019
  			my ($s, $c) = ($stat, $cond);
8905a67c6   Andy Whitcroft   update checkpatch...
4020

b53c8e104   Andy Whitcroft   checkpatch: ensur...
4021
  			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4022
4023
4024
  				ERROR("ASSIGN_IN_IF",
  				      "do not use assignment in if condition
  " . $herecurr);
8905a67c6   Andy Whitcroft   update checkpatch...
4025
4026
4027
4028
  			}
  
  			# Find out what is on the end of the line after the
  			# conditional.
773647a09   Andy Whitcroft   update checkpatch...
4029
  			substr($s, 0, length($c), '');
8905a67c6   Andy Whitcroft   update checkpatch...
4030
4031
  			$s =~ s/
  .*//g;
13214adf7   Andy Whitcroft   update checkpatch...
4032
  			$s =~ s/$;//g; 	# Remove any comments
53210168f   Andy Whitcroft   checkpatch: tough...
4033
4034
  			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
  			    $c !~ /}\s*while\s*/)
773647a09   Andy Whitcroft   update checkpatch...
4035
  			{
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4036
4037
4038
4039
  				# Find out how long the conditional actually is.
  				my @newlines = ($c =~ /
  /gs);
  				my $cond_lines = 1 + $#newlines;
42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4040
  				my $stat_real = '';
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4041

42bdf74c9   Hidetoshi Seto   checkpatch: trivi...
4042
4043
4044
  				$stat_real = raw_line($linenr, $cond_lines)
  							. "
  " if ($cond_lines);
bb44ad39c   Andy Whitcroft   checkpatch: trail...
4045
4046
4047
4048
  				if (defined($stat_real) && $cond_lines > 1) {
  					$stat_real = "[...]
  $stat_real";
  				}
000d1cc18   Joe Perches   checkpatch.pl: ad...
4049
4050
4051
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr . $stat_real);
8905a67c6   Andy Whitcroft   update checkpatch...
4052
4053
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
  # 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...
4066
4067
4068
  			WARN("HEXADECIMAL_BOOLEAN_TEST",
  			     "boolean test with hexadecimal, perhaps just 1 \& or \|?
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4069
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
4070
  # if and else should not have general statements after it
13214adf7   Andy Whitcroft   update checkpatch...
4071
4072
4073
4074
  		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...
4075
4076
4077
  				ERROR("TRAILING_STATEMENTS",
  				      "trailing statements should be on next line
  " . $herecurr);
13214adf7   Andy Whitcroft   update checkpatch...
4078
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4079
  		}
396677823   Andy Whitcroft   checkpatch: if sh...
4080
4081
  # if should not continue a brace
  		if ($line =~ /}\s*if\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4082
  			ERROR("TRAILING_STATEMENTS",
048b123fa   Rasmus Villemoes   checkpatch.pl: al...
4083
4084
  			      "trailing statements should be on next line (or did you mean 'else if'?)
  " .
396677823   Andy Whitcroft   checkpatch: if sh...
4085
4086
  				$herecurr);
  		}
a1080bf80   Andy Whitcroft   checkpatch: case/...
4087
4088
4089
  # 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...
4090
  			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf80   Andy Whitcroft   checkpatch: case/...
4091
4092
4093
  			\s*return\s+
  		    )/xg)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
4094
4095
4096
  			ERROR("TRAILING_STATEMENTS",
  			      "trailing statements should be on next line
  " . $herecurr);
a1080bf80   Andy Whitcroft   checkpatch: case/...
4097
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4098
4099
4100
  
  		# Check for }<nl>else {, these must be at the same
  		# indent level to be relevant to each other.
8b8856f4b   Joe Perches   checkpatch: fix b...
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
  		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...
4118
  		}
8b8856f4b   Joe Perches   checkpatch: fix b...
4119
4120
  		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
  		    $previndent == $indent) {
c2fdda0df   Andy Whitcroft   update checkpatch...
4121
4122
4123
4124
  			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...
4125
  			substr($s, 0, length($c), '');
c2fdda0df   Andy Whitcroft   update checkpatch...
4126
4127
4128
4129
  			$s =~ s/
  .*//g;
  
  			if ($s =~ /^\s*;/) {
8b8856f4b   Joe Perches   checkpatch: fix b...
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
  				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...
4143
4144
  			}
  		}
95e2c6023   Joe Perches   checkpatch: warn ...
4145
  #Specific variable tests
323c1260b   Joe Perches   checkpatch: warn ...
4146
4147
  		while ($line =~ m{($Constant|$Lval)}g) {
  			my $var = $1;
95e2c6023   Joe Perches   checkpatch: warn ...
4148
4149
4150
  
  #gcc binary extension
  			if ($var =~ /^$Binary$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4151
4152
4153
4154
4155
  				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...
4156
  					$fixed[$fixlinenr] =~
d5e616fc1   Joe Perches   checkpatch: add a...
4157
4158
  					    s/\b$var\b/$hexval/;
  				}
95e2c6023   Joe Perches   checkpatch: warn ...
4159
4160
4161
  			}
  
  #CamelCase
807bd26c4   Joe Perches   checkpatch: remov...
4162
  			if ($var !~ /^$Constant$/ &&
be79794bc   Joe Perches   checkpatch: chang...
4163
  			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
4164
  #Ignore Page<foo> variants
807bd26c4   Joe Perches   checkpatch: remov...
4165
  			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce85   Joe Perches   checkpatch: ignor...
4166
  #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
3445686af   Joe Perches   checkpatch: ignor...
4167
  			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
7e781f67d   Joe Perches   checkpatch: check...
4168
4169
4170
  				while ($var =~ m{($Ident)}g) {
  					my $word = $1;
  					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b077101   Joe Perches   checkpatch: exten...
4171
4172
4173
4174
4175
4176
4177
  					if ($check) {
  						seed_camelcase_includes();
  						if (!$file && !$camelcase_file_seeded) {
  							seed_camelcase_file($realfile);
  							$camelcase_file_seeded = 1;
  						}
  					}
7e781f67d   Joe Perches   checkpatch: check...
4178
4179
4180
4181
4182
4183
  					if (!defined $camelcase{$word}) {
  						$camelcase{$word} = 1;
  						CHK("CAMELCASE",
  						    "Avoid CamelCase: <$word>
  " . $herecurr);
  					}
3445686af   Joe Perches   checkpatch: ignor...
4184
  				}
323c1260b   Joe Perches   checkpatch: warn ...
4185
4186
  			}
  		}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4187
4188
  
  #no spaces allowed after \ in define
d5e616fc1   Joe Perches   checkpatch: add a...
4189
4190
4191
4192
4193
  		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...
4194
  				$fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc1   Joe Perches   checkpatch: add a...
4195
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4196
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4197
  #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd2   Andy Whitcroft   update checkpatch...
4198
  		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec483   Andy Whitcroft   checkpatch: reduc...
4199
4200
4201
4202
  			my $file = "$1.h";
  			my $checkfile = "include/linux/$file";
  			if (-f "$root/$checkfile" &&
  			    $realfile ne $checkfile &&
7840a94cd   Wolfram Sang   checkpatch: refac...
4203
  			    $1 !~ /$allowed_asm_includes/)
c45dcabd2   Andy Whitcroft   update checkpatch...
4204
  			{
e09dec483   Andy Whitcroft   checkpatch: reduc...
4205
  				if ($realfile =~ m{^arch/}) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4206
4207
4208
  					CHK("ARCH_INCLUDE_LINUX",
  					    "Consider using #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
4209
  				} else {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4210
4211
4212
  					WARN("INCLUDE_LINUX",
  					     "Use #include <linux/$file> instead of <asm/$file>
  " . $herecurr);
e09dec483   Andy Whitcroft   checkpatch: reduc...
4213
  				}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4214
4215
  			}
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4216
4217
  # 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...
4218
  # in a known good container
b8f96a31f   Andy Whitcroft   checkpatch: macro...
4219
4220
  		if ($realfile !~ m@/vmlinux.lds.h$@ &&
  		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf1214   Andy Whitcroft   update checkpatch...
4221
4222
  			my $ln = $linenr;
  			my $cnt = $realcnt;
c45dcabd2   Andy Whitcroft   update checkpatch...
4223
4224
  			my ($off, $dstat, $dcond, $rest);
  			my $ctx = '';
08a2843e7   Joe Perches   checkpatch: warn ...
4225
4226
  			my $has_flow_statement = 0;
  			my $has_arg_concat = 0;
c45dcabd2   Andy Whitcroft   update checkpatch...
4227
  			($dstat, $dcond, $ln, $cnt, $off) =
f74bd1942   Andy Whitcroft   checkpatch: corre...
4228
4229
  				ctx_statement_block($linenr, $realcnt, 0);
  			$ctx = $dstat;
c45dcabd2   Andy Whitcroft   update checkpatch...
4230
4231
  			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>
  ";
a3bb97a7a   Andy Whitcroft   checkpatch: macro...
4232
4233
  			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "
  ";
c45dcabd2   Andy Whitcroft   update checkpatch...
4234

08a2843e7   Joe Perches   checkpatch: warn ...
4235
4236
  			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
  			$has_arg_concat = 1 if ($ctx =~ /\#\#/);
f74bd1942   Andy Whitcroft   checkpatch: corre...
4237
  			$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b3   Andy Whitcroft   checkpatch: compl...
4238
  			$dstat =~ s/$;//g;
c45dcabd2   Andy Whitcroft   update checkpatch...
4239
4240
4241
4242
  			$dstat =~ s/\\
  .//g;
  			$dstat =~ s/^\s*//s;
  			$dstat =~ s/\s*$//s;
de7d4f0e1   Andy Whitcroft   update checkpatch...
4243

c45dcabd2   Andy Whitcroft   update checkpatch...
4244
  			# Flatten any parentheses and braces
bf30d6ede   Andy Whitcroft   checkpatch: compl...
4245
4246
  			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
  			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
c81769fdc   Andy Whitcroft   checkpatch: fix c...
4247
  			       $dstat =~ s/\[[^\[\]]*\]/1/)
bf30d6ede   Andy Whitcroft   checkpatch: compl...
4248
  			{
de7d4f0e1   Andy Whitcroft   update checkpatch...
4249
  			}
d8aaf1214   Andy Whitcroft   update checkpatch...
4250

e45bab8eb   Andy Whitcroft   checkpatch: handl...
4251
4252
4253
4254
4255
  			# Flatten any obvious string concatentation.
  			while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
  			       $dstat =~ s/$Ident\s*("X*")/$1/)
  			{
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
4256
4257
4258
  			my $exceptions = qr{
  				$Declare|
  				module_param_named|
a0a0a7a94   Kees Cook   checkpatch: fix n...
4259
  				MODULE_PARM_DESC|
c45dcabd2   Andy Whitcroft   update checkpatch...
4260
4261
  				DECLARE_PER_CPU|
  				DEFINE_PER_CPU|
383099fd6   Andy Whitcroft   checkpatch: struc...
4262
  				__typeof__\(|
22fd2d3e4   Stefani Seibold   checkpatch.pl: ad...
4263
4264
  				union|
  				struct|
ea71a0a01   Andy Whitcroft   checkpatch: forma...
4265
4266
  				\.$Ident\s*=\s*|
  				^\"|\"$
c45dcabd2   Andy Whitcroft   update checkpatch...
4267
  			}x;
5eaa20b98   Andy Whitcroft   checkpatch: clean...
4268
4269
  			#print "REST<$rest> dstat<$dstat> ctx<$ctx>
  ";
f74bd1942   Andy Whitcroft   checkpatch: corre...
4270
4271
4272
  			if ($dstat ne '' &&
  			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
  			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
3cc4b1c3f   Joe Perches   checkpatch: reduc...
4273
  			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd3981   Joe Perches   checkpatch: fix c...
4274
  			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
f74bd1942   Andy Whitcroft   checkpatch: corre...
4275
4276
  			    $dstat !~ /$exceptions/ &&
  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
e942e2c3f   Joe Perches   checkpatch: fix s...
4277
  			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
72f115f94   Andy Whitcroft   checkpatch: compl...
4278
  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
f74bd1942   Andy Whitcroft   checkpatch: corre...
4279
4280
4281
  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
  			    $dstat !~ /^do\s*{/ &&					# do {...
f95a7e6a4   Joe Perches   checkpatch: ignor...
4282
4283
  			    $dstat !~ /^\({/ &&						# ({...
  			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd1942   Andy Whitcroft   checkpatch: corre...
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
  			{
  				$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...
4294
  				}
f74bd1942   Andy Whitcroft   checkpatch: corre...
4295
4296
4297
4298
4299
  				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...
4300
  					ERROR("COMPLEX_MACRO",
388982b55   Andrew Morton   checkpatch: fix s...
4301
4302
  					      "Macros with complex values should be enclosed in parentheses
  " . "$herectx");
d8aaf1214   Andy Whitcroft   update checkpatch...
4303
  				}
653d4876b   Andy Whitcroft   update checkpatch...
4304
  			}
5023d3472   Joe Perches   checkpatch: warn ...
4305

08a2843e7   Joe Perches   checkpatch: warn ...
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
  # 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...
4321
  # check for line continuations outside of #defines, preprocessor #, and asm
5023d3472   Joe Perches   checkpatch: warn ...
4322
4323
4324
  
  		} else {
  			if ($prevline !~ /^..*\\$/ &&
481eb486a   Joe Perches   checkpatch: exten...
4325
4326
  			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
  			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5023d3472   Joe Perches   checkpatch: warn ...
4327
4328
4329
4330
4331
  			    $line =~ /^\+.*\\$/) {
  				WARN("LINE_CONTINUATIONS",
  				     "Avoid unnecessary line continuations
  " . $herecurr);
  			}
0a920b5b6   Andy Whitcroft   add a trivial pat...
4332
  		}
b13edf7ff   Joe Perches   checkpatch: add c...
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
  # 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;
  
  			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...
4364
4365
  				if (($stmts =~ tr/;/;/) == 1 &&
  				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7ff   Joe Perches   checkpatch: add c...
4366
4367
4368
4369
4370
4371
4372
4373
4374
  					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 ...
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
  			} 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...
4390
4391
  			}
  		}
080ba9296   Mike Frysinger   checkpatch: try t...
4392
4393
4394
4395
4396
4397
  # 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...
4398
4399
4400
  			WARN("MISSING_VMLINUX_SYMBOL",
  			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols
  " . $herecurr);
080ba9296   Mike Frysinger   checkpatch: try t...
4401
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4402
  # check for redundant bracing round if etc
13214adf7   Andy Whitcroft   update checkpatch...
4403
4404
  		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
  			my ($level, $endln, @chunks) =
cf655043d   Andy Whitcroft   update checkpatch...
4405
  				ctx_statement_full($linenr, $realcnt, 1);
13214adf7   Andy Whitcroft   update checkpatch...
4406
4407
  			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4408
4409
4410
  			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>
  ";
  			if ($#chunks > 0 && $level == 0) {
aad4f6149   Joe Perches   checkpatch: add -...
4411
4412
  				my @allowed = ();
  				my $allow = 0;
13214adf7   Andy Whitcroft   update checkpatch...
4413
  				my $seen = 0;
773647a09   Andy Whitcroft   update checkpatch...
4414
4415
  				my $herectx = $here . "
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4416
  				my $ln = $linenr - 1;
13214adf7   Andy Whitcroft   update checkpatch...
4417
4418
  				for my $chunk (@chunks) {
  					my ($cond, $block) = @{$chunk};
773647a09   Andy Whitcroft   update checkpatch...
4419
4420
4421
4422
  					# 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 -...
4423
  					$allowed[$allow] = 0;
773647a09   Andy Whitcroft   update checkpatch...
4424
4425
4426
4427
4428
4429
4430
4431
4432
  					#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...
4433
  					$ln += statement_rawlines($block) - 1;
773647a09   Andy Whitcroft   update checkpatch...
4434
  					substr($block, 0, length($cond), '');
13214adf7   Andy Whitcroft   update checkpatch...
4435
4436
  
  					$seen++ if ($block =~ /^\s*{/);
aad4f6149   Joe Perches   checkpatch: add -...
4437
4438
  					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4439
4440
4441
  					if (statement_lines($cond) > 1) {
  						#print "APW: ALLOWED: cond<$cond>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4442
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4443
4444
  					}
  					if ($block =~/\b(?:if|for|while)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
4445
4446
  						#print "APW: ALLOWED: block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4447
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4448
  					}
cf655043d   Andy Whitcroft   update checkpatch...
4449
4450
4451
  					if (statement_block_size($block) > 1) {
  						#print "APW: ALLOWED: lines block<$block>
  ";
aad4f6149   Joe Perches   checkpatch: add -...
4452
  						$allowed[$allow] = 1;
13214adf7   Andy Whitcroft   update checkpatch...
4453
  					}
aad4f6149   Joe Perches   checkpatch: add -...
4454
  					$allow++;
13214adf7   Andy Whitcroft   update checkpatch...
4455
  				}
aad4f6149   Joe Perches   checkpatch: add -...
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
  				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...
4471
4472
4473
  				}
  			}
  		}
773647a09   Andy Whitcroft   update checkpatch...
4474
  		if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf7   Andy Whitcroft   update checkpatch...
4475
  					$line =~ /\b(if|while|for|else)\b/) {
cf655043d   Andy Whitcroft   update checkpatch...
4476
4477
4478
4479
4480
4481
4482
4483
  			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...
4484
4485
4486
  
  			my ($level, $endln, @chunks) =
  				ctx_statement_full($linenr, $realcnt, $-[0]);
cf655043d   Andy Whitcroft   update checkpatch...
4487
4488
  			# Check the condition.
  			my ($cond, $block) = @{$chunks[0]};
773647a09   Andy Whitcroft   update checkpatch...
4489
4490
  			#print "CHECKING<$linenr> cond<$cond> block<$block>
  ";
cf655043d   Andy Whitcroft   update checkpatch...
4491
  			if (defined $cond) {
773647a09   Andy Whitcroft   update checkpatch...
4492
  				substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
  			}
  			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...
4513
  					substr($block, 0, length($cond), '');
cf655043d   Andy Whitcroft   update checkpatch...
4514
4515
4516
4517
4518
4519
4520
4521
  				}
  				if ($block =~ /^\s*\{/) {
  					#print "APW: ALLOWED: chunk-1 block<$block>
  ";
  					$allowed = 1;
  				}
  			}
  			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
699324871   Justin P. Mattock   treewide: remove ...
4522
4523
  				my $herectx = $here . "
  ";
f055663c5   Andy Whitcroft   checkpatch: repor...
4524
  				my $cnt = statement_rawlines($block);
cf655043d   Andy Whitcroft   update checkpatch...
4525

f055663c5   Andy Whitcroft   checkpatch: repor...
4526
  				for (my $n = 0; $n < $cnt; $n++) {
699324871   Justin P. Mattock   treewide: remove ...
4527
4528
  					$herectx .= raw_line($linenr, $n) . "
  ";
f0a594c1c   Andy Whitcroft   update checkpatch...
4529
  				}
cf655043d   Andy Whitcroft   update checkpatch...
4530

000d1cc18   Joe Perches   checkpatch.pl: ad...
4531
4532
4533
  				WARN("BRACES",
  				     "braces {} are not necessary for single statement blocks
  " . $herectx);
f0a594c1c   Andy Whitcroft   update checkpatch...
4534
4535
  			}
  		}
0979ae664   Joe Perches   checkpatch: Add -...
4536
  # check for unnecessary blank lines around braces
77b9a53a6   Joe Perches   checkpatch: don't...
4537
  		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
0979ae664   Joe Perches   checkpatch: Add -...
4538
4539
4540
4541
  			CHK("BRACES",
  			    "Blank lines aren't necessary before a close brace '}'
  " . $hereprev);
  		}
77b9a53a6   Joe Perches   checkpatch: don't...
4542
  		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
0979ae664   Joe Perches   checkpatch: Add -...
4543
4544
4545
4546
  			CHK("BRACES",
  			    "Blank lines aren't necessary after an open brace '{'
  " . $hereprev);
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4547
  # no volatiles please
6c72ffaab   Andy Whitcroft   update checkpatch...
4548
4549
  		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
  		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4550
4551
4552
  			WARN("VOLATILE",
  			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4553
  		}
f17dba4fc   Joe Perches   checkpatch: add -...
4554
4555
4556
4557
4558
4559
  # 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);
  		}
00df344fd   Andy Whitcroft   update checkpatch...
4560
  # warn about #if 0
c45dcabd2   Andy Whitcroft   update checkpatch...
4561
  		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4562
4563
4564
  			CHK("REDUNDANT_CODE",
  			    "if this code is redundant consider removing it
  " .
de7d4f0e1   Andy Whitcroft   update checkpatch...
4565
  				$herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4566
  		}
03df4b51f   Andy Whitcroft   checkpatch: conso...
4567
4568
4569
4570
4571
4572
4573
  # 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',
  				     "$1(NULL) is safe this check is probably not required
  " . $hereprev);
4c432a8f0   Greg Kroah-Hartman   checkpatch: usb_f...
4574
4575
  			}
  		}
f0a594c1c   Andy Whitcroft   update checkpatch...
4576

ebfdc4096   Joe Perches   checkpatch: attem...
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
  # 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 ...
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
  # check for logging functions with KERN_<LEVEL>
  		if ($line !~ /printk\s*\(/ &&
  		    $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*//;
  			}
  		}
8716de383   Joe Perches   checkpatch: add t...
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
  # 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...
4627
  					$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...
4628
4629
4630
  				}
  			}
  		}
e970b8846   Joe Perches   checkpatch: add r...
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
  # 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...
4641
  				$fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
  				    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...
4653
  				my $lead = $fixed[$fixlinenr] =~
e970b8846   Joe Perches   checkpatch: add r...
4654
4655
4656
4657
  				    /(^\+\s*(?:static\s+))/;
  				$lead = rtrim($1);
  				$lead = "$lead " if ($lead !~ /^\+$/);
  				$lead = "${lead}const ";
194f66fc9   Joe Perches   checkpatch: add a...
4658
  				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b8846   Joe Perches   checkpatch: add r...
4659
4660
  			}
  		}
fbdb8138c   Joe Perches   checkpatch: warn ...
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
  # 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...
4671
  				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138c   Joe Perches   checkpatch: warn ...
4672
4673
  			}
  		}
1a15a2508   Patrick Pannuto   checkpatch: prefe...
4674
  # prefer usleep_range over udelay
37581c28e   Bruce Allan   checkpatch: fix U...
4675
  		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c3   Joe Perches   checkpatch: add t...
4676
  			my $delay = $1;
1a15a2508   Patrick Pannuto   checkpatch: prefe...
4677
  			# ignore udelay's < 10, however
43c1d77c3   Joe Perches   checkpatch: add t...
4678
  			if (! ($delay < 10) ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4679
  				CHK("USLEEP_RANGE",
43c1d77c3   Joe Perches   checkpatch: add t...
4680
4681
4682
4683
4684
4685
4686
  				    "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...
4687
4688
  			}
  		}
09ef87255   Patrick Pannuto   checkpatch: warn ...
4689
4690
4691
  # warn about unexpectedly long msleep's
  		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
  			if ($1 < 20) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4692
  				WARN("MSLEEP",
43c1d77c3   Joe Perches   checkpatch: add t...
4693
4694
  				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt
  " . $herecurr);
09ef87255   Patrick Pannuto   checkpatch: warn ...
4695
4696
  			}
  		}
36ec19390   Joe Perches   checkpatch: warn ...
4697
4698
4699
4700
4701
4702
  # 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 ...
4703
4704
4705
4706
4707
4708
  # 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...
4709
  # warn about #ifdefs in C files
c45dcabd2   Andy Whitcroft   update checkpatch...
4710
  #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344fd   Andy Whitcroft   update checkpatch...
4711
4712
4713
4714
4715
  #			print "#ifdef in C files should be avoided
  ";
  #			print "$herecurr";
  #			$clean = 0;
  #		}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4716
  # warn about spacing in #ifdefs
c45dcabd2   Andy Whitcroft   update checkpatch...
4717
  		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5bc   Joe Perches   checkpatch: creat...
4718
4719
4720
4721
  			if (ERROR("SPACING",
  				  "exactly one space required after that #$1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4722
  				$fixed[$fixlinenr] =~
3705ce5bc   Joe Perches   checkpatch: creat...
4723
4724
  				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
  			}
22f2a2ef9   Andy Whitcroft   update checkpatch...
4725
  		}
4a0df2ef4   Andy Whitcroft   update checkpatch...
4726
  # check for spinlock_t definitions without a comment.
171ae1a49   Andy Whitcroft   update checkpatch...
4727
4728
  		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
  		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef4   Andy Whitcroft   update checkpatch...
4729
4730
  			my $which = $1;
  			if (!ctx_has_comment($first_line, $linenr)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4731
4732
4733
  				CHK("UNCOMMENTED_DEFINITION",
  				    "$1 definition without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4734
4735
4736
4737
4738
  			}
  		}
  # 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 ...
4739
4740
4741
  				WARN("MEMORY_BARRIER",
  				     "memory barrier without comment
  " . $herecurr);
4a0df2ef4   Andy Whitcroft   update checkpatch...
4742
4743
4744
  			}
  		}
  # check of hardware specific defines
c45dcabd2   Andy Whitcroft   update checkpatch...
4745
  		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4746
4747
4748
  			CHK("ARCH_DEFINES",
  			    "architecture specific defines should be avoided
  " .  $herecurr);
0a920b5b6   Andy Whitcroft   add a trivial pat...
4749
  		}
653d4876b   Andy Whitcroft   update checkpatch...
4750

d4977c78e   Tobias Klauser   checkpatch: warn ...
4751
4752
  # 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...
4753
4754
4755
  			WARN("STORAGE_CLASS",
  			     "storage class should be at the beginning of the declaration
  " . $herecurr)
d4977c78e   Tobias Klauser   checkpatch: warn ...
4756
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4757
4758
  # check the location of the inline attribute, that it is between
  # storage class and type.
9c0ca6f9a   Andy Whitcroft   update checkpatch...
4759
4760
  		if ($line =~ /\b$Type\s+$Inline\b/ ||
  		    $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4761
4762
4763
  			ERROR("INLINE_LOCATION",
  			      "inline keyword should sit between storage class and type
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
4764
  		}
8905a67c6   Andy Whitcroft   update checkpatch...
4765
  # Check for __inline__ and __inline, prefer inline
2b7ab4539   Joe Perches   checkpatch: don't...
4766
4767
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4768
4769
4770
4771
  			if (WARN("INLINE",
  				 "plain inline is preferred over $1
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4772
  				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc1   Joe Perches   checkpatch: add a...
4773
4774
  
  			}
8905a67c6   Andy Whitcroft   update checkpatch...
4775
  		}
3d130fd03   Joe Perches   checkpatch.pl: ad...
4776
  # Check for __attribute__ packed, prefer __packed
2b7ab4539   Joe Perches   checkpatch: don't...
4777
4778
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4779
4780
4781
  			WARN("PREFER_PACKED",
  			     "__packed is preferred over __attribute__((packed))
  " . $herecurr);
3d130fd03   Joe Perches   checkpatch.pl: ad...
4782
  		}
39b7e2878   Joe Perches   checkpatch: add a...
4783
  # Check for __attribute__ aligned, prefer __aligned
2b7ab4539   Joe Perches   checkpatch: don't...
4784
4785
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4786
4787
4788
  			WARN("PREFER_ALIGNED",
  			     "__aligned(size) is preferred over __attribute__((aligned(size)))
  " . $herecurr);
39b7e2878   Joe Perches   checkpatch: add a...
4789
  		}
5f14d3bd8   Joe Perches   checkpatch: prefe...
4790
  # Check for __attribute__ format(printf, prefer __printf
2b7ab4539   Joe Perches   checkpatch: don't...
4791
4792
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4793
4794
4795
4796
  			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...
4797
  				$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...
4798
4799
  
  			}
5f14d3bd8   Joe Perches   checkpatch: prefe...
4800
  		}
6061d949d   Joe Perches   include/ and chec...
4801
  # Check for __attribute__ format(scanf, prefer __scanf
2b7ab4539   Joe Perches   checkpatch: don't...
4802
4803
  		if ($realfile !~ m@\binclude/uapi/@ &&
  		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4804
4805
4806
4807
  			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...
4808
  				$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...
4809
  			}
6061d949d   Joe Perches   include/ and chec...
4810
  		}
8f53a9b80   Joe Perches   scripts/checkpatc...
4811
4812
  # check for sizeof(&)
  		if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4813
4814
4815
  			WARN("SIZEOF_ADDRESS",
  			     "sizeof(& should be avoided
  " . $herecurr);
8f53a9b80   Joe Perches   scripts/checkpatc...
4816
  		}
66c80b607   Joe Perches   checkpatch: Add a...
4817
4818
  # check for sizeof without parenthesis
  		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4819
4820
4821
4822
  			if (WARN("SIZEOF_PARENTHESIS",
  				 "sizeof $1 should be sizeof($1)
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4823
  				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc1   Joe Perches   checkpatch: add a...
4824
  			}
66c80b607   Joe Perches   checkpatch: Add a...
4825
  		}
428e2fdc4   Joe Perches   checkpatch: add c...
4826
4827
  # check for line continuations in quoted strings with odd counts of "
  		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
4828
4829
4830
  			WARN("LINE_CONTINUATIONS",
  			     "Avoid line continuations in quoted strings
  " . $herecurr);
428e2fdc4   Joe Perches   checkpatch: add c...
4831
  		}
88982fea5   Joe Perches   checkpatch: warn ...
4832
4833
4834
4835
4836
4837
  # 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...
4838
  # check for seq_printf uses that could be seq_puts
066687279   Joe Perches   checkpatch: updat...
4839
  		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d727   Joe Perches   checkpatch: Prefe...
4840
  			my $fmt = get_quoted_string($line, $rawline);
066687279   Joe Perches   checkpatch: updat...
4841
  			if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
d5e616fc1   Joe Perches   checkpatch: add a...
4842
4843
4844
4845
  				if (WARN("PREFER_SEQ_PUTS",
  					 "Prefer seq_puts to seq_printf
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4846
  					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc1   Joe Perches   checkpatch: add a...
4847
  				}
a6962d727   Joe Perches   checkpatch: Prefe...
4848
4849
  			}
  		}
554e165cf   Andy Whitcroft   checkpatch: check...
4850
  # Check for misused memsets
d1fe9c099   Joe Perches   checkpatch: add s...
4851
4852
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
4853
4854
4855
  		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
  
  			my $ms_addr = $2;
d1fe9c099   Joe Perches   checkpatch: add s...
4856
4857
  			my $ms_val = $7;
  			my $ms_size = $12;
554e165cf   Andy Whitcroft   checkpatch: check...
4858

554e165cf   Andy Whitcroft   checkpatch: check...
4859
4860
  			if ($ms_size =~ /^(0x|)0$/i) {
  				ERROR("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
4861
4862
4863
4864
  				      "memset to 0's uses 0 as the 2nd argument, not the 3rd
  " . "$here
  $stat
  ");
554e165cf   Andy Whitcroft   checkpatch: check...
4865
4866
  			} elsif ($ms_size =~ /^(0x|)1$/i) {
  				WARN("MEMSET",
d7c76ba7e   Joe Perches   checkpatch: impro...
4867
4868
4869
4870
4871
4872
  				     "single byte memset is suspicious. Swapped 2nd/3rd argument?
  " . "$here
  $stat
  ");
  			}
  		}
98a9bba51   Joe Perches   checkpatch: prefe...
4873
4874
4875
4876
4877
4878
4879
  # 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...
4880
  				$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...
4881
4882
  			}
  		}
d7c76ba7e   Joe Perches   checkpatch: impro...
4883
  # typecasts on min/max could be min_t/max_t
d1fe9c099   Joe Perches   checkpatch: add s...
4884
4885
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
d7c76ba7e   Joe Perches   checkpatch: impro...
4886
  		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c099   Joe Perches   checkpatch: add s...
4887
  			if (defined $2 || defined $7) {
d7c76ba7e   Joe Perches   checkpatch: impro...
4888
4889
4890
  				my $call = $1;
  				my $cast1 = deparenthesize($2);
  				my $arg1 = $3;
d1fe9c099   Joe Perches   checkpatch: add s...
4891
4892
  				my $cast2 = deparenthesize($7);
  				my $arg2 = $8;
d7c76ba7e   Joe Perches   checkpatch: impro...
4893
  				my $cast;
d1fe9c099   Joe Perches   checkpatch: add s...
4894
  				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7e   Joe Perches   checkpatch: impro...
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
  					$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...
4906
4907
  			}
  		}
4a273195a   Joe Perches   checkpatch: check...
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
  # 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...
4929
4930
4931
  # check for naked sscanf
  		if ($^V && $^V ge 5.10.0 &&
  		    defined $stat &&
6c8bd7076   Joe Perches   checkpatch: avoid...
4932
  		    $line =~ /\bsscanf\b/ &&
823b794ce   Joe Perches   checkpatch: add c...
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
  		    ($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...
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
  # 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 ...
4975
4976
4977
  # check for new externs in .h files.
  		if ($realfile =~ /\.h$/ &&
  		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780d   Joe Perches   checkpatch: make ...
4978
4979
4980
  			if (CHK("AVOID_EXTERNS",
  				"extern prototypes should be avoided in .h files
  " . $herecurr) &&
70dc8a483   Joe Perches   checkpatch: warn ...
4981
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
4982
  				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a483   Joe Perches   checkpatch: warn ...
4983
4984
  			}
  		}
de7d4f0e1   Andy Whitcroft   update checkpatch...
4985
  # check for new externs in .c files.
171ae1a49   Andy Whitcroft   update checkpatch...
4986
  		if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd2   Andy Whitcroft   update checkpatch...
4987
  		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a49   Andy Whitcroft   update checkpatch...
4988
  		{
c45dcabd2   Andy Whitcroft   update checkpatch...
4989
4990
  			my $function_name = $1;
  			my $paren_space = $2;
171ae1a49   Andy Whitcroft   update checkpatch...
4991
4992
4993
4994
4995
  
  			my $s = $stat;
  			if (defined $cond) {
  				substr($s, 0, length($cond), '');
  			}
c45dcabd2   Andy Whitcroft   update checkpatch...
4996
4997
4998
  			if ($s =~ /^\s*;/ &&
  			    $function_name ne 'uninitialized_var')
  			{
000d1cc18   Joe Perches   checkpatch.pl: ad...
4999
5000
5001
  				WARN("AVOID_EXTERNS",
  				     "externs should be avoided in .c files
  " .  $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
5002
5003
5004
5005
  			}
  
  			if ($paren_space =~ /
  /) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5006
5007
5008
  				WARN("FUNCTION_ARGUMENTS",
  				     "arguments for function declarations should follow identifier
  " . $herecurr);
171ae1a49   Andy Whitcroft   update checkpatch...
5009
  			}
9c9ba34ee   Andy Whitcroft   update checkpatch...
5010
5011
5012
5013
  
  		} elsif ($realfile =~ /\.c$/ && defined $stat &&
  		    $stat =~ /^.\s*extern\s+/)
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5014
5015
5016
  			WARN("AVOID_EXTERNS",
  			     "externs should be avoided in .c files
  " .  $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5017
5018
5019
5020
5021
5022
5023
  		}
  
  # checks for new __setup's
  		if ($rawline =~ /\b__setup\("([^"]*)"/) {
  			my $name = $1;
  
  			if (!grep(/$name/, @setup_docs)) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5024
5025
5026
  				CHK("UNDOCUMENTED_SETUP",
  				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt
  " . $herecurr);
de7d4f0e1   Andy Whitcroft   update checkpatch...
5027
  			}
653d4876b   Andy Whitcroft   update checkpatch...
5028
  		}
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5029
5030
  
  # check for pointless casting of kmalloc return
caf2a54f1   Joe Perches   scripts/checkpatc...
5031
  		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5032
5033
5034
  			WARN("UNNECESSARY_CASTS",
  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html
  " . $herecurr);
9c0ca6f9a   Andy Whitcroft   update checkpatch...
5035
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5036

a640d25ce   Joe Perches   checkpatch: add -...
5037
5038
5039
5040
5041
5042
5043
5044
  # 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...
5045
5046
  # 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 ...
5047
  		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
60a55369a   Joe Perches   checkpatch: add w...
5048
5049
5050
5051
5052
  			my $oldfunc = $3;
  			my $a1 = $4;
  			my $a2 = $10;
  			my $newfunc = "kmalloc_array";
  			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a9   Joe Perches   checkpatch: emit ...
5053
5054
5055
5056
5057
5058
5059
5060
  			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...
5061
5062
5063
5064
  				if (WARN("ALLOC_WITH_MULTIPLY",
  					 "Prefer $newfunc over $oldfunc with multiply
  " . $herecurr) &&
  				    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5065
  					$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...
5066
5067
5068
5069
  
  				}
  			}
  		}
972fdea2e   Joe Perches   checkpatch: add c...
5070
5071
5072
5073
5074
5075
5076
  # 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...
5077
5078
5079
5080
5081
5082
  # 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...
5083
5084
  # check for multiple semicolons
  		if ($line =~ /;\s*;\s*$/) {
d5e616fc1   Joe Perches   checkpatch: add a...
5085
5086
5087
5088
  			if (WARN("ONE_SEMICOLON",
  				 "Statements terminations use 1 semicolon
  " . $herecurr) &&
  			    $fix) {
194f66fc9   Joe Perches   checkpatch: add a...
5089
  				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc1   Joe Perches   checkpatch: add a...
5090
  			}
d1e2ad07e   Joe Perches   checkpatch: add -...
5091
  		}
e81f239b4   Joe Perches   checkpatch: fix f...
5092
  # check for case / default statements not preceded by break/fallthrough/switch
c34c09a84   Joe Perches   checkpatch: attem...
5093
5094
5095
5096
5097
  		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...
5098
  			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a84   Joe Perches   checkpatch: attem...
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
  				$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 -...
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
  # 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...
5132
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5133
  # check for gcc specific __FUNCTION__
d5e616fc1   Joe Perches   checkpatch: add a...
5134
5135
5136
5137
5138
  		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...
5139
  				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc1   Joe Perches   checkpatch: add a...
5140
  			}
13214adf7   Andy Whitcroft   update checkpatch...
5141
  		}
773647a09   Andy Whitcroft   update checkpatch...
5142

2c92488ab   Joe Perches   checkpatch: warn ...
5143
5144
5145
5146
5147
5148
  # 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...
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
  # 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...
5177
5178
  # check for semaphores initialized locked
  		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5179
5180
5181
  			WARN("CONSIDER_COMPLETION",
  			     "consider using a completion
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
5182
  		}
6712d8585   Joe Perches   checkpatch: white...
5183

67d0a0754   Joe Perches   kernel.h/checkpat...
5184
5185
  # 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...
5186
  			WARN("CONSIDER_KSTRTO",
67d0a0754   Joe Perches   kernel.h/checkpat...
5187
5188
  			     "$1 is obsolete, use k$3 instead
  " . $herecurr);
773647a09   Andy Whitcroft   update checkpatch...
5189
  		}
6712d8585   Joe Perches   checkpatch: white...
5190

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

79404849e   Emese Revfy   checkpatch.pl: ex...
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
  # check for various ops structs, ensure they are const.
  		my $struct_ops = qr{acpi_dock_ops|
  				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|
  				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|
  				usb_mon_operations|
  				wd_ops}x;
6903ffb22   Andy Whitcroft   checkpatch: struc...
5236
  		if ($line !~ /\bconst\b/ &&
79404849e   Emese Revfy   checkpatch.pl: ex...
5237
  		    $line =~ /\bstruct\s+($struct_ops)\b/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5238
5239
5240
  			WARN("CONST_STRUCT",
  			     "struct $1 should normally be const
  " .
6903ffb22   Andy Whitcroft   checkpatch: struc...
5241
  				$herecurr);
2b6db5cb6   Andy Whitcroft   checkpatch: struc...
5242
  		}
773647a09   Andy Whitcroft   update checkpatch...
5243
5244
5245
5246
  
  # 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...
5247
5248
  		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
  		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a49   Andy Whitcroft   update checkpatch...
5249
5250
5251
  		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
  		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a09   Andy Whitcroft   update checkpatch...
5252
  		{
000d1cc18   Joe Perches   checkpatch.pl: ad...
5253
5254
5255
  			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...
5256
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
5257

52ea85061   Joe Perches   checkpatch: add t...
5258
5259
5260
5261
5262
5263
  # 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);
  		}
9c9ba34ee   Andy Whitcroft   update checkpatch...
5264
5265
5266
5267
  # check for %L{u,d,i} in strings
  		my $string;
  		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
  			$string = substr($rawline, $-[1], $+[1] - $-[1]);
2a1bc5d5c   Andy Whitcroft   checkpatch: %Lx t...
5268
  			$string =~ s/%%/__/g;
9c9ba34ee   Andy Whitcroft   update checkpatch...
5269
  			if ($string =~ /(?<!%)%L[udi]/) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5270
5271
5272
  				WARN("PRINTF_L",
  				     "\%Ld/%Lu are not-standard C, use %lld/%llu
  " . $herecurr);
9c9ba34ee   Andy Whitcroft   update checkpatch...
5273
5274
5275
  				last;
  			}
  		}
691d77b6b   Andy Whitcroft   checkpatch: add c...
5276
5277
5278
5279
  
  # whine mightly about in_atomic
  		if ($line =~ /\bin_atomic\s*\(/) {
  			if ($realfile =~ m@^drivers/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5280
5281
5282
  				ERROR("IN_ATOMIC",
  				      "do not use in_atomic in drivers
  " . $herecurr);
f4a877367   Andy Whitcroft   checkpatch: make ...
5283
  			} elsif ($realfile !~ m@^kernel/@) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5284
5285
5286
  				WARN("IN_ATOMIC",
  				     "use of in_atomic() is incorrect outside core kernel code
  " . $herecurr);
691d77b6b   Andy Whitcroft   checkpatch: add c...
5287
5288
  			}
  		}
1704f47b5   Peter Zijlstra   lockdep: Add nova...
5289
5290
5291
5292
5293
5294
5295
  
  # 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...
5296
5297
5298
  				ERROR("LOCKDEP",
  				      "lockdep_no_validate class is reserved for device->mutex.
  " . $herecurr);
1704f47b5   Peter Zijlstra   lockdep: Add nova...
5299
5300
  			}
  		}
88f8831c0   Dave Jones   checkpatch: check...
5301
5302
5303
  
  		if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
  		    $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5304
5305
5306
  			WARN("EXPORTED_WORLD_WRITABLE",
  			     "Exporting world writable files is usually an error. Consider more restrictive permissions.
  " . $herecurr);
88f8831c0   Dave Jones   checkpatch: check...
5307
  		}
2435880fe   Joe Perches   checkpatch: add c...
5308

515a235ef   Joe Perches   checkpatch: impro...
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
  # 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);
  					}
2435880fe   Joe Perches   checkpatch: add c...
5334
5335
5336
  				}
  			}
  		}
13214adf7   Andy Whitcroft   update checkpatch...
5337
5338
5339
5340
5341
5342
  	}
  
  	# 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...
5343
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
  	# 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...
5357
5358
5359
  		ERROR("NOT_UNIFIED_DIFF",
  		      "Does not appear to be a unified-diff format patch
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
5360
5361
  	}
  	if ($is_patch && $chk_signoff && $signoff == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5362
5363
5364
  		ERROR("MISSING_SIGN_OFF",
  		      "Missing Signed-off-by: line(s)
  ");
0a920b5b6   Andy Whitcroft   add a trivial pat...
5365
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5366
  	print report_dump();
13214adf7   Andy Whitcroft   update checkpatch...
5367
5368
  	if ($summary && !($clean == 1 && $quiet == 1)) {
  		print "$filename " if ($summary_file);
8905a67c6   Andy Whitcroft   update checkpatch...
5369
5370
5371
5372
5373
5374
  		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...
5375
  	}
8905a67c6   Andy Whitcroft   update checkpatch...
5376

d2c0a2351   Andy Whitcroft   checkpatch: sugge...
5377
  	if ($quiet == 0) {
d1fe9c099   Joe Perches   checkpatch: add s...
5378
5379
5380
5381
5382
5383
5384
5385
  
  		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...
5386
5387
5388
5389
5390
5391
5392
5393
  		# 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...
5394
  			$rpt_cleaners = 0;
d2c0a2351   Andy Whitcroft   checkpatch: sugge...
5395
5396
  		}
  	}
91bfe4843   Joe Perches   checkpatch: add -...
5397
5398
  	hash_show_words(\%use_type, "Used");
  	hash_show_words(\%ignore_type, "Ignored");
000d1cc18   Joe Perches   checkpatch.pl: ad...
5399

d752fcc88   Joe Perches   checkpatch: add a...
5400
5401
5402
  	if ($clean == 0 && $fix &&
  	    ("@rawlines" ne "@fixed" ||
  	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d65   Joe Perches   checkpatch: add a...
5403
5404
  		my $newfile = $filename;
  		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5bc   Joe Perches   checkpatch: creat...
5405
5406
  		my $linecount = 0;
  		my $f;
d752fcc88   Joe Perches   checkpatch: add a...
5407
  		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
3705ce5bc   Joe Perches   checkpatch: creat...
5408
5409
5410
5411
5412
5413
5414
5415
  		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...
5416
5417
  					print $f $fixed_line . "
  ";
3705ce5bc   Joe Perches   checkpatch: creat...
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
  				}
  			} 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...
5439
  	if ($clean == 1 && $quiet == 0) {
c2fdda0df   Andy Whitcroft   update checkpatch...
5440
5441
  		print "$vname has no obvious style problems and is ready for submission.
  "
0a920b5b6   Andy Whitcroft   add a trivial pat...
5442
5443
  	}
  	if ($clean == 0 && $quiet == 0) {
000d1cc18   Joe Perches   checkpatch.pl: ad...
5444
5445
5446
5447
5448
5449
  		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...
5450
  	}
13214adf7   Andy Whitcroft   update checkpatch...
5451

0a920b5b6   Andy Whitcroft   add a trivial pat...
5452
5453
  	return $clean;
  }