• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3#
4# (c) 2001, Dave Jones. (the file handling bit)
5# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
6# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
7# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
8# (c) 2010-2018 Joe Perches <joe@perches.com>
9
10use strict;
11use warnings;
12use POSIX;
13use File::Basename;
14use Cwd 'abs_path';
15use Term::ANSIColor qw(:constants);
16use Encode qw(decode encode);
17
18my $P = $0;
19my $D = dirname(abs_path($P));
20
21my $V = '0.32';
22
23use Getopt::Long qw(:config no_auto_abbrev);
24
25my $quiet = 0;
26my $tree = 1;
27my $chk_signoff = 1;
28my $chk_patch = 1;
29my $tst_only;
30my $emacs = 0;
31my $terse = 0;
32my $showfile = 0;
33my $file = 0;
34my $git = 0;
35my %git_commits = ();
36my $check = 0;
37my $check_orig = 0;
38my $summary = 1;
39my $mailback = 0;
40my $summary_file = 0;
41my $show_types = 0;
42my $list_types = 0;
43my $fix = 0;
44my $fix_inplace = 0;
45my $root;
46my %debug;
47my %camelcase = ();
48my %use_type = ();
49my @use = ();
50my %ignore_type = ();
51my @ignore = ();
52my $help = 0;
53my $configuration_file = ".checkpatch.conf";
54my $max_line_length = 80;
55my $ignore_perl_version = 0;
56my $minimum_perl_version = 5.10.0;
57my $min_conf_desc_length = 4;
58my $spelling_file = "$D/spelling.txt";
59my $codespell = 0;
60my $codespellfile = "/usr/share/codespell/dictionary.txt";
61my $conststructsfile = "$D/const_structs.checkpatch";
62my $typedefsfile = "";
63my $color = "auto";
64my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
65# git output parsing needs US English output, so first set backtick child process LANGUAGE
66my $git_command ='export LANGUAGE=en_US.UTF-8; git';
67
68sub help {
69	my ($exitcode) = @_;
70
71	print << "EOM";
72Usage: $P [OPTION]... [FILE]...
73Version: $V
74
75Options:
76  -q, --quiet                quiet
77  --no-tree                  run without a kernel tree
78  --no-signoff               do not check for 'Signed-off-by' line
79  --patch                    treat FILE as patchfile (default)
80  --emacs                    emacs compile window format
81  --terse                    one line per report
82  --showfile                 emit diffed file position, not input file position
83  -g, --git                  treat FILE as a single commit or git revision range
84                             single git commit with:
85                               <rev>
86                               <rev>^
87                               <rev>~n
88                             multiple git commits with:
89                               <rev1>..<rev2>
90                               <rev1>...<rev2>
91                               <rev>-<count>
92                             git merges are ignored
93  -f, --file                 treat FILE as regular source file
94  --subjective, --strict     enable more subjective tests
95  --list-types               list the possible message types
96  --types TYPE(,TYPE2...)    show only these comma separated message types
97  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
98  --show-types               show the specific message type in the output
99  --max-line-length=n        set the maximum line length, if exceeded, warn
100  --min-conf-desc-length=n   set the min description length, if shorter, warn
101  --root=PATH                PATH to the kernel tree root
102  --no-summary               suppress the per-file summary
103  --mailback                 only produce a report in case of warnings/errors
104  --summary-file             include the filename in summary
105  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
106                             'values', 'possible', 'type', and 'attr' (default
107                             is all off)
108  --test-only=WORD           report only warnings/errors containing WORD
109                             literally
110  --fix                      EXPERIMENTAL - may create horrible results
111                             If correctable single-line errors exist, create
112                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
113                             with potential errors corrected to the preferred
114                             checkpatch style
115  --fix-inplace              EXPERIMENTAL - may create horrible results
116                             Is the same as --fix, but overwrites the input
117                             file.  It's your fault if there's no backup or git
118  --ignore-perl-version      override checking of perl version.  expect
119                             runtime errors.
120  --codespell                Use the codespell dictionary for spelling/typos
121                             (default:/usr/share/codespell/dictionary.txt)
122  --codespellfile            Use this codespell dictionary
123  --typedefsfile             Read additional types from this file
124  --color[=WHEN]             Use colors 'always', 'never', or only when output
125                             is a terminal ('auto'). Default is 'auto'.
126  -h, --help, --version      display this help and exit
127
128When FILE is - read standard input.
129EOM
130
131	exit($exitcode);
132}
133
134sub uniq {
135	my %seen;
136	return grep { !$seen{$_}++ } @_;
137}
138
139sub list_types {
140	my ($exitcode) = @_;
141
142	my $count = 0;
143
144	local $/ = undef;
145
146	open(my $script, '<', abs_path($P)) or
147	    die "$P: Can't read '$P' $!\n";
148
149	my $text = <$script>;
150	close($script);
151
152	my @types = ();
153	# Also catch when type or level is passed through a variable
154	for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
155		push (@types, $_);
156	}
157	@types = sort(uniq(@types));
158	print("#\tMessage type\n\n");
159	foreach my $type (@types) {
160		print(++$count . "\t" . $type . "\n");
161	}
162
163	exit($exitcode);
164}
165
166my $conf = which_conf($configuration_file);
167if (-f $conf) {
168	my @conf_args;
169	open(my $conffile, '<', "$conf")
170	    or warn "$P: Can't find a readable $configuration_file file $!\n";
171
172	while (<$conffile>) {
173		my $line = $_;
174
175		$line =~ s/\s*\n?$//g;
176		$line =~ s/^\s*//g;
177		$line =~ s/\s+/ /g;
178
179		next if ($line =~ m/^\s*#/);
180		next if ($line =~ m/^\s*$/);
181
182		my @words = split(" ", $line);
183		foreach my $word (@words) {
184			last if ($word =~ m/^#/);
185			push (@conf_args, $word);
186		}
187	}
188	close($conffile);
189	unshift(@ARGV, @conf_args) if @conf_args;
190}
191
192# Perl's Getopt::Long allows options to take optional arguments after a space.
193# Prevent --color by itself from consuming other arguments
194foreach (@ARGV) {
195	if ($_ eq "--color" || $_ eq "-color") {
196		$_ = "--color=$color";
197	}
198}
199
200GetOptions(
201	'q|quiet+'	=> \$quiet,
202	'tree!'		=> \$tree,
203	'signoff!'	=> \$chk_signoff,
204	'patch!'	=> \$chk_patch,
205	'emacs!'	=> \$emacs,
206	'terse!'	=> \$terse,
207	'showfile!'	=> \$showfile,
208	'f|file!'	=> \$file,
209	'g|git!'	=> \$git,
210	'subjective!'	=> \$check,
211	'strict!'	=> \$check,
212	'ignore=s'	=> \@ignore,
213	'types=s'	=> \@use,
214	'show-types!'	=> \$show_types,
215	'list-types!'	=> \$list_types,
216	'max-line-length=i' => \$max_line_length,
217	'min-conf-desc-length=i' => \$min_conf_desc_length,
218	'root=s'	=> \$root,
219	'summary!'	=> \$summary,
220	'mailback!'	=> \$mailback,
221	'summary-file!'	=> \$summary_file,
222	'fix!'		=> \$fix,
223	'fix-inplace!'	=> \$fix_inplace,
224	'ignore-perl-version!' => \$ignore_perl_version,
225	'debug=s'	=> \%debug,
226	'test-only=s'	=> \$tst_only,
227	'codespell!'	=> \$codespell,
228	'codespellfile=s'	=> \$codespellfile,
229	'typedefsfile=s'	=> \$typedefsfile,
230	'color=s'	=> \$color,
231	'no-color'	=> \$color,	#keep old behaviors of -nocolor
232	'nocolor'	=> \$color,	#keep old behaviors of -nocolor
233	'h|help'	=> \$help,
234	'version'	=> \$help
235) or help(1);
236
237help(0) if ($help);
238
239list_types(0) if ($list_types);
240
241$fix = 1 if ($fix_inplace);
242$check_orig = $check;
243
244my $exit = 0;
245
246my $perl_version_ok = 1;
247if ($^V && $^V lt $minimum_perl_version) {
248	$perl_version_ok = 0;
249	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
250	exit(1) if (!$ignore_perl_version);
251}
252
253#if no filenames are given, push '-' to read patch from stdin
254if ($#ARGV < 0) {
255	push(@ARGV, '-');
256}
257
258if ($color =~ /^[01]$/) {
259	$color = !$color;
260} elsif ($color =~ /^always$/i) {
261	$color = 1;
262} elsif ($color =~ /^never$/i) {
263	$color = 0;
264} elsif ($color =~ /^auto$/i) {
265	$color = (-t STDOUT);
266} else {
267	die "Invalid color mode: $color\n";
268}
269
270sub hash_save_array_words {
271	my ($hashRef, $arrayRef) = @_;
272
273	my @array = split(/,/, join(',', @$arrayRef));
274	foreach my $word (@array) {
275		$word =~ s/\s*\n?$//g;
276		$word =~ s/^\s*//g;
277		$word =~ s/\s+/ /g;
278		$word =~ tr/[a-z]/[A-Z]/;
279
280		next if ($word =~ m/^\s*#/);
281		next if ($word =~ m/^\s*$/);
282
283		$hashRef->{$word}++;
284	}
285}
286
287sub hash_show_words {
288	my ($hashRef, $prefix) = @_;
289
290	if (keys %$hashRef) {
291		print "\nNOTE: $prefix message types:";
292		foreach my $word (sort keys %$hashRef) {
293			print " $word";
294		}
295		print "\n";
296	}
297}
298
299hash_save_array_words(\%ignore_type, \@ignore);
300hash_save_array_words(\%use_type, \@use);
301
302my $dbg_values = 0;
303my $dbg_possible = 0;
304my $dbg_type = 0;
305my $dbg_attr = 0;
306for my $key (keys %debug) {
307	## no critic
308	eval "\${dbg_$key} = '$debug{$key}';";
309	die "$@" if ($@);
310}
311
312my $rpt_cleaners = 0;
313
314if ($terse) {
315	$emacs = 1;
316	$quiet++;
317}
318
319if ($tree) {
320	if (defined $root) {
321		if (!top_of_kernel_tree($root)) {
322			die "$P: $root: --root does not point at a valid tree\n";
323		}
324	} else {
325		if (top_of_kernel_tree('.')) {
326			$root = '.';
327		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
328						top_of_kernel_tree($1)) {
329			$root = $1;
330		}
331	}
332
333	if (!defined $root) {
334		print "Must be run from the top-level dir. of a kernel tree\n";
335		exit(2);
336	}
337}
338
339my $emitted_corrupt = 0;
340
341our $Ident	= qr{
342			[A-Za-z_][A-Za-z\d_]*
343			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
344		}x;
345our $Storage	= qr{extern|static|asmlinkage};
346our $Sparse	= qr{
347			__user|
348			__kernel|
349			__force|
350			__iomem|
351			__must_check|
352			__kprobes|
353			__ref|
354			__refconst|
355			__refdata|
356			__rcu|
357			__private
358		}x;
359our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
360our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
361our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
362our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
363our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
364
365# Notes to $Attribute:
366# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
367our $Attribute	= qr{
368			const|
369			__percpu|
370			__nocast|
371			__safe|
372			__bitwise|
373			__packed__|
374			__packed2__|
375			__naked|
376			__maybe_unused|
377			__always_unused|
378			__noreturn|
379			__used|
380			__cold|
381			__pure|
382			__noclone|
383			__deprecated|
384			__read_mostly|
385			__ro_after_init|
386			__kprobes|
387			$InitAttribute|
388			____cacheline_aligned|
389			____cacheline_aligned_in_smp|
390			____cacheline_internodealigned_in_smp|
391			__weak
392		  }x;
393our $Modifier;
394our $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
395our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
396our $Lval	= qr{$Ident(?:$Member)*};
397
398our $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
399our $Binary	= qr{(?i)0b[01]+$Int_type?};
400our $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
401our $Int	= qr{[0-9]+$Int_type?};
402our $Octal	= qr{0[0-7]+$Int_type?};
403our $String	= qr{"[X\t]*"};
404our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
405our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
406our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
407our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
408our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
409our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
410our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
411our $Arithmetic = qr{\+|-|\*|\/|%};
412our $Operators	= qr{
413			<=|>=|==|!=|
414			=>|->|<<|>>|<|>|!|~|
415			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
416		  }x;
417
418our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
419
420our $BasicType;
421our $NonptrType;
422our $NonptrTypeMisordered;
423our $NonptrTypeWithAttr;
424our $Type;
425our $TypeMisordered;
426our $Declare;
427our $DeclareMisordered;
428
429our $NON_ASCII_UTF8	= qr{
430	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
431	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
432	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
433	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
434	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
435	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
436	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
437}x;
438
439our $UTF8	= qr{
440	[\x09\x0A\x0D\x20-\x7E]              # ASCII
441	| $NON_ASCII_UTF8
442}x;
443
444our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
445our $typeOtherOSTypedefs = qr{(?x:
446	u_(?:char|short|int|long) |          # bsd
447	u(?:nchar|short|int|long)            # sysv
448)};
449our $typeKernelTypedefs = qr{(?x:
450	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
451	atomic_t
452)};
453our $typeTypedefs = qr{(?x:
454	$typeC99Typedefs\b|
455	$typeOtherOSTypedefs\b|
456	$typeKernelTypedefs\b
457)};
458
459our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
460
461our $logFunctions = qr{(?x:
462	printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
463	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
464	TP_printk|
465	WARN(?:_RATELIMIT|_ONCE|)|
466	panic|
467	debug|
468	printf|
469	MODULE_[A-Z_]+|
470	seq_vprintf|seq_printf|seq_puts
471)};
472
473our $allocFunctions = qr{(?x:
474	(?:(?:devm_)?
475		(?:kv|k|v)[czm]alloc(?:_node|_array)? |
476		kstrdup(?:_const)? |
477		kmemdup(?:_nul)?) |
478	(?:\w+)?alloc_skb(?:ip_align)? |
479				# dev_alloc_skb/netdev_alloc_skb, et al
480	dma_alloc_coherent
481)};
482
483our $signature_tags = qr{(?xi:
484	Signed-off-by:|
485	Co-developed-by:|
486	Acked-by:|
487	Tested-by:|
488	Reviewed-by:|
489	Reported-by:|
490	Suggested-by:|
491	To:|
492	Cc:
493)};
494
495our @typeListMisordered = (
496	qr{char\s+(?:un)?signed},
497	qr{int\s+(?:(?:un)?signed\s+)?short\s},
498	qr{int\s+short(?:\s+(?:un)?signed)},
499	qr{short\s+int(?:\s+(?:un)?signed)},
500	qr{(?:un)?signed\s+int\s+short},
501	qr{short\s+(?:un)?signed},
502	qr{long\s+int\s+(?:un)?signed},
503	qr{int\s+long\s+(?:un)?signed},
504	qr{long\s+(?:un)?signed\s+int},
505	qr{int\s+(?:un)?signed\s+long},
506	qr{int\s+(?:un)?signed},
507	qr{int\s+long\s+long\s+(?:un)?signed},
508	qr{long\s+long\s+int\s+(?:un)?signed},
509	qr{long\s+long\s+(?:un)?signed\s+int},
510	qr{long\s+long\s+(?:un)?signed},
511	qr{long\s+(?:un)?signed},
512);
513
514our @typeList = (
515	qr{void},
516	qr{(?:(?:un)?signed\s+)?char},
517	qr{(?:(?:un)?signed\s+)?short\s+int},
518	qr{(?:(?:un)?signed\s+)?short},
519	qr{(?:(?:un)?signed\s+)?int},
520	qr{(?:(?:un)?signed\s+)?long\s+int},
521	qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
522	qr{(?:(?:un)?signed\s+)?long\s+long},
523	qr{(?:(?:un)?signed\s+)?long},
524	qr{(?:un)?signed},
525	qr{float},
526	qr{double},
527	qr{bool},
528	qr{struct\s+$Ident},
529	qr{union\s+$Ident},
530	qr{enum\s+$Ident},
531	qr{${Ident}_t},
532	qr{${Ident}_handler},
533	qr{${Ident}_handler_fn},
534	@typeListMisordered,
535);
536
537our $C90_int_types = qr{(?x:
538	long\s+long\s+int\s+(?:un)?signed|
539	long\s+long\s+(?:un)?signed\s+int|
540	long\s+long\s+(?:un)?signed|
541	(?:(?:un)?signed\s+)?long\s+long\s+int|
542	(?:(?:un)?signed\s+)?long\s+long|
543	int\s+long\s+long\s+(?:un)?signed|
544	int\s+(?:(?:un)?signed\s+)?long\s+long|
545
546	long\s+int\s+(?:un)?signed|
547	long\s+(?:un)?signed\s+int|
548	long\s+(?:un)?signed|
549	(?:(?:un)?signed\s+)?long\s+int|
550	(?:(?:un)?signed\s+)?long|
551	int\s+long\s+(?:un)?signed|
552	int\s+(?:(?:un)?signed\s+)?long|
553
554	int\s+(?:un)?signed|
555	(?:(?:un)?signed\s+)?int
556)};
557
558our @typeListFile = ();
559our @typeListWithAttr = (
560	@typeList,
561	qr{struct\s+$InitAttribute\s+$Ident},
562	qr{union\s+$InitAttribute\s+$Ident},
563);
564
565our @modifierList = (
566	qr{fastcall},
567);
568our @modifierListFile = ();
569
570our @mode_permission_funcs = (
571	["module_param", 3],
572	["module_param_(?:array|named|string)", 4],
573	["module_param_array_named", 5],
574	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
575	["proc_create(?:_data|)", 2],
576	["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
577	["IIO_DEV_ATTR_[A-Z_]+", 1],
578	["SENSOR_(?:DEVICE_|)ATTR_2", 2],
579	["SENSOR_TEMPLATE(?:_2|)", 3],
580	["__ATTR", 2],
581);
582
583#Create a search pattern for all these functions to speed up a loop below
584our $mode_perms_search = "";
585foreach my $entry (@mode_permission_funcs) {
586	$mode_perms_search .= '|' if ($mode_perms_search ne "");
587	$mode_perms_search .= $entry->[0];
588}
589$mode_perms_search = "(?:${mode_perms_search})";
590
591our %deprecated_apis = (
592	"synchronize_rcu_bh"			=> "synchronize_rcu",
593	"synchronize_rcu_bh_expedited"		=> "synchronize_rcu_expedited",
594	"call_rcu_bh"				=> "call_rcu",
595	"rcu_barrier_bh"			=> "rcu_barrier",
596	"synchronize_sched"			=> "synchronize_rcu",
597	"synchronize_sched_expedited"		=> "synchronize_rcu_expedited",
598	"call_rcu_sched"			=> "call_rcu",
599	"rcu_barrier_sched"			=> "rcu_barrier",
600	"get_state_synchronize_sched"		=> "get_state_synchronize_rcu",
601	"cond_synchronize_sched"		=> "cond_synchronize_rcu",
602);
603
604#Create a search pattern for all these strings to speed up a loop below
605our $deprecated_apis_search = "";
606foreach my $entry (keys %deprecated_apis) {
607	$deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
608	$deprecated_apis_search .= $entry;
609}
610$deprecated_apis_search = "(?:${deprecated_apis_search})";
611
612our $mode_perms_world_writable = qr{
613	S_IWUGO		|
614	S_IWOTH		|
615	S_IRWXUGO	|
616	S_IALLUGO	|
617	0[0-7][0-7][2367]
618}x;
619
620our %mode_permission_string_types = (
621	"S_IRWXU" => 0700,
622	"S_IRUSR" => 0400,
623	"S_IWUSR" => 0200,
624	"S_IXUSR" => 0100,
625	"S_IRWXG" => 0070,
626	"S_IRGRP" => 0040,
627	"S_IWGRP" => 0020,
628	"S_IXGRP" => 0010,
629	"S_IRWXO" => 0007,
630	"S_IROTH" => 0004,
631	"S_IWOTH" => 0002,
632	"S_IXOTH" => 0001,
633	"S_IRWXUGO" => 0777,
634	"S_IRUGO" => 0444,
635	"S_IWUGO" => 0222,
636	"S_IXUGO" => 0111,
637);
638
639#Create a search pattern for all these strings to speed up a loop below
640our $mode_perms_string_search = "";
641foreach my $entry (keys %mode_permission_string_types) {
642	$mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
643	$mode_perms_string_search .= $entry;
644}
645our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
646our $multi_mode_perms_string_search = qr{
647	${single_mode_perms_string_search}
648	(?:\s*\|\s*${single_mode_perms_string_search})*
649}x;
650
651sub perms_to_octal {
652	my ($string) = @_;
653
654	return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
655
656	my $val = "";
657	my $oval = "";
658	my $to = 0;
659	my $curpos = 0;
660	my $lastpos = 0;
661	while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
662		$curpos = pos($string);
663		my $match = $2;
664		my $omatch = $1;
665		last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
666		$lastpos = $curpos;
667		$to |= $mode_permission_string_types{$match};
668		$val .= '\s*\|\s*' if ($val ne "");
669		$val .= $match;
670		$oval .= $omatch;
671	}
672	$oval =~ s/^\s*\|\s*//;
673	$oval =~ s/\s*\|\s*$//;
674	return sprintf("%04o", $to);
675}
676
677our $allowed_asm_includes = qr{(?x:
678	irq|
679	memory|
680	time|
681	reboot
682)};
683# memory.h: ARM has a custom one
684
685# Load common spelling mistakes and build regular expression list.
686my $misspellings;
687my %spelling_fix;
688
689if (open(my $spelling, '<', $spelling_file)) {
690	while (<$spelling>) {
691		my $line = $_;
692
693		$line =~ s/\s*\n?$//g;
694		$line =~ s/^\s*//g;
695
696		next if ($line =~ m/^\s*#/);
697		next if ($line =~ m/^\s*$/);
698
699		my ($suspect, $fix) = split(/\|\|/, $line);
700
701		$spelling_fix{$suspect} = $fix;
702	}
703	close($spelling);
704} else {
705	warn "No typos will be found - file '$spelling_file': $!\n";
706}
707
708if ($codespell) {
709	if (open(my $spelling, '<', $codespellfile)) {
710		while (<$spelling>) {
711			my $line = $_;
712
713			$line =~ s/\s*\n?$//g;
714			$line =~ s/^\s*//g;
715
716			next if ($line =~ m/^\s*#/);
717			next if ($line =~ m/^\s*$/);
718			next if ($line =~ m/, disabled/i);
719
720			$line =~ s/,.*$//;
721
722			my ($suspect, $fix) = split(/->/, $line);
723
724			$spelling_fix{$suspect} = $fix;
725		}
726		close($spelling);
727	} else {
728		warn "No codespell typos will be found - file '$codespellfile': $!\n";
729	}
730}
731
732$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
733
734sub read_words {
735	my ($wordsRef, $file) = @_;
736
737	if (open(my $words, '<', $file)) {
738		while (<$words>) {
739			my $line = $_;
740
741			$line =~ s/\s*\n?$//g;
742			$line =~ s/^\s*//g;
743
744			next if ($line =~ m/^\s*#/);
745			next if ($line =~ m/^\s*$/);
746			if ($line =~ /\s/) {
747				print("$file: '$line' invalid - ignored\n");
748				next;
749			}
750
751			$$wordsRef .= '|' if ($$wordsRef ne "");
752			$$wordsRef .= $line;
753		}
754		close($file);
755		return 1;
756	}
757
758	return 0;
759}
760
761my $const_structs = "";
762read_words(\$const_structs, $conststructsfile)
763    or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
764
765my $typeOtherTypedefs = "";
766if (length($typedefsfile)) {
767	read_words(\$typeOtherTypedefs, $typedefsfile)
768	    or warn "No additional types will be considered - file '$typedefsfile': $!\n";
769}
770$typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
771
772sub build_types {
773	my $mods = "(?x:  \n" . join("|\n  ", (@modifierList, @modifierListFile)) . "\n)";
774	my $all = "(?x:  \n" . join("|\n  ", (@typeList, @typeListFile)) . "\n)";
775	my $Misordered = "(?x:  \n" . join("|\n  ", @typeListMisordered) . "\n)";
776	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
777	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
778	$BasicType	= qr{
779				(?:$typeTypedefs\b)|
780				(?:${all}\b)
781		}x;
782	$NonptrType	= qr{
783			(?:$Modifier\s+|const\s+)*
784			(?:
785				(?:typeof|__typeof__)\s*\([^\)]*\)|
786				(?:$typeTypedefs\b)|
787				(?:${all}\b)
788			)
789			(?:\s+$Modifier|\s+const)*
790		  }x;
791	$NonptrTypeMisordered	= qr{
792			(?:$Modifier\s+|const\s+)*
793			(?:
794				(?:${Misordered}\b)
795			)
796			(?:\s+$Modifier|\s+const)*
797		  }x;
798	$NonptrTypeWithAttr	= qr{
799			(?:$Modifier\s+|const\s+)*
800			(?:
801				(?:typeof|__typeof__)\s*\([^\)]*\)|
802				(?:$typeTypedefs\b)|
803				(?:${allWithAttr}\b)
804			)
805			(?:\s+$Modifier|\s+const)*
806		  }x;
807	$Type	= qr{
808			$NonptrType
809			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
810			(?:\s+$Inline|\s+$Modifier)*
811		  }x;
812	$TypeMisordered	= qr{
813			$NonptrTypeMisordered
814			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
815			(?:\s+$Inline|\s+$Modifier)*
816		  }x;
817	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
818	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
819}
820build_types();
821
822our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
823
824# Using $balanced_parens, $LvalOrFunc, or $FuncArg
825# requires at least perl version v5.10.0
826# Any use must be runtime checked with $^V
827
828our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
829our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
830our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
831
832our $declaration_macros = qr{(?x:
833	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
834	(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
835	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|
836	(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
837)};
838
839sub deparenthesize {
840	my ($string) = @_;
841	return "" if (!defined($string));
842
843	while ($string =~ /^\s*\(.*\)\s*$/) {
844		$string =~ s@^\s*\(\s*@@;
845		$string =~ s@\s*\)\s*$@@;
846	}
847
848	$string =~ s@\s+@ @g;
849
850	return $string;
851}
852
853sub seed_camelcase_file {
854	my ($file) = @_;
855
856	return if (!(-f $file));
857
858	local $/;
859
860	open(my $include_file, '<', "$file")
861	    or warn "$P: Can't read '$file' $!\n";
862	my $text = <$include_file>;
863	close($include_file);
864
865	my @lines = split('\n', $text);
866
867	foreach my $line (@lines) {
868		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
869		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
870			$camelcase{$1} = 1;
871		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
872			$camelcase{$1} = 1;
873		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
874			$camelcase{$1} = 1;
875		}
876	}
877}
878
879sub is_maintained_obsolete {
880	my ($filename) = @_;
881
882	return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
883
884	my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
885
886	return $status =~ /obsolete/i;
887}
888
889sub is_SPDX_License_valid {
890	my ($license) = @_;
891
892	return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$root/.git"));
893
894	my $root_path = abs_path($root);
895	my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
896	return 0 if ($status ne "");
897	return 1;
898}
899
900my $camelcase_seeded = 0;
901sub seed_camelcase_includes {
902	return if ($camelcase_seeded);
903
904	my $files;
905	my $camelcase_cache = "";
906	my @include_files = ();
907
908	$camelcase_seeded = 1;
909
910	if (-e ".git") {
911		my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
912		chomp $git_last_include_commit;
913		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
914	} else {
915		my $last_mod_date = 0;
916		$files = `find $root/include -name "*.h"`;
917		@include_files = split('\n', $files);
918		foreach my $file (@include_files) {
919			my $date = POSIX::strftime("%Y%m%d%H%M",
920						   localtime((stat $file)[9]));
921			$last_mod_date = $date if ($last_mod_date < $date);
922		}
923		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
924	}
925
926	if ($camelcase_cache ne "" && -f $camelcase_cache) {
927		open(my $camelcase_file, '<', "$camelcase_cache")
928		    or warn "$P: Can't read '$camelcase_cache' $!\n";
929		while (<$camelcase_file>) {
930			chomp;
931			$camelcase{$_} = 1;
932		}
933		close($camelcase_file);
934
935		return;
936	}
937
938	if (-e ".git") {
939		$files = `${git_command} ls-files "include/*.h"`;
940		@include_files = split('\n', $files);
941	}
942
943	foreach my $file (@include_files) {
944		seed_camelcase_file($file);
945	}
946
947	if ($camelcase_cache ne "") {
948		unlink glob ".checkpatch-camelcase.*";
949		open(my $camelcase_file, '>', "$camelcase_cache")
950		    or warn "$P: Can't write '$camelcase_cache' $!\n";
951		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
952			print $camelcase_file ("$_\n");
953		}
954		close($camelcase_file);
955	}
956}
957
958sub git_commit_info {
959	my ($commit, $id, $desc) = @_;
960
961	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
962
963	my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
964	$output =~ s/^\s*//gm;
965	my @lines = split("\n", $output);
966
967	return ($id, $desc) if ($#lines < 0);
968
969	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
970# Maybe one day convert this block of bash into something that returns
971# all matching commit ids, but it's very slow...
972#
973#		echo "checking commits $1..."
974#		git rev-list --remotes | grep -i "^$1" |
975#		while read line ; do
976#		    git log --format='%H %s' -1 $line |
977#		    echo "commit $(cut -c 1-12,41-)"
978#		done
979	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
980		$id = undef;
981	} else {
982		$id = substr($lines[0], 0, 12);
983		$desc = substr($lines[0], 41);
984	}
985
986	return ($id, $desc);
987}
988
989$chk_signoff = 0 if ($file);
990
991my @rawlines = ();
992my @lines = ();
993my @fixed = ();
994my @fixed_inserted = ();
995my @fixed_deleted = ();
996my $fixlinenr = -1;
997
998# If input is git commits, extract all commits from the commit expressions.
999# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
1000die "$P: No git repository found\n" if ($git && !-e ".git");
1001
1002if ($git) {
1003	my @commits = ();
1004	foreach my $commit_expr (@ARGV) {
1005		my $git_range;
1006		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
1007			$git_range = "-$2 $1";
1008		} elsif ($commit_expr =~ m/\.\./) {
1009			$git_range = "$commit_expr";
1010		} else {
1011			$git_range = "-1 $commit_expr";
1012		}
1013		my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
1014		foreach my $line (split(/\n/, $lines)) {
1015			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
1016			next if (!defined($1) || !defined($2));
1017			my $sha1 = $1;
1018			my $subject = $2;
1019			unshift(@commits, $sha1);
1020			$git_commits{$sha1} = $subject;
1021		}
1022	}
1023	die "$P: no git commits after extraction!\n" if (@commits == 0);
1024	@ARGV = @commits;
1025}
1026
1027my $vname;
1028$allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
1029for my $filename (@ARGV) {
1030	my $FILE;
1031	if ($git) {
1032		open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
1033			die "$P: $filename: git format-patch failed - $!\n";
1034	} elsif ($file) {
1035		open($FILE, '-|', "diff -u /dev/null $filename") ||
1036			die "$P: $filename: diff failed - $!\n";
1037	} elsif ($filename eq '-') {
1038		open($FILE, '<&STDIN');
1039	} else {
1040		open($FILE, '<', "$filename") ||
1041			die "$P: $filename: open failed - $!\n";
1042	}
1043	if ($filename eq '-') {
1044		$vname = 'Your patch';
1045	} elsif ($git) {
1046		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
1047	} else {
1048		$vname = $filename;
1049	}
1050	while (<$FILE>) {
1051		chomp;
1052		push(@rawlines, $_);
1053	}
1054	close($FILE);
1055
1056	if ($#ARGV > 0 && $quiet == 0) {
1057		print '-' x length($vname) . "\n";
1058		print "$vname\n";
1059		print '-' x length($vname) . "\n";
1060	}
1061
1062	if (!process($filename)) {
1063		$exit = 1;
1064	}
1065	@rawlines = ();
1066	@lines = ();
1067	@fixed = ();
1068	@fixed_inserted = ();
1069	@fixed_deleted = ();
1070	$fixlinenr = -1;
1071	@modifierListFile = ();
1072	@typeListFile = ();
1073	build_types();
1074}
1075
1076if (!$quiet) {
1077	hash_show_words(\%use_type, "Used");
1078	hash_show_words(\%ignore_type, "Ignored");
1079
1080	if (!$perl_version_ok) {
1081		print << "EOM"
1082
1083NOTE: perl $^V is not modern enough to detect all possible issues.
1084      An upgrade to at least perl $minimum_perl_version is suggested.
1085EOM
1086	}
1087	if ($exit) {
1088		print << "EOM"
1089
1090NOTE: If any of the errors are false positives, please report
1091      them to the maintainer, see CHECKPATCH in MAINTAINERS.
1092EOM
1093	}
1094}
1095
1096exit($exit);
1097
1098sub top_of_kernel_tree {
1099	my ($root) = @_;
1100
1101	my @tree_check = (
1102		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
1103		"README", "Documentation", "arch", "include", "drivers",
1104		"fs", "init", "ipc", "kernel", "lib", "scripts",
1105	);
1106
1107	foreach my $check (@tree_check) {
1108		if (! -e $root . '/' . $check) {
1109			return 0;
1110		}
1111	}
1112	return 1;
1113}
1114
1115sub parse_email {
1116	my ($formatted_email) = @_;
1117
1118	my $name = "";
1119	my $address = "";
1120	my $comment = "";
1121
1122	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
1123		$name = $1;
1124		$address = $2;
1125		$comment = $3 if defined $3;
1126	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
1127		$address = $1;
1128		$comment = $2 if defined $2;
1129	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
1130		$address = $1;
1131		$comment = $2 if defined $2;
1132		$formatted_email =~ s/\Q$address\E.*$//;
1133		$name = $formatted_email;
1134		$name = trim($name);
1135		$name =~ s/^\"|\"$//g;
1136		# If there's a name left after stripping spaces and
1137		# leading quotes, and the address doesn't have both
1138		# leading and trailing angle brackets, the address
1139		# is invalid. ie:
1140		#   "joe smith joe@smith.com" bad
1141		#   "joe smith <joe@smith.com" bad
1142		if ($name ne "" && $address !~ /^<[^>]+>$/) {
1143			$name = "";
1144			$address = "";
1145			$comment = "";
1146		}
1147	}
1148
1149	$name = trim($name);
1150	$name =~ s/^\"|\"$//g;
1151	$address = trim($address);
1152	$address =~ s/^\<|\>$//g;
1153
1154	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1155		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1156		$name = "\"$name\"";
1157	}
1158
1159	return ($name, $address, $comment);
1160}
1161
1162sub format_email {
1163	my ($name, $address) = @_;
1164
1165	my $formatted_email;
1166
1167	$name = trim($name);
1168	$name =~ s/^\"|\"$//g;
1169	$address = trim($address);
1170
1171	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1172		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1173		$name = "\"$name\"";
1174	}
1175
1176	if ("$name" eq "") {
1177		$formatted_email = "$address";
1178	} else {
1179		$formatted_email = "$name <$address>";
1180	}
1181
1182	return $formatted_email;
1183}
1184
1185sub which {
1186	my ($bin) = @_;
1187
1188	foreach my $path (split(/:/, $ENV{PATH})) {
1189		if (-e "$path/$bin") {
1190			return "$path/$bin";
1191		}
1192	}
1193
1194	return "";
1195}
1196
1197sub which_conf {
1198	my ($conf) = @_;
1199
1200	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1201		if (-e "$path/$conf") {
1202			return "$path/$conf";
1203		}
1204	}
1205
1206	return "";
1207}
1208
1209sub expand_tabs {
1210	my ($str) = @_;
1211
1212	my $res = '';
1213	my $n = 0;
1214	for my $c (split(//, $str)) {
1215		if ($c eq "\t") {
1216			$res .= ' ';
1217			$n++;
1218			for (; ($n % 8) != 0; $n++) {
1219				$res .= ' ';
1220			}
1221			next;
1222		}
1223		$res .= $c;
1224		$n++;
1225	}
1226
1227	return $res;
1228}
1229sub copy_spacing {
1230	(my $res = shift) =~ tr/\t/ /c;
1231	return $res;
1232}
1233
1234sub line_stats {
1235	my ($line) = @_;
1236
1237	# Drop the diff line leader and expand tabs
1238	$line =~ s/^.//;
1239	$line = expand_tabs($line);
1240
1241	# Pick the indent from the front of the line.
1242	my ($white) = ($line =~ /^(\s*)/);
1243
1244	return (length($line), length($white));
1245}
1246
1247my $sanitise_quote = '';
1248
1249sub sanitise_line_reset {
1250	my ($in_comment) = @_;
1251
1252	if ($in_comment) {
1253		$sanitise_quote = '*/';
1254	} else {
1255		$sanitise_quote = '';
1256	}
1257}
1258sub sanitise_line {
1259	my ($line) = @_;
1260
1261	my $res = '';
1262	my $l = '';
1263
1264	my $qlen = 0;
1265	my $off = 0;
1266	my $c;
1267
1268	# Always copy over the diff marker.
1269	$res = substr($line, 0, 1);
1270
1271	for ($off = 1; $off < length($line); $off++) {
1272		$c = substr($line, $off, 1);
1273
1274		# Comments we are whacking completely including the begin
1275		# and end, all to $;.
1276		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1277			$sanitise_quote = '*/';
1278
1279			substr($res, $off, 2, "$;$;");
1280			$off++;
1281			next;
1282		}
1283		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
1284			$sanitise_quote = '';
1285			substr($res, $off, 2, "$;$;");
1286			$off++;
1287			next;
1288		}
1289		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1290			$sanitise_quote = '//';
1291
1292			substr($res, $off, 2, $sanitise_quote);
1293			$off++;
1294			next;
1295		}
1296
1297		# A \ in a string means ignore the next character.
1298		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1299		    $c eq "\\") {
1300			substr($res, $off, 2, 'XX');
1301			$off++;
1302			next;
1303		}
1304		# Regular quotes.
1305		if ($c eq "'" || $c eq '"') {
1306			if ($sanitise_quote eq '') {
1307				$sanitise_quote = $c;
1308
1309				substr($res, $off, 1, $c);
1310				next;
1311			} elsif ($sanitise_quote eq $c) {
1312				$sanitise_quote = '';
1313			}
1314		}
1315
1316		#print "c<$c> SQ<$sanitise_quote>\n";
1317		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1318			substr($res, $off, 1, $;);
1319		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1320			substr($res, $off, 1, $;);
1321		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1322			substr($res, $off, 1, 'X');
1323		} else {
1324			substr($res, $off, 1, $c);
1325		}
1326	}
1327
1328	if ($sanitise_quote eq '//') {
1329		$sanitise_quote = '';
1330	}
1331
1332	# The pathname on a #include may be surrounded by '<' and '>'.
1333	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
1334		my $clean = 'X' x length($1);
1335		$res =~ s@\<.*\>@<$clean>@;
1336
1337	# The whole of a #error is a string.
1338	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
1339		my $clean = 'X' x length($1);
1340		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
1341	}
1342
1343	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
1344		my $match = $1;
1345		$res =~ s/\Q$match\E/"$;" x length($match)/e;
1346	}
1347
1348	return $res;
1349}
1350
1351sub get_quoted_string {
1352	my ($line, $rawline) = @_;
1353
1354	return "" if (!defined($line) || !defined($rawline));
1355	return "" if ($line !~ m/($String)/g);
1356	return substr($rawline, $-[0], $+[0] - $-[0]);
1357}
1358
1359sub ctx_statement_block {
1360	my ($linenr, $remain, $off) = @_;
1361	my $line = $linenr - 1;
1362	my $blk = '';
1363	my $soff = $off;
1364	my $coff = $off - 1;
1365	my $coff_set = 0;
1366
1367	my $loff = 0;
1368
1369	my $type = '';
1370	my $level = 0;
1371	my @stack = ();
1372	my $p;
1373	my $c;
1374	my $len = 0;
1375
1376	my $remainder;
1377	while (1) {
1378		@stack = (['', 0]) if ($#stack == -1);
1379
1380		#warn "CSB: blk<$blk> remain<$remain>\n";
1381		# If we are about to drop off the end, pull in more
1382		# context.
1383		if ($off >= $len) {
1384			for (; $remain > 0; $line++) {
1385				last if (!defined $lines[$line]);
1386				next if ($lines[$line] =~ /^-/);
1387				$remain--;
1388				$loff = $len;
1389				$blk .= $lines[$line] . "\n";
1390				$len = length($blk);
1391				$line++;
1392				last;
1393			}
1394			# Bail if there is no further context.
1395			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
1396			if ($off >= $len) {
1397				last;
1398			}
1399			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1400				$level++;
1401				$type = '#';
1402			}
1403		}
1404		$p = $c;
1405		$c = substr($blk, $off, 1);
1406		$remainder = substr($blk, $off);
1407
1408		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
1409
1410		# Handle nested #if/#else.
1411		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1412			push(@stack, [ $type, $level ]);
1413		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1414			($type, $level) = @{$stack[$#stack - 1]};
1415		} elsif ($remainder =~ /^#\s*endif\b/) {
1416			($type, $level) = @{pop(@stack)};
1417		}
1418
1419		# Statement ends at the ';' or a close '}' at the
1420		# outermost level.
1421		if ($level == 0 && $c eq ';') {
1422			last;
1423		}
1424
1425		# An else is really a conditional as long as its not else if
1426		if ($level == 0 && $coff_set == 0 &&
1427				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1428				$remainder =~ /^(else)(?:\s|{)/ &&
1429				$remainder !~ /^else\s+if\b/) {
1430			$coff = $off + length($1) - 1;
1431			$coff_set = 1;
1432			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1433			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
1434		}
1435
1436		if (($type eq '' || $type eq '(') && $c eq '(') {
1437			$level++;
1438			$type = '(';
1439		}
1440		if ($type eq '(' && $c eq ')') {
1441			$level--;
1442			$type = ($level != 0)? '(' : '';
1443
1444			if ($level == 0 && $coff < $soff) {
1445				$coff = $off;
1446				$coff_set = 1;
1447				#warn "CSB: mark coff<$coff>\n";
1448			}
1449		}
1450		if (($type eq '' || $type eq '{') && $c eq '{') {
1451			$level++;
1452			$type = '{';
1453		}
1454		if ($type eq '{' && $c eq '}') {
1455			$level--;
1456			$type = ($level != 0)? '{' : '';
1457
1458			if ($level == 0) {
1459				if (substr($blk, $off + 1, 1) eq ';') {
1460					$off++;
1461				}
1462				last;
1463			}
1464		}
1465		# Preprocessor commands end at the newline unless escaped.
1466		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1467			$level--;
1468			$type = '';
1469			$off++;
1470			last;
1471		}
1472		$off++;
1473	}
1474	# We are truly at the end, so shuffle to the next line.
1475	if ($off == $len) {
1476		$loff = $len + 1;
1477		$line++;
1478		$remain--;
1479	}
1480
1481	my $statement = substr($blk, $soff, $off - $soff + 1);
1482	my $condition = substr($blk, $soff, $coff - $soff + 1);
1483
1484	#warn "STATEMENT<$statement>\n";
1485	#warn "CONDITION<$condition>\n";
1486
1487	#print "coff<$coff> soff<$off> loff<$loff>\n";
1488
1489	return ($statement, $condition,
1490			$line, $remain + 1, $off - $loff + 1, $level);
1491}
1492
1493sub statement_lines {
1494	my ($stmt) = @_;
1495
1496	# Strip the diff line prefixes and rip blank lines at start and end.
1497	$stmt =~ s/(^|\n)./$1/g;
1498	$stmt =~ s/^\s*//;
1499	$stmt =~ s/\s*$//;
1500
1501	my @stmt_lines = ($stmt =~ /\n/g);
1502
1503	return $#stmt_lines + 2;
1504}
1505
1506sub statement_rawlines {
1507	my ($stmt) = @_;
1508
1509	my @stmt_lines = ($stmt =~ /\n/g);
1510
1511	return $#stmt_lines + 2;
1512}
1513
1514sub statement_block_size {
1515	my ($stmt) = @_;
1516
1517	$stmt =~ s/(^|\n)./$1/g;
1518	$stmt =~ s/^\s*{//;
1519	$stmt =~ s/}\s*$//;
1520	$stmt =~ s/^\s*//;
1521	$stmt =~ s/\s*$//;
1522
1523	my @stmt_lines = ($stmt =~ /\n/g);
1524	my @stmt_statements = ($stmt =~ /;/g);
1525
1526	my $stmt_lines = $#stmt_lines + 2;
1527	my $stmt_statements = $#stmt_statements + 1;
1528
1529	if ($stmt_lines > $stmt_statements) {
1530		return $stmt_lines;
1531	} else {
1532		return $stmt_statements;
1533	}
1534}
1535
1536sub ctx_statement_full {
1537	my ($linenr, $remain, $off) = @_;
1538	my ($statement, $condition, $level);
1539
1540	my (@chunks);
1541
1542	# Grab the first conditional/block pair.
1543	($statement, $condition, $linenr, $remain, $off, $level) =
1544				ctx_statement_block($linenr, $remain, $off);
1545	#print "F: c<$condition> s<$statement> remain<$remain>\n";
1546	push(@chunks, [ $condition, $statement ]);
1547	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1548		return ($level, $linenr, @chunks);
1549	}
1550
1551	# Pull in the following conditional/block pairs and see if they
1552	# could continue the statement.
1553	for (;;) {
1554		($statement, $condition, $linenr, $remain, $off, $level) =
1555				ctx_statement_block($linenr, $remain, $off);
1556		#print "C: c<$condition> s<$statement> remain<$remain>\n";
1557		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1558		#print "C: push\n";
1559		push(@chunks, [ $condition, $statement ]);
1560	}
1561
1562	return ($level, $linenr, @chunks);
1563}
1564
1565sub ctx_block_get {
1566	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1567	my $line;
1568	my $start = $linenr - 1;
1569	my $blk = '';
1570	my @o;
1571	my @c;
1572	my @res = ();
1573
1574	my $level = 0;
1575	my @stack = ($level);
1576	for ($line = $start; $remain > 0; $line++) {
1577		next if ($rawlines[$line] =~ /^-/);
1578		$remain--;
1579
1580		$blk .= $rawlines[$line];
1581
1582		# Handle nested #if/#else.
1583		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1584			push(@stack, $level);
1585		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1586			$level = $stack[$#stack - 1];
1587		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1588			$level = pop(@stack);
1589		}
1590
1591		foreach my $c (split(//, $lines[$line])) {
1592			##print "C<$c>L<$level><$open$close>O<$off>\n";
1593			if ($off > 0) {
1594				$off--;
1595				next;
1596			}
1597
1598			if ($c eq $close && $level > 0) {
1599				$level--;
1600				last if ($level == 0);
1601			} elsif ($c eq $open) {
1602				$level++;
1603			}
1604		}
1605
1606		if (!$outer || $level <= 1) {
1607			push(@res, $rawlines[$line]);
1608		}
1609
1610		last if ($level == 0);
1611	}
1612
1613	return ($level, @res);
1614}
1615sub ctx_block_outer {
1616	my ($linenr, $remain) = @_;
1617
1618	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1619	return @r;
1620}
1621sub ctx_block {
1622	my ($linenr, $remain) = @_;
1623
1624	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1625	return @r;
1626}
1627sub ctx_statement {
1628	my ($linenr, $remain, $off) = @_;
1629
1630	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1631	return @r;
1632}
1633sub ctx_block_level {
1634	my ($linenr, $remain) = @_;
1635
1636	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1637}
1638sub ctx_statement_level {
1639	my ($linenr, $remain, $off) = @_;
1640
1641	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1642}
1643
1644sub ctx_locate_comment {
1645	my ($first_line, $end_line) = @_;
1646
1647	# Catch a comment on the end of the line itself.
1648	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1649	return $current_comment if (defined $current_comment);
1650
1651	# Look through the context and try and figure out if there is a
1652	# comment.
1653	my $in_comment = 0;
1654	$current_comment = '';
1655	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1656		my $line = $rawlines[$linenr - 1];
1657		#warn "           $line\n";
1658		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1659			$in_comment = 1;
1660		}
1661		if ($line =~ m@/\*@) {
1662			$in_comment = 1;
1663		}
1664		if (!$in_comment && $current_comment ne '') {
1665			$current_comment = '';
1666		}
1667		$current_comment .= $line . "\n" if ($in_comment);
1668		if ($line =~ m@\*/@) {
1669			$in_comment = 0;
1670		}
1671	}
1672
1673	chomp($current_comment);
1674	return($current_comment);
1675}
1676sub ctx_has_comment {
1677	my ($first_line, $end_line) = @_;
1678	my $cmt = ctx_locate_comment($first_line, $end_line);
1679
1680	##print "LINE: $rawlines[$end_line - 1 ]\n";
1681	##print "CMMT: $cmt\n";
1682
1683	return ($cmt ne '');
1684}
1685
1686sub raw_line {
1687	my ($linenr, $cnt) = @_;
1688
1689	my $offset = $linenr - 1;
1690	$cnt++;
1691
1692	my $line;
1693	while ($cnt) {
1694		$line = $rawlines[$offset++];
1695		next if (defined($line) && $line =~ /^-/);
1696		$cnt--;
1697	}
1698
1699	return $line;
1700}
1701
1702sub get_stat_real {
1703	my ($linenr, $lc) = @_;
1704
1705	my $stat_real = raw_line($linenr, 0);
1706	for (my $count = $linenr + 1; $count <= $lc; $count++) {
1707		$stat_real = $stat_real . "\n" . raw_line($count, 0);
1708	}
1709
1710	return $stat_real;
1711}
1712
1713sub get_stat_here {
1714	my ($linenr, $cnt, $here) = @_;
1715
1716	my $herectx = $here . "\n";
1717	for (my $n = 0; $n < $cnt; $n++) {
1718		$herectx .= raw_line($linenr, $n) . "\n";
1719	}
1720
1721	return $herectx;
1722}
1723
1724sub cat_vet {
1725	my ($vet) = @_;
1726	my ($res, $coded);
1727
1728	$res = '';
1729	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1730		$res .= $1;
1731		if ($2 ne '') {
1732			$coded = sprintf("^%c", unpack('C', $2) + 64);
1733			$res .= $coded;
1734		}
1735	}
1736	$res =~ s/$/\$/;
1737
1738	return $res;
1739}
1740
1741my $av_preprocessor = 0;
1742my $av_pending;
1743my @av_paren_type;
1744my $av_pend_colon;
1745
1746sub annotate_reset {
1747	$av_preprocessor = 0;
1748	$av_pending = '_';
1749	@av_paren_type = ('E');
1750	$av_pend_colon = 'O';
1751}
1752
1753sub annotate_values {
1754	my ($stream, $type) = @_;
1755
1756	my $res;
1757	my $var = '_' x length($stream);
1758	my $cur = $stream;
1759
1760	print "$stream\n" if ($dbg_values > 1);
1761
1762	while (length($cur)) {
1763		@av_paren_type = ('E') if ($#av_paren_type < 0);
1764		print " <" . join('', @av_paren_type) .
1765				"> <$type> <$av_pending>" if ($dbg_values > 1);
1766		if ($cur =~ /^(\s+)/o) {
1767			print "WS($1)\n" if ($dbg_values > 1);
1768			if ($1 =~ /\n/ && $av_preprocessor) {
1769				$type = pop(@av_paren_type);
1770				$av_preprocessor = 0;
1771			}
1772
1773		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1774			print "CAST($1)\n" if ($dbg_values > 1);
1775			push(@av_paren_type, $type);
1776			$type = 'c';
1777
1778		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1779			print "DECLARE($1)\n" if ($dbg_values > 1);
1780			$type = 'T';
1781
1782		} elsif ($cur =~ /^($Modifier)\s*/) {
1783			print "MODIFIER($1)\n" if ($dbg_values > 1);
1784			$type = 'T';
1785
1786		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1787			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1788			$av_preprocessor = 1;
1789			push(@av_paren_type, $type);
1790			if ($2 ne '') {
1791				$av_pending = 'N';
1792			}
1793			$type = 'E';
1794
1795		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1796			print "UNDEF($1)\n" if ($dbg_values > 1);
1797			$av_preprocessor = 1;
1798			push(@av_paren_type, $type);
1799
1800		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1801			print "PRE_START($1)\n" if ($dbg_values > 1);
1802			$av_preprocessor = 1;
1803
1804			push(@av_paren_type, $type);
1805			push(@av_paren_type, $type);
1806			$type = 'E';
1807
1808		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1809			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1810			$av_preprocessor = 1;
1811
1812			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1813
1814			$type = 'E';
1815
1816		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1817			print "PRE_END($1)\n" if ($dbg_values > 1);
1818
1819			$av_preprocessor = 1;
1820
1821			# Assume all arms of the conditional end as this
1822			# one does, and continue as if the #endif was not here.
1823			pop(@av_paren_type);
1824			push(@av_paren_type, $type);
1825			$type = 'E';
1826
1827		} elsif ($cur =~ /^(\\\n)/o) {
1828			print "PRECONT($1)\n" if ($dbg_values > 1);
1829
1830		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1831			print "ATTR($1)\n" if ($dbg_values > 1);
1832			$av_pending = $type;
1833			$type = 'N';
1834
1835		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1836			print "SIZEOF($1)\n" if ($dbg_values > 1);
1837			if (defined $2) {
1838				$av_pending = 'V';
1839			}
1840			$type = 'N';
1841
1842		} elsif ($cur =~ /^(if|while|for)\b/o) {
1843			print "COND($1)\n" if ($dbg_values > 1);
1844			$av_pending = 'E';
1845			$type = 'N';
1846
1847		} elsif ($cur =~/^(case)/o) {
1848			print "CASE($1)\n" if ($dbg_values > 1);
1849			$av_pend_colon = 'C';
1850			$type = 'N';
1851
1852		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1853			print "KEYWORD($1)\n" if ($dbg_values > 1);
1854			$type = 'N';
1855
1856		} elsif ($cur =~ /^(\()/o) {
1857			print "PAREN('$1')\n" if ($dbg_values > 1);
1858			push(@av_paren_type, $av_pending);
1859			$av_pending = '_';
1860			$type = 'N';
1861
1862		} elsif ($cur =~ /^(\))/o) {
1863			my $new_type = pop(@av_paren_type);
1864			if ($new_type ne '_') {
1865				$type = $new_type;
1866				print "PAREN('$1') -> $type\n"
1867							if ($dbg_values > 1);
1868			} else {
1869				print "PAREN('$1')\n" if ($dbg_values > 1);
1870			}
1871
1872		} elsif ($cur =~ /^($Ident)\s*\(/o) {
1873			print "FUNC($1)\n" if ($dbg_values > 1);
1874			$type = 'V';
1875			$av_pending = 'V';
1876
1877		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1878			if (defined $2 && $type eq 'C' || $type eq 'T') {
1879				$av_pend_colon = 'B';
1880			} elsif ($type eq 'E') {
1881				$av_pend_colon = 'L';
1882			}
1883			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1884			$type = 'V';
1885
1886		} elsif ($cur =~ /^($Ident|$Constant)/o) {
1887			print "IDENT($1)\n" if ($dbg_values > 1);
1888			$type = 'V';
1889
1890		} elsif ($cur =~ /^($Assignment)/o) {
1891			print "ASSIGN($1)\n" if ($dbg_values > 1);
1892			$type = 'N';
1893
1894		} elsif ($cur =~/^(;|{|})/) {
1895			print "END($1)\n" if ($dbg_values > 1);
1896			$type = 'E';
1897			$av_pend_colon = 'O';
1898
1899		} elsif ($cur =~/^(,)/) {
1900			print "COMMA($1)\n" if ($dbg_values > 1);
1901			$type = 'C';
1902
1903		} elsif ($cur =~ /^(\?)/o) {
1904			print "QUESTION($1)\n" if ($dbg_values > 1);
1905			$type = 'N';
1906
1907		} elsif ($cur =~ /^(:)/o) {
1908			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1909
1910			substr($var, length($res), 1, $av_pend_colon);
1911			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1912				$type = 'E';
1913			} else {
1914				$type = 'N';
1915			}
1916			$av_pend_colon = 'O';
1917
1918		} elsif ($cur =~ /^(\[)/o) {
1919			print "CLOSE($1)\n" if ($dbg_values > 1);
1920			$type = 'N';
1921
1922		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1923			my $variant;
1924
1925			print "OPV($1)\n" if ($dbg_values > 1);
1926			if ($type eq 'V') {
1927				$variant = 'B';
1928			} else {
1929				$variant = 'U';
1930			}
1931
1932			substr($var, length($res), 1, $variant);
1933			$type = 'N';
1934
1935		} elsif ($cur =~ /^($Operators)/o) {
1936			print "OP($1)\n" if ($dbg_values > 1);
1937			if ($1 ne '++' && $1 ne '--') {
1938				$type = 'N';
1939			}
1940
1941		} elsif ($cur =~ /(^.)/o) {
1942			print "C($1)\n" if ($dbg_values > 1);
1943		}
1944		if (defined $1) {
1945			$cur = substr($cur, length($1));
1946			$res .= $type x length($1);
1947		}
1948	}
1949
1950	return ($res, $var);
1951}
1952
1953sub possible {
1954	my ($possible, $line) = @_;
1955	my $notPermitted = qr{(?:
1956		^(?:
1957			$Modifier|
1958			$Storage|
1959			$Type|
1960			DEFINE_\S+
1961		)$|
1962		^(?:
1963			goto|
1964			return|
1965			case|
1966			else|
1967			asm|__asm__|
1968			do|
1969			\#|
1970			\#\#|
1971		)(?:\s|$)|
1972		^(?:typedef|struct|enum)\b
1973	    )}x;
1974	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1975	if ($possible !~ $notPermitted) {
1976		# Check for modifiers.
1977		$possible =~ s/\s*$Storage\s*//g;
1978		$possible =~ s/\s*$Sparse\s*//g;
1979		if ($possible =~ /^\s*$/) {
1980
1981		} elsif ($possible =~ /\s/) {
1982			$possible =~ s/\s*$Type\s*//g;
1983			for my $modifier (split(' ', $possible)) {
1984				if ($modifier !~ $notPermitted) {
1985					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1986					push(@modifierListFile, $modifier);
1987				}
1988			}
1989
1990		} else {
1991			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1992			push(@typeListFile, $possible);
1993		}
1994		build_types();
1995	} else {
1996		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1997	}
1998}
1999
2000my $prefix = '';
2001
2002sub show_type {
2003	my ($type) = @_;
2004
2005	$type =~ tr/[a-z]/[A-Z]/;
2006
2007	return defined $use_type{$type} if (scalar keys %use_type > 0);
2008
2009	return !defined $ignore_type{$type};
2010}
2011
2012sub report {
2013	my ($level, $type, $msg) = @_;
2014
2015	if (!show_type($type) ||
2016	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
2017		return 0;
2018	}
2019	my $output = '';
2020	if ($color) {
2021		if ($level eq 'ERROR') {
2022			$output .= RED;
2023		} elsif ($level eq 'WARNING') {
2024			$output .= YELLOW;
2025		} else {
2026			$output .= GREEN;
2027		}
2028	}
2029	$output .= $prefix . $level . ':';
2030	if ($show_types) {
2031		$output .= BLUE if ($color);
2032		$output .= "$type:";
2033	}
2034	$output .= RESET if ($color);
2035	$output .= ' ' . $msg . "\n";
2036
2037	if ($showfile) {
2038		my @lines = split("\n", $output, -1);
2039		splice(@lines, 1, 1);
2040		$output = join("\n", @lines);
2041	}
2042	$output = (split('\n', $output))[0] . "\n" if ($terse);
2043
2044	push(our @report, $output);
2045
2046	return 1;
2047}
2048
2049sub report_dump {
2050	our @report;
2051}
2052
2053sub fixup_current_range {
2054	my ($lineRef, $offset, $length) = @_;
2055
2056	if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
2057		my $o = $1;
2058		my $l = $2;
2059		my $no = $o + $offset;
2060		my $nl = $l + $length;
2061		$$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
2062	}
2063}
2064
2065sub fix_inserted_deleted_lines {
2066	my ($linesRef, $insertedRef, $deletedRef) = @_;
2067
2068	my $range_last_linenr = 0;
2069	my $delta_offset = 0;
2070
2071	my $old_linenr = 0;
2072	my $new_linenr = 0;
2073
2074	my $next_insert = 0;
2075	my $next_delete = 0;
2076
2077	my @lines = ();
2078
2079	my $inserted = @{$insertedRef}[$next_insert++];
2080	my $deleted = @{$deletedRef}[$next_delete++];
2081
2082	foreach my $old_line (@{$linesRef}) {
2083		my $save_line = 1;
2084		my $line = $old_line;	#don't modify the array
2085		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
2086			$delta_offset = 0;
2087		} elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {	#new hunk
2088			$range_last_linenr = $new_linenr;
2089			fixup_current_range(\$line, $delta_offset, 0);
2090		}
2091
2092		while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
2093			$deleted = @{$deletedRef}[$next_delete++];
2094			$save_line = 0;
2095			fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
2096		}
2097
2098		while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
2099			push(@lines, ${$inserted}{'LINE'});
2100			$inserted = @{$insertedRef}[$next_insert++];
2101			$new_linenr++;
2102			fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
2103		}
2104
2105		if ($save_line) {
2106			push(@lines, $line);
2107			$new_linenr++;
2108		}
2109
2110		$old_linenr++;
2111	}
2112
2113	return @lines;
2114}
2115
2116sub fix_insert_line {
2117	my ($linenr, $line) = @_;
2118
2119	my $inserted = {
2120		LINENR => $linenr,
2121		LINE => $line,
2122	};
2123	push(@fixed_inserted, $inserted);
2124}
2125
2126sub fix_delete_line {
2127	my ($linenr, $line) = @_;
2128
2129	my $deleted = {
2130		LINENR => $linenr,
2131		LINE => $line,
2132	};
2133
2134	push(@fixed_deleted, $deleted);
2135}
2136
2137sub ERROR {
2138	my ($type, $msg) = @_;
2139
2140	if (report("ERROR", $type, $msg)) {
2141		our $clean = 0;
2142		our $cnt_error++;
2143		return 1;
2144	}
2145	return 0;
2146}
2147sub WARN {
2148	my ($type, $msg) = @_;
2149
2150	if (report("WARNING", $type, $msg)) {
2151		our $clean = 0;
2152		our $cnt_warn++;
2153		return 1;
2154	}
2155	return 0;
2156}
2157sub CHK {
2158	my ($type, $msg) = @_;
2159
2160	if ($check && report("CHECK", $type, $msg)) {
2161		our $clean = 0;
2162		our $cnt_chk++;
2163		return 1;
2164	}
2165	return 0;
2166}
2167
2168sub check_absolute_file {
2169	my ($absolute, $herecurr) = @_;
2170	my $file = $absolute;
2171
2172	##print "absolute<$absolute>\n";
2173
2174	# See if any suffix of this path is a path within the tree.
2175	while ($file =~ s@^[^/]*/@@) {
2176		if (-f "$root/$file") {
2177			##print "file<$file>\n";
2178			last;
2179		}
2180	}
2181	if (! -f _)  {
2182		return 0;
2183	}
2184
2185	# It is, so see if the prefix is acceptable.
2186	my $prefix = $absolute;
2187	substr($prefix, -length($file)) = '';
2188
2189	##print "prefix<$prefix>\n";
2190	if ($prefix ne ".../") {
2191		WARN("USE_RELATIVE_PATH",
2192		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
2193	}
2194}
2195
2196sub trim {
2197	my ($string) = @_;
2198
2199	$string =~ s/^\s+|\s+$//g;
2200
2201	return $string;
2202}
2203
2204sub ltrim {
2205	my ($string) = @_;
2206
2207	$string =~ s/^\s+//;
2208
2209	return $string;
2210}
2211
2212sub rtrim {
2213	my ($string) = @_;
2214
2215	$string =~ s/\s+$//;
2216
2217	return $string;
2218}
2219
2220sub string_find_replace {
2221	my ($string, $find, $replace) = @_;
2222
2223	$string =~ s/$find/$replace/g;
2224
2225	return $string;
2226}
2227
2228sub tabify {
2229	my ($leading) = @_;
2230
2231	my $source_indent = 8;
2232	my $max_spaces_before_tab = $source_indent - 1;
2233	my $spaces_to_tab = " " x $source_indent;
2234
2235	#convert leading spaces to tabs
2236	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
2237	#Remove spaces before a tab
2238	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
2239
2240	return "$leading";
2241}
2242
2243sub pos_last_openparen {
2244	my ($line) = @_;
2245
2246	my $pos = 0;
2247
2248	my $opens = $line =~ tr/\(/\(/;
2249	my $closes = $line =~ tr/\)/\)/;
2250
2251	my $last_openparen = 0;
2252
2253	if (($opens == 0) || ($closes >= $opens)) {
2254		return -1;
2255	}
2256
2257	my $len = length($line);
2258
2259	for ($pos = 0; $pos < $len; $pos++) {
2260		my $string = substr($line, $pos);
2261		if ($string =~ /^($FuncArg|$balanced_parens)/) {
2262			$pos += length($1) - 1;
2263		} elsif (substr($line, $pos, 1) eq '(') {
2264			$last_openparen = $pos;
2265		} elsif (index($string, '(') == -1) {
2266			last;
2267		}
2268	}
2269
2270	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
2271}
2272
2273sub process {
2274	my $filename = shift;
2275
2276	my $linenr=0;
2277	my $prevline="";
2278	my $prevrawline="";
2279	my $stashline="";
2280	my $stashrawline="";
2281
2282	my $length;
2283	my $indent;
2284	my $previndent=0;
2285	my $stashindent=0;
2286
2287	our $clean = 1;
2288	my $signoff = 0;
2289	my $author = '';
2290	my $authorsignoff = 0;
2291	my $is_patch = 0;
2292	my $is_binding_patch = -1;
2293	my $in_header_lines = $file ? 0 : 1;
2294	my $in_commit_log = 0;		#Scanning lines before patch
2295	my $has_commit_log = 0;		#Encountered lines before patch
2296	my $commit_log_lines = 0;	#Number of commit log lines
2297	my $commit_log_possible_stack_dump = 0;
2298	my $commit_log_long_line = 0;
2299	my $commit_log_has_diff = 0;
2300	my $reported_maintainer_file = 0;
2301	my $non_utf8_charset = 0;
2302
2303	my $last_blank_line = 0;
2304	my $last_coalesced_string_linenr = -1;
2305
2306	our @report = ();
2307	our $cnt_lines = 0;
2308	our $cnt_error = 0;
2309	our $cnt_warn = 0;
2310	our $cnt_chk = 0;
2311
2312	# Trace the real file/line as we go.
2313	my $realfile = '';
2314	my $realline = 0;
2315	my $realcnt = 0;
2316	my $here = '';
2317	my $context_function;		#undef'd unless there's a known function
2318	my $in_comment = 0;
2319	my $comment_edge = 0;
2320	my $first_line = 0;
2321	my $p1_prefix = '';
2322
2323	my $prev_values = 'E';
2324
2325	# suppression flags
2326	my %suppress_ifbraces;
2327	my %suppress_whiletrailers;
2328	my %suppress_export;
2329	my $suppress_statement = 0;
2330
2331	my %signatures = ();
2332
2333	# Pre-scan the patch sanitizing the lines.
2334	# Pre-scan the patch looking for any __setup documentation.
2335	#
2336	my @setup_docs = ();
2337	my $setup_docs = 0;
2338
2339	my $camelcase_file_seeded = 0;
2340
2341	my $checklicenseline = 1;
2342
2343	sanitise_line_reset();
2344	my $line;
2345	foreach my $rawline (@rawlines) {
2346		$linenr++;
2347		$line = $rawline;
2348
2349		push(@fixed, $rawline) if ($fix);
2350
2351		if ($rawline=~/^\+\+\+\s+(\S+)/) {
2352			$setup_docs = 0;
2353			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
2354				$setup_docs = 1;
2355			}
2356			#next;
2357		}
2358		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2359			$realline=$1-1;
2360			if (defined $2) {
2361				$realcnt=$3+1;
2362			} else {
2363				$realcnt=1+1;
2364			}
2365			$in_comment = 0;
2366
2367			# Guestimate if this is a continuing comment.  Run
2368			# the context looking for a comment "edge".  If this
2369			# edge is a close comment then we must be in a comment
2370			# at context start.
2371			my $edge;
2372			my $cnt = $realcnt;
2373			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2374				next if (defined $rawlines[$ln - 1] &&
2375					 $rawlines[$ln - 1] =~ /^-/);
2376				$cnt--;
2377				#print "RAW<$rawlines[$ln - 1]>\n";
2378				last if (!defined $rawlines[$ln - 1]);
2379				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2380				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2381					($edge) = $1;
2382					last;
2383				}
2384			}
2385			if (defined $edge && $edge eq '*/') {
2386				$in_comment = 1;
2387			}
2388
2389			# Guestimate if this is a continuing comment.  If this
2390			# is the start of a diff block and this line starts
2391			# ' *' then it is very likely a comment.
2392			if (!defined $edge &&
2393			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
2394			{
2395				$in_comment = 1;
2396			}
2397
2398			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2399			sanitise_line_reset($in_comment);
2400
2401		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
2402			# Standardise the strings and chars within the input to
2403			# simplify matching -- only bother with positive lines.
2404			$line = sanitise_line($rawline);
2405		}
2406		push(@lines, $line);
2407
2408		if ($realcnt > 1) {
2409			$realcnt-- if ($line =~ /^(?:\+| |$)/);
2410		} else {
2411			$realcnt = 0;
2412		}
2413
2414		#print "==>$rawline\n";
2415		#print "-->$line\n";
2416
2417		if ($setup_docs && $line =~ /^\+/) {
2418			push(@setup_docs, $line);
2419		}
2420	}
2421
2422	$prefix = '';
2423
2424	$realcnt = 0;
2425	$linenr = 0;
2426	$fixlinenr = -1;
2427	foreach my $line (@lines) {
2428		$linenr++;
2429		$fixlinenr++;
2430		my $sline = $line;	#copy of $line
2431		$sline =~ s/$;/ /g;	#with comments as spaces
2432
2433		my $rawline = $rawlines[$linenr - 1];
2434
2435# check if it's a mode change, rename or start of a patch
2436		if (!$in_commit_log &&
2437		    ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||
2438		    ($line =~ /^rename (?:from|to) \S+\s*$/ ||
2439		     $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {
2440			$is_patch = 1;
2441		}
2442
2443#extract the line range in the file after the patch is applied
2444		if (!$in_commit_log &&
2445		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
2446			my $context = $4;
2447			$is_patch = 1;
2448			$first_line = $linenr + 1;
2449			$realline=$1-1;
2450			if (defined $2) {
2451				$realcnt=$3+1;
2452			} else {
2453				$realcnt=1+1;
2454			}
2455			annotate_reset();
2456			$prev_values = 'E';
2457
2458			%suppress_ifbraces = ();
2459			%suppress_whiletrailers = ();
2460			%suppress_export = ();
2461			$suppress_statement = 0;
2462			if ($context =~ /\b(\w+)\s*\(/) {
2463				$context_function = $1;
2464			} else {
2465				undef $context_function;
2466			}
2467			next;
2468
2469# track the line number as we move through the hunk, note that
2470# new versions of GNU diff omit the leading space on completely
2471# blank context lines so we need to count that too.
2472		} elsif ($line =~ /^( |\+|$)/) {
2473			$realline++;
2474			$realcnt-- if ($realcnt != 0);
2475
2476			# Measure the line length and indent.
2477			($length, $indent) = line_stats($rawline);
2478
2479			# Track the previous line.
2480			($prevline, $stashline) = ($stashline, $line);
2481			($previndent, $stashindent) = ($stashindent, $indent);
2482			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2483
2484			#warn "line<$line>\n";
2485
2486		} elsif ($realcnt == 1) {
2487			$realcnt--;
2488		}
2489
2490		my $hunk_line = ($realcnt != 0);
2491
2492		$here = "#$linenr: " if (!$file);
2493		$here = "#$realline: " if ($file);
2494
2495		my $found_file = 0;
2496		# extract the filename as it passes
2497		if ($line =~ /^diff --git.*?(\S+)$/) {
2498			$realfile = $1;
2499			$realfile =~ s@^([^/]*)/@@ if (!$file);
2500			$in_commit_log = 0;
2501			$found_file = 1;
2502		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
2503			$realfile = $1;
2504			$realfile =~ s@^([^/]*)/@@ if (!$file);
2505			$in_commit_log = 0;
2506
2507			$p1_prefix = $1;
2508			if (!$file && $tree && $p1_prefix ne '' &&
2509			    -e "$root/$p1_prefix") {
2510				WARN("PATCH_PREFIX",
2511				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
2512			}
2513
2514			if ($realfile =~ m@^include/asm/@) {
2515				ERROR("MODIFIED_INCLUDE_ASM",
2516				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
2517			}
2518			$found_file = 1;
2519		}
2520
2521#make up the handle for any error we report on this line
2522		if ($showfile) {
2523			$prefix = "$realfile:$realline: "
2524		} elsif ($emacs) {
2525			if ($file) {
2526				$prefix = "$filename:$realline: ";
2527			} else {
2528				$prefix = "$filename:$linenr: ";
2529			}
2530		}
2531
2532		if ($found_file) {
2533			if (is_maintained_obsolete($realfile)) {
2534				WARN("OBSOLETE",
2535				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");
2536			}
2537			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2538				$check = 1;
2539			} else {
2540				$check = $check_orig;
2541			}
2542			$checklicenseline = 1;
2543
2544			if ($realfile !~ /^MAINTAINERS/) {
2545				my $last_binding_patch = $is_binding_patch;
2546
2547				$is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@;
2548
2549				if (($last_binding_patch != -1) &&
2550				    ($last_binding_patch ^ $is_binding_patch)) {
2551					WARN("DT_SPLIT_BINDING_PATCH",
2552					     "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.txt\n");
2553				}
2554			}
2555
2556			next;
2557		}
2558
2559		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
2560
2561		my $hereline = "$here\n$rawline\n";
2562		my $herecurr = "$here\n$rawline\n";
2563		my $hereprev = "$here\n$prevrawline\n$rawline\n";
2564
2565		$cnt_lines++ if ($realcnt != 0);
2566
2567# Verify the existence of a commit log if appropriate
2568# 2 is used because a $signature is counted in $commit_log_lines
2569		if ($in_commit_log) {
2570			if ($line !~ /^\s*$/) {
2571				$commit_log_lines++;	#could be a $signature
2572			}
2573		} elsif ($has_commit_log && $commit_log_lines < 2) {
2574			WARN("COMMIT_MESSAGE",
2575			     "Missing commit description - Add an appropriate one\n");
2576			$commit_log_lines = 2;	#warn only once
2577		}
2578
2579# Check if the commit log has what seems like a diff which can confuse patch
2580		if ($in_commit_log && !$commit_log_has_diff &&
2581		    (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
2582		      $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
2583		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
2584		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
2585			ERROR("DIFF_IN_COMMIT_MSG",
2586			      "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
2587			$commit_log_has_diff = 1;
2588		}
2589
2590# Check for incorrect file permissions
2591		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2592			my $permhere = $here . "FILE: $realfile\n";
2593			if ($realfile !~ m@scripts/@ &&
2594			    $realfile !~ /\.(py|pl|awk|sh)$/) {
2595				ERROR("EXECUTE_PERMISSIONS",
2596				      "do not set execute permissions for source files\n" . $permhere);
2597			}
2598		}
2599
2600# Check the patch for a From:
2601		if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
2602			$author = $1;
2603			$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
2604			$author =~ s/"//g;
2605		}
2606
2607# Check the patch for a signoff:
2608		if ($line =~ /^\s*signed-off-by:/i) {
2609			$signoff++;
2610			$in_commit_log = 0;
2611			if ($author ne '') {
2612				my $l = $line;
2613				$l =~ s/"//g;
2614				if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) {
2615				    $authorsignoff = 1;
2616				}
2617			}
2618		}
2619
2620# Check if MAINTAINERS is being updated.  If so, there's probably no need to
2621# emit the "does MAINTAINERS need updating?" message on file add/move/delete
2622		if ($line =~ /^\s*MAINTAINERS\s*\|/) {
2623			$reported_maintainer_file = 1;
2624		}
2625
2626# Check signature styles
2627		if (!$in_header_lines &&
2628		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
2629			my $space_before = $1;
2630			my $sign_off = $2;
2631			my $space_after = $3;
2632			my $email = $4;
2633			my $ucfirst_sign_off = ucfirst(lc($sign_off));
2634
2635			if ($sign_off !~ /$signature_tags/) {
2636				WARN("BAD_SIGN_OFF",
2637				     "Non-standard signature: $sign_off\n" . $herecurr);
2638			}
2639			if (defined $space_before && $space_before ne "") {
2640				if (WARN("BAD_SIGN_OFF",
2641					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
2642				    $fix) {
2643					$fixed[$fixlinenr] =
2644					    "$ucfirst_sign_off $email";
2645				}
2646			}
2647			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
2648				if (WARN("BAD_SIGN_OFF",
2649					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
2650				    $fix) {
2651					$fixed[$fixlinenr] =
2652					    "$ucfirst_sign_off $email";
2653				}
2654
2655			}
2656			if (!defined $space_after || $space_after ne " ") {
2657				if (WARN("BAD_SIGN_OFF",
2658					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
2659				    $fix) {
2660					$fixed[$fixlinenr] =
2661					    "$ucfirst_sign_off $email";
2662				}
2663			}
2664
2665			my ($email_name, $email_address, $comment) = parse_email($email);
2666			my $suggested_email = format_email(($email_name, $email_address));
2667			if ($suggested_email eq "") {
2668				ERROR("BAD_SIGN_OFF",
2669				      "Unrecognized email address: '$email'\n" . $herecurr);
2670			} else {
2671				my $dequoted = $suggested_email;
2672				$dequoted =~ s/^"//;
2673				$dequoted =~ s/" </ </;
2674				# Don't force email to have quotes
2675				# Allow just an angle bracketed address
2676				if ("$dequoted$comment" ne $email &&
2677				    "<$email_address>$comment" ne $email &&
2678				    "$suggested_email$comment" ne $email) {
2679					WARN("BAD_SIGN_OFF",
2680					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
2681				}
2682			}
2683
2684# Check for duplicate signatures
2685			my $sig_nospace = $line;
2686			$sig_nospace =~ s/\s//g;
2687			$sig_nospace = lc($sig_nospace);
2688			if (defined $signatures{$sig_nospace}) {
2689				WARN("BAD_SIGN_OFF",
2690				     "Duplicate signature\n" . $herecurr);
2691			} else {
2692				$signatures{$sig_nospace} = 1;
2693			}
2694
2695# Check Co-developed-by: immediately followed by Signed-off-by: with same name and email
2696			if ($sign_off =~ /^co-developed-by:$/i) {
2697				if ($email eq $author) {
2698					WARN("BAD_SIGN_OFF",
2699					      "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline);
2700				}
2701				if (!defined $lines[$linenr]) {
2702					WARN("BAD_SIGN_OFF",
2703                                             "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline);
2704				} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {
2705					WARN("BAD_SIGN_OFF",
2706					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
2707				} elsif ($1 ne $email) {
2708					WARN("BAD_SIGN_OFF",
2709					     "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
2710				}
2711			}
2712		}
2713
2714# Check email subject for common tools that don't need to be mentioned
2715		if ($in_header_lines &&
2716		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
2717			WARN("EMAIL_SUBJECT",
2718			     "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
2719		}
2720
2721# Check for unwanted Gerrit info
2722		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
2723			ERROR("GERRIT_CHANGE_ID",
2724			      "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
2725		}
2726
2727# Check if the commit log is in a possible stack dump
2728		if ($in_commit_log && !$commit_log_possible_stack_dump &&
2729		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
2730		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
2731					# timestamp
2732		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||
2733		     $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
2734		     $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
2735					# stack dump address styles
2736			$commit_log_possible_stack_dump = 1;
2737		}
2738
2739# Check for line lengths > 75 in commit log, warn once
2740		if ($in_commit_log && !$commit_log_long_line &&
2741		    length($line) > 75 &&
2742		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
2743					# file delta changes
2744		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
2745					# filename then :
2746		      $line =~ /^\s*(?:Fixes:|Link:)/i ||
2747					# A Fixes: or Link: line
2748		      $commit_log_possible_stack_dump)) {
2749			WARN("COMMIT_LOG_LONG_LINE",
2750			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
2751			$commit_log_long_line = 1;
2752		}
2753
2754# Reset possible stack dump if a blank line is found
2755		if ($in_commit_log && $commit_log_possible_stack_dump &&
2756		    $line =~ /^\s*$/) {
2757			$commit_log_possible_stack_dump = 0;
2758		}
2759
2760# Check for git id commit length and improperly formed commit descriptions
2761		if ($in_commit_log && !$commit_log_possible_stack_dump &&
2762		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
2763		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
2764		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
2765		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
2766		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
2767		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
2768			my $init_char = "c";
2769			my $orig_commit = "";
2770			my $short = 1;
2771			my $long = 0;
2772			my $case = 1;
2773			my $space = 1;
2774			my $hasdesc = 0;
2775			my $hasparens = 0;
2776			my $id = '0123456789ab';
2777			my $orig_desc = "commit description";
2778			my $description = "";
2779
2780			if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
2781				$init_char = $1;
2782				$orig_commit = lc($2);
2783			} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
2784				$orig_commit = lc($1);
2785			}
2786
2787			$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
2788			$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
2789			$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
2790			$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
2791			if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
2792				$orig_desc = $1;
2793				$hasparens = 1;
2794			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
2795				 defined $rawlines[$linenr] &&
2796				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
2797				$orig_desc = $1;
2798				$hasparens = 1;
2799			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
2800				 defined $rawlines[$linenr] &&
2801				 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
2802				$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
2803				$orig_desc = $1;
2804				$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
2805				$orig_desc .= " " . $1;
2806				$hasparens = 1;
2807			}
2808
2809			($id, $description) = git_commit_info($orig_commit,
2810							      $id, $orig_desc);
2811
2812			if (defined($id) &&
2813			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
2814				ERROR("GIT_COMMIT_ID",
2815				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
2816			}
2817		}
2818
2819# Check for added, moved or deleted files
2820		if (!$reported_maintainer_file && !$in_commit_log &&
2821		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
2822		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
2823		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
2824		      (defined($1) || defined($2))))) {
2825			$is_patch = 1;
2826			$reported_maintainer_file = 1;
2827			WARN("FILE_PATH_CHANGES",
2828			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
2829		}
2830
2831# Check for wrappage within a valid hunk of the file
2832		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
2833			ERROR("CORRUPTED_PATCH",
2834			      "patch seems to be corrupt (line wrapped?)\n" .
2835				$herecurr) if (!$emitted_corrupt++);
2836		}
2837
2838# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2839		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
2840		    $rawline !~ m/^$UTF8*$/) {
2841			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2842
2843			my $blank = copy_spacing($rawline);
2844			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2845			my $hereptr = "$hereline$ptr\n";
2846
2847			CHK("INVALID_UTF8",
2848			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
2849		}
2850
2851# Check if it's the start of a commit log
2852# (not a header line and we haven't seen the patch filename)
2853		if ($in_header_lines && $realfile =~ /^$/ &&
2854		    !($rawline =~ /^\s+(?:\S|$)/ ||
2855		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
2856			$in_header_lines = 0;
2857			$in_commit_log = 1;
2858			$has_commit_log = 1;
2859		}
2860
2861# Check if there is UTF-8 in a commit log when a mail header has explicitly
2862# declined it, i.e defined some charset where it is missing.
2863		if ($in_header_lines &&
2864		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2865		    $1 !~ /utf-8/i) {
2866			$non_utf8_charset = 1;
2867		}
2868
2869		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
2870		    $rawline =~ /$NON_ASCII_UTF8/) {
2871			WARN("UTF8_BEFORE_PATCH",
2872			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2873		}
2874
2875# Check for absolute kernel paths in commit message
2876		if ($tree && $in_commit_log) {
2877			while ($line =~ m{(?:^|\s)(/\S*)}g) {
2878				my $file = $1;
2879
2880				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
2881				    check_absolute_file($1, $herecurr)) {
2882					#
2883				} else {
2884					check_absolute_file($file, $herecurr);
2885				}
2886			}
2887		}
2888
2889# Check for various typo / spelling mistakes
2890		if (defined($misspellings) &&
2891		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
2892			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
2893				my $typo = $1;
2894				my $typo_fix = $spelling_fix{lc($typo)};
2895				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
2896				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
2897				my $msg_level = \&WARN;
2898				$msg_level = \&CHK if ($file);
2899				if (&{$msg_level}("TYPO_SPELLING",
2900						  "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
2901				    $fix) {
2902					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
2903				}
2904			}
2905		}
2906
2907# check for invalid commit id
2908		if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
2909			my $id;
2910			my $description;
2911			($id, $description) = git_commit_info($2, undef, undef);
2912			if (!defined($id)) {
2913				WARN("UNKNOWN_COMMIT_ID",
2914				     "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);
2915			}
2916		}
2917
2918# ignore non-hunk lines and lines being removed
2919		next if (!$hunk_line || $line =~ /^-/);
2920
2921#trailing whitespace
2922		if ($line =~ /^\+.*\015/) {
2923			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2924			if (ERROR("DOS_LINE_ENDINGS",
2925				  "DOS line endings\n" . $herevet) &&
2926			    $fix) {
2927				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
2928			}
2929		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2930			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2931			if (ERROR("TRAILING_WHITESPACE",
2932				  "trailing whitespace\n" . $herevet) &&
2933			    $fix) {
2934				$fixed[$fixlinenr] =~ s/\s+$//;
2935			}
2936
2937			$rpt_cleaners = 1;
2938		}
2939
2940# Check for FSF mailing addresses.
2941		if ($rawline =~ /\bwrite to the Free/i ||
2942		    $rawline =~ /\b675\s+Mass\s+Ave/i ||
2943		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
2944		    $rawline =~ /\b51\s+Franklin\s+St/i) {
2945			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2946			my $msg_level = \&ERROR;
2947			$msg_level = \&CHK if ($file);
2948			&{$msg_level}("FSF_MAILING_ADDRESS",
2949				      "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.\n" . $herevet)
2950		}
2951
2952# check for Kconfig help text having a real description
2953# Only applies when adding the entry originally, after that we do not have
2954# sufficient context to determine whether it is indeed long enough.
2955		if ($realfile =~ /Kconfig/ &&
2956		    # 'choice' is usually the last thing on the line (though
2957		    # Kconfig supports named choices), so use a word boundary
2958		    # (\b) rather than a whitespace character (\s)
2959		    $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
2960			my $length = 0;
2961			my $cnt = $realcnt;
2962			my $ln = $linenr + 1;
2963			my $f;
2964			my $is_start = 0;
2965			my $is_end = 0;
2966			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
2967				$f = $lines[$ln - 1];
2968				$cnt-- if ($lines[$ln - 1] !~ /^-/);
2969				$is_end = $lines[$ln - 1] =~ /^\+/;
2970
2971				next if ($f =~ /^-/);
2972				last if (!$file && $f =~ /^\@\@/);
2973
2974				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
2975					$is_start = 1;
2976				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) {
2977					if ($lines[$ln - 1] =~ "---help---") {
2978						WARN("CONFIG_DESCRIPTION",
2979						     "prefer 'help' over '---help---' for new help texts\n" . $herecurr);
2980					}
2981					$length = -1;
2982				}
2983
2984				$f =~ s/^.//;
2985				$f =~ s/#.*//;
2986				$f =~ s/^\s+//;
2987				next if ($f =~ /^$/);
2988
2989				# This only checks context lines in the patch
2990				# and so hopefully shouldn't trigger false
2991				# positives, even though some of these are
2992				# common words in help texts
2993				if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
2994						  if|endif|menu|endmenu|source)\b/x) {
2995					$is_end = 1;
2996					last;
2997				}
2998				$length++;
2999			}
3000			if ($is_start && $is_end && $length < $min_conf_desc_length) {
3001				WARN("CONFIG_DESCRIPTION",
3002				     "please write a paragraph that describes the config symbol fully\n" . $herecurr);
3003			}
3004			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
3005		}
3006
3007# check for MAINTAINERS entries that don't have the right form
3008		if ($realfile =~ /^MAINTAINERS$/ &&
3009		    $rawline =~ /^\+[A-Z]:/ &&
3010		    $rawline !~ /^\+[A-Z]:\t\S/) {
3011			if (WARN("MAINTAINERS_STYLE",
3012				 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
3013			    $fix) {
3014				$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
3015			}
3016		}
3017
3018# discourage the use of boolean for type definition attributes of Kconfig options
3019		if ($realfile =~ /Kconfig/ &&
3020		    $line =~ /^\+\s*\bboolean\b/) {
3021			WARN("CONFIG_TYPE_BOOLEAN",
3022			     "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
3023		}
3024
3025		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
3026		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
3027			my $flag = $1;
3028			my $replacement = {
3029				'EXTRA_AFLAGS' =>   'asflags-y',
3030				'EXTRA_CFLAGS' =>   'ccflags-y',
3031				'EXTRA_CPPFLAGS' => 'cppflags-y',
3032				'EXTRA_LDFLAGS' =>  'ldflags-y',
3033			};
3034
3035			WARN("DEPRECATED_VARIABLE",
3036			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
3037		}
3038
3039# check for DT compatible documentation
3040		if (defined $root &&
3041			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
3042			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
3043
3044			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
3045
3046			my $dt_path = $root . "/Documentation/devicetree/bindings/";
3047			my $vp_file = $dt_path . "vendor-prefixes.yaml";
3048
3049			foreach my $compat (@compats) {
3050				my $compat2 = $compat;
3051				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
3052				my $compat3 = $compat;
3053				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
3054				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;
3055				if ( $? >> 8 ) {
3056					WARN("UNDOCUMENTED_DT_STRING",
3057					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
3058				}
3059
3060				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
3061				my $vendor = $1;
3062				`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
3063				if ( $? >> 8 ) {
3064					WARN("UNDOCUMENTED_DT_STRING",
3065					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
3066				}
3067			}
3068		}
3069
3070# check for using SPDX license tag at beginning of files
3071		if ($realline == $checklicenseline) {
3072			if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
3073				$checklicenseline = 2;
3074			} elsif ($rawline =~ /^\+/) {
3075				my $comment = "";
3076				if ($realfile =~ /\.(h|s|S)$/) {
3077					$comment = '/*';
3078				} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
3079					$comment = '//';
3080				} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
3081					$comment = '#';
3082				} elsif ($realfile =~ /\.rst$/) {
3083					$comment = '..';
3084				}
3085
3086# check SPDX comment style for .[chsS] files
3087				if ($realfile =~ /\.[chsS]$/ &&
3088				    $rawline =~ /SPDX-License-Identifier:/ &&
3089				    $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
3090					WARN("SPDX_LICENSE_TAG",
3091					     "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);
3092				}
3093
3094				if ($comment !~ /^$/ &&
3095				    $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {
3096					WARN("SPDX_LICENSE_TAG",
3097					     "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
3098				} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
3099					my $spdx_license = $1;
3100					if (!is_SPDX_License_valid($spdx_license)) {
3101						WARN("SPDX_LICENSE_TAG",
3102						     "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
3103					}
3104				}
3105			}
3106		}
3107
3108# check we are in a valid source file if not then ignore this hunk
3109		next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
3110
3111# check for using SPDX-License-Identifier on the wrong line number
3112		if ($realline != $checklicenseline &&
3113		    $rawline =~ /\bSPDX-License-Identifier:/ &&
3114		    substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
3115			WARN("SPDX_LICENSE_TAG",
3116			     "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);
3117		}
3118
3119# line length limit (with some exclusions)
3120#
3121# There are a few types of lines that may extend beyond $max_line_length:
3122#	logging functions like pr_info that end in a string
3123#	lines with a single string
3124#	#defines that are a single string
3125#	lines with an RFC3986 like URL
3126#
3127# There are 3 different line length message types:
3128# LONG_LINE_COMMENT	a comment starts before but extends beyond $max_line_length
3129# LONG_LINE_STRING	a string starts before but extends beyond $max_line_length
3130# LONG_LINE		all other lines longer than $max_line_length
3131#
3132# if LONG_LINE is ignored, the other 2 types are also ignored
3133#
3134
3135		if ($line =~ /^\+/ && $length > $max_line_length) {
3136			my $msg_type = "LONG_LINE";
3137
3138			# Check the allowed long line types first
3139
3140			# logging functions that end in a string that starts
3141			# before $max_line_length
3142			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
3143			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3144				$msg_type = "";
3145
3146			# lines with only strings (w/ possible termination)
3147			# #defines with only strings
3148			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
3149				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
3150				$msg_type = "";
3151
3152			# More special cases
3153			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
3154				 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
3155				$msg_type = "";
3156
3157			# URL ($rawline is used in case the URL is in a comment)
3158			} elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
3159				$msg_type = "";
3160
3161			# Otherwise set the alternate message types
3162
3163			# a comment starts before $max_line_length
3164			} elsif ($line =~ /($;[\s$;]*)$/ &&
3165				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3166				$msg_type = "LONG_LINE_COMMENT"
3167
3168			# a quoted string starts before $max_line_length
3169			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
3170				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3171				$msg_type = "LONG_LINE_STRING"
3172			}
3173
3174			if ($msg_type ne "" &&
3175			    (show_type("LONG_LINE") || show_type($msg_type))) {
3176				WARN($msg_type,
3177				     "line over $max_line_length characters\n" . $herecurr);
3178			}
3179		}
3180
3181# check for adding lines without a newline.
3182		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
3183			WARN("MISSING_EOF_NEWLINE",
3184			     "adding a line without newline at end of file\n" . $herecurr);
3185		}
3186
3187# check we are in a valid source file C or perl if not then ignore this hunk
3188		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
3189
3190# at the beginning of a line any tabs must come first and anything
3191# more than 8 must use tabs.
3192		if ($rawline =~ /^\+\s* \t\s*\S/ ||
3193		    $rawline =~ /^\+\s*        \s*/) {
3194			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3195			$rpt_cleaners = 1;
3196			if (ERROR("CODE_INDENT",
3197				  "code indent should use tabs where possible\n" . $herevet) &&
3198			    $fix) {
3199				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3200			}
3201		}
3202
3203# check for space before tabs.
3204		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
3205			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3206			if (WARN("SPACE_BEFORE_TAB",
3207				"please, no space before tabs\n" . $herevet) &&
3208			    $fix) {
3209				while ($fixed[$fixlinenr] =~
3210					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
3211				while ($fixed[$fixlinenr] =~
3212					   s/(^\+.*) +\t/$1\t/) {}
3213			}
3214		}
3215
3216# check for assignments on the start of a line
3217		if ($sline =~ /^\+\s+($Assignment)[^=]/) {
3218			CHK("ASSIGNMENT_CONTINUATIONS",
3219			    "Assignment operator '$1' should be on the previous line\n" . $hereprev);
3220		}
3221
3222# check for && or || at the start of a line
3223		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
3224			CHK("LOGICAL_CONTINUATIONS",
3225			    "Logical continuations should be on the previous line\n" . $hereprev);
3226		}
3227
3228# check indentation starts on a tab stop
3229		if ($perl_version_ok &&
3230		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
3231			my $indent = length($1);
3232			if ($indent % 8) {
3233				if (WARN("TABSTOP",
3234					 "Statements should start on a tabstop\n" . $herecurr) &&
3235				    $fix) {
3236					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
3237				}
3238			}
3239		}
3240
3241# check multi-line statement indentation matches previous line
3242		if ($perl_version_ok &&
3243		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
3244			$prevline =~ /^\+(\t*)(.*)$/;
3245			my $oldindent = $1;
3246			my $rest = $2;
3247
3248			my $pos = pos_last_openparen($rest);
3249			if ($pos >= 0) {
3250				$line =~ /^(\+| )([ \t]*)/;
3251				my $newindent = $2;
3252
3253				my $goodtabindent = $oldindent .
3254					"\t" x ($pos / 8) .
3255					" "  x ($pos % 8);
3256				my $goodspaceindent = $oldindent . " "  x $pos;
3257
3258				if ($newindent ne $goodtabindent &&
3259				    $newindent ne $goodspaceindent) {
3260
3261					if (CHK("PARENTHESIS_ALIGNMENT",
3262						"Alignment should match open parenthesis\n" . $hereprev) &&
3263					    $fix && $line =~ /^\+/) {
3264						$fixed[$fixlinenr] =~
3265						    s/^\+[ \t]*/\+$goodtabindent/;
3266					}
3267				}
3268			}
3269		}
3270
3271# check for space after cast like "(int) foo" or "(struct foo) bar"
3272# avoid checking a few false positives:
3273#   "sizeof(<type>)" or "__alignof__(<type>)"
3274#   function pointer declarations like "(*foo)(int) = bar;"
3275#   structure definitions like "(struct foo) { 0 };"
3276#   multiline macros that define functions
3277#   known attributes or the __attribute__ keyword
3278		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
3279		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3280			if (CHK("SPACING",
3281				"No space is necessary after a cast\n" . $herecurr) &&
3282			    $fix) {
3283				$fixed[$fixlinenr] =~
3284				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3285			}
3286		}
3287
3288# Block comment styles
3289# Networking with an initial /*
3290		if ($realfile =~ m@^(drivers/net/|net/)@ &&
3291		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
3292		    $rawline =~ /^\+[ \t]*\*/ &&
3293		    $realline > 2) {
3294			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
3295			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
3296		}
3297
3298# Block comments use * on subsequent lines
3299		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3300		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
3301		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
3302		    $rawline =~ /^\+/ &&			#line is new
3303		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
3304			WARN("BLOCK_COMMENT_STYLE",
3305			     "Block comments use * on subsequent lines\n" . $hereprev);
3306		}
3307
3308# Block comments use */ on trailing lines
3309		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
3310		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
3311		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
3312		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
3313			WARN("BLOCK_COMMENT_STYLE",
3314			     "Block comments use a trailing */ on a separate line\n" . $herecurr);
3315		}
3316
3317# Block comment * alignment
3318		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3319		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
3320		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
3321		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
3322		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
3323		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
3324			my $oldindent;
3325			$prevrawline =~ m@^\+([ \t]*/?)\*@;
3326			if (defined($1)) {
3327				$oldindent = expand_tabs($1);
3328			} else {
3329				$prevrawline =~ m@^\+(.*/?)\*@;
3330				$oldindent = expand_tabs($1);
3331			}
3332			$rawline =~ m@^\+([ \t]*)\*@;
3333			my $newindent = $1;
3334			$newindent = expand_tabs($newindent);
3335			if (length($oldindent) ne length($newindent)) {
3336				WARN("BLOCK_COMMENT_STYLE",
3337				     "Block comments should align the * on each line\n" . $hereprev);
3338			}
3339		}
3340
3341# check for missing blank lines after struct/union declarations
3342# with exceptions for various attributes and macros
3343		if ($prevline =~ /^[\+ ]};?\s*$/ &&
3344		    $line =~ /^\+/ &&
3345		    !($line =~ /^\+\s*$/ ||
3346		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
3347		      $line =~ /^\+\s*MODULE_/i ||
3348		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
3349		      $line =~ /^\+[a-z_]*init/ ||
3350		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
3351		      $line =~ /^\+\s*DECLARE/ ||
3352		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
3353		      $line =~ /^\+\s*__setup/)) {
3354			if (CHK("LINE_SPACING",
3355				"Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
3356			    $fix) {
3357				fix_insert_line($fixlinenr, "\+");
3358			}
3359		}
3360
3361# check for multiple consecutive blank lines
3362		if ($prevline =~ /^[\+ ]\s*$/ &&
3363		    $line =~ /^\+\s*$/ &&
3364		    $last_blank_line != ($linenr - 1)) {
3365			if (CHK("LINE_SPACING",
3366				"Please don't use multiple blank lines\n" . $hereprev) &&
3367			    $fix) {
3368				fix_delete_line($fixlinenr, $rawline);
3369			}
3370
3371			$last_blank_line = $linenr;
3372		}
3373
3374# check for missing blank lines after declarations
3375		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
3376			# actual declarations
3377		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3378			# function pointer declarations
3379		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3380			# foo bar; where foo is some local typedef or #define
3381		     $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3382			# known declaration macros
3383		     $prevline =~ /^\+\s+$declaration_macros/) &&
3384			# for "else if" which can look like "$Ident $Ident"
3385		    !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
3386			# other possible extensions of declaration lines
3387		      $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
3388			# not starting a section or a macro "\" extended line
3389		      $prevline =~ /(?:\{\s*|\\)$/) &&
3390			# looks like a declaration
3391		    !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3392			# function pointer declarations
3393		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3394			# foo bar; where foo is some local typedef or #define
3395		      $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3396			# known declaration macros
3397		      $sline =~ /^\+\s+$declaration_macros/ ||
3398			# start of struct or union or enum
3399		      $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
3400			# start or end of block or continuation of declaration
3401		      $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
3402			# bitfield continuation
3403		      $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
3404			# other possible extensions of declaration lines
3405		      $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
3406			# indentation of previous and current line are the same
3407		    (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
3408			if (WARN("LINE_SPACING",
3409				 "Missing a blank line after declarations\n" . $hereprev) &&
3410			    $fix) {
3411				fix_insert_line($fixlinenr, "\+");
3412			}
3413		}
3414
3415# check for spaces at the beginning of a line.
3416# Exceptions:
3417#  1) within comments
3418#  2) indented preprocessor commands
3419#  3) hanging labels
3420		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
3421			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3422			if (WARN("LEADING_SPACE",
3423				 "please, no spaces at the start of a line\n" . $herevet) &&
3424			    $fix) {
3425				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3426			}
3427		}
3428
3429# check we are in a valid C source file if not then ignore this hunk
3430		next if ($realfile !~ /\.(h|c)$/);
3431
3432# check for unusual line ending [ or (
3433		if ($line =~ /^\+.*([\[\(])\s*$/) {
3434			CHK("OPEN_ENDED_LINE",
3435			    "Lines should not end with a '$1'\n" . $herecurr);
3436		}
3437
3438# check if this appears to be the start function declaration, save the name
3439		if ($sline =~ /^\+\{\s*$/ &&
3440		    $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
3441			$context_function = $1;
3442		}
3443
3444# check if this appears to be the end of function declaration
3445		if ($sline =~ /^\+\}\s*$/) {
3446			undef $context_function;
3447		}
3448
3449# check indentation of any line with a bare else
3450# (but not if it is a multiple line "if (foo) return bar; else return baz;")
3451# if the previous line is a break or return and is indented 1 tab more...
3452		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
3453			my $tabs = length($1) + 1;
3454			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
3455			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
3456			     defined $lines[$linenr] &&
3457			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
3458				WARN("UNNECESSARY_ELSE",
3459				     "else is not generally useful after a break or return\n" . $hereprev);
3460			}
3461		}
3462
3463# check indentation of a line with a break;
3464# if the previous line is a goto or return and is indented the same # of tabs
3465		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
3466			my $tabs = $1;
3467			if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
3468				WARN("UNNECESSARY_BREAK",
3469				     "break is not useful after a goto or return\n" . $hereprev);
3470			}
3471		}
3472
3473# check for RCS/CVS revision markers
3474		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
3475			WARN("CVS_KEYWORD",
3476			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
3477		}
3478
3479# check for old HOTPLUG __dev<foo> section markings
3480		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
3481			WARN("HOTPLUG_SECTION",
3482			     "Using $1 is unnecessary\n" . $herecurr);
3483		}
3484
3485# Check for potential 'bare' types
3486		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
3487		    $realline_next);
3488#print "LINE<$line>\n";
3489		if ($linenr > $suppress_statement &&
3490		    $realcnt && $sline =~ /.\s*\S/) {
3491			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3492				ctx_statement_block($linenr, $realcnt, 0);
3493			$stat =~ s/\n./\n /g;
3494			$cond =~ s/\n./\n /g;
3495
3496#print "linenr<$linenr> <$stat>\n";
3497			# If this statement has no statement boundaries within
3498			# it there is no point in retrying a statement scan
3499			# until we hit end of it.
3500			my $frag = $stat; $frag =~ s/;+\s*$//;
3501			if ($frag !~ /(?:{|;)/) {
3502#print "skip<$line_nr_next>\n";
3503				$suppress_statement = $line_nr_next;
3504			}
3505
3506			# Find the real next line.
3507			$realline_next = $line_nr_next;
3508			if (defined $realline_next &&
3509			    (!defined $lines[$realline_next - 1] ||
3510			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
3511				$realline_next++;
3512			}
3513
3514			my $s = $stat;
3515			$s =~ s/{.*$//s;
3516
3517			# Ignore goto labels.
3518			if ($s =~ /$Ident:\*$/s) {
3519
3520			# Ignore functions being called
3521			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
3522
3523			} elsif ($s =~ /^.\s*else\b/s) {
3524
3525			# declarations always start with types
3526			} 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) {
3527				my $type = $1;
3528				$type =~ s/\s+/ /g;
3529				possible($type, "A:" . $s);
3530
3531			# definitions in global scope can only start with types
3532			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
3533				possible($1, "B:" . $s);
3534			}
3535
3536			# any (foo ... *) is a pointer cast, and foo is a type
3537			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
3538				possible($1, "C:" . $s);
3539			}
3540
3541			# Check for any sort of function declaration.
3542			# int foo(something bar, other baz);
3543			# void (*store_gdt)(x86_descr_ptr *);
3544			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
3545				my ($name_len) = length($1);
3546
3547				my $ctx = $s;
3548				substr($ctx, 0, $name_len + 1, '');
3549				$ctx =~ s/\)[^\)]*$//;
3550
3551				for my $arg (split(/\s*,\s*/, $ctx)) {
3552					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
3553
3554						possible($1, "D:" . $s);
3555					}
3556				}
3557			}
3558
3559		}
3560
3561#
3562# Checks which may be anchored in the context.
3563#
3564
3565# Check for switch () and associated case and default
3566# statements should be at the same indent.
3567		if ($line=~/\bswitch\s*\(.*\)/) {
3568			my $err = '';
3569			my $sep = '';
3570			my @ctx = ctx_block_outer($linenr, $realcnt);
3571			shift(@ctx);
3572			for my $ctx (@ctx) {
3573				my ($clen, $cindent) = line_stats($ctx);
3574				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
3575							$indent != $cindent) {
3576					$err .= "$sep$ctx\n";
3577					$sep = '';
3578				} else {
3579					$sep = "[...]\n";
3580				}
3581			}
3582			if ($err ne '') {
3583				ERROR("SWITCH_CASE_INDENT_LEVEL",
3584				      "switch and case should be at the same indent\n$hereline$err");
3585			}
3586		}
3587
3588# if/while/etc brace do not go on next line, unless defining a do while loop,
3589# or if that brace on the next line is for something else
3590		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
3591			my $pre_ctx = "$1$2";
3592
3593			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
3594
3595			if ($line =~ /^\+\t{6,}/) {
3596				WARN("DEEP_INDENTATION",
3597				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
3598			}
3599
3600			my $ctx_cnt = $realcnt - $#ctx - 1;
3601			my $ctx = join("\n", @ctx);
3602
3603			my $ctx_ln = $linenr;
3604			my $ctx_skip = $realcnt;
3605
3606			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
3607					defined $lines[$ctx_ln - 1] &&
3608					$lines[$ctx_ln - 1] =~ /^-/)) {
3609				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
3610				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
3611				$ctx_ln++;
3612			}
3613
3614			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
3615			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
3616
3617			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
3618				ERROR("OPEN_BRACE",
3619				      "that open brace { should be on the previous line\n" .
3620					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3621			}
3622			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
3623			    $ctx =~ /\)\s*\;\s*$/ &&
3624			    defined $lines[$ctx_ln - 1])
3625			{
3626				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
3627				if ($nindent > $indent) {
3628					WARN("TRAILING_SEMICOLON",
3629					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
3630						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3631				}
3632			}
3633		}
3634
3635# Check relative indent for conditionals and blocks.
3636		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3637			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3638				ctx_statement_block($linenr, $realcnt, 0)
3639					if (!defined $stat);
3640			my ($s, $c) = ($stat, $cond);
3641
3642			substr($s, 0, length($c), '');
3643
3644			# remove inline comments
3645			$s =~ s/$;/ /g;
3646			$c =~ s/$;/ /g;
3647
3648			# Find out how long the conditional actually is.
3649			my @newlines = ($c =~ /\n/gs);
3650			my $cond_lines = 1 + $#newlines;
3651
3652			# Make sure we remove the line prefixes as we have
3653			# none on the first line, and are going to readd them
3654			# where necessary.
3655			$s =~ s/\n./\n/gs;
3656			while ($s =~ /\n\s+\\\n/) {
3657				$cond_lines += $s =~ s/\n\s+\\\n/\n/g;
3658			}
3659
3660			# We want to check the first line inside the block
3661			# starting at the end of the conditional, so remove:
3662			#  1) any blank line termination
3663			#  2) any opening brace { on end of the line
3664			#  3) any do (...) {
3665			my $continuation = 0;
3666			my $check = 0;
3667			$s =~ s/^.*\bdo\b//;
3668			$s =~ s/^\s*{//;
3669			if ($s =~ s/^\s*\\//) {
3670				$continuation = 1;
3671			}
3672			if ($s =~ s/^\s*?\n//) {
3673				$check = 1;
3674				$cond_lines++;
3675			}
3676
3677			# Also ignore a loop construct at the end of a
3678			# preprocessor statement.
3679			if (($prevline =~ /^.\s*#\s*define\s/ ||
3680			    $prevline =~ /\\\s*$/) && $continuation == 0) {
3681				$check = 0;
3682			}
3683
3684			my $cond_ptr = -1;
3685			$continuation = 0;
3686			while ($cond_ptr != $cond_lines) {
3687				$cond_ptr = $cond_lines;
3688
3689				# If we see an #else/#elif then the code
3690				# is not linear.
3691				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
3692					$check = 0;
3693				}
3694
3695				# Ignore:
3696				#  1) blank lines, they should be at 0,
3697				#  2) preprocessor lines, and
3698				#  3) labels.
3699				if ($continuation ||
3700				    $s =~ /^\s*?\n/ ||
3701				    $s =~ /^\s*#\s*?/ ||
3702				    $s =~ /^\s*$Ident\s*:/) {
3703					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
3704					if ($s =~ s/^.*?\n//) {
3705						$cond_lines++;
3706					}
3707				}
3708			}
3709
3710			my (undef, $sindent) = line_stats("+" . $s);
3711			my $stat_real = raw_line($linenr, $cond_lines);
3712
3713			# Check if either of these lines are modified, else
3714			# this is not this patch's fault.
3715			if (!defined($stat_real) ||
3716			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
3717				$check = 0;
3718			}
3719			if (defined($stat_real) && $cond_lines > 1) {
3720				$stat_real = "[...]\n$stat_real";
3721			}
3722
3723			#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>\n";
3724
3725			if ($check && $s ne '' &&
3726			    (($sindent % 8) != 0 ||
3727			     ($sindent < $indent) ||
3728			     ($sindent == $indent &&
3729			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
3730			     ($sindent > $indent + 8))) {
3731				WARN("SUSPECT_CODE_INDENT",
3732				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
3733			}
3734		}
3735
3736		# Track the 'values' across context and added lines.
3737		my $opline = $line; $opline =~ s/^./ /;
3738		my ($curr_values, $curr_vars) =
3739				annotate_values($opline . "\n", $prev_values);
3740		$curr_values = $prev_values . $curr_values;
3741		if ($dbg_values) {
3742			my $outline = $opline; $outline =~ s/\t/ /g;
3743			print "$linenr > .$outline\n";
3744			print "$linenr > $curr_values\n";
3745			print "$linenr >  $curr_vars\n";
3746		}
3747		$prev_values = substr($curr_values, -1);
3748
3749#ignore lines not being added
3750		next if ($line =~ /^[^\+]/);
3751
3752# check for dereferences that span multiple lines
3753		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
3754		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
3755			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
3756			my $ref = $1;
3757			$line =~ /^.\s*($Lval)/;
3758			$ref .= $1;
3759			$ref =~ s/\s//g;
3760			WARN("MULTILINE_DEREFERENCE",
3761			     "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
3762		}
3763
3764# check for declarations of signed or unsigned without int
3765		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
3766			my $type = $1;
3767			my $var = $2;
3768			$var = "" if (!defined $var);
3769			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
3770				my $sign = $1;
3771				my $pointer = $2;
3772
3773				$pointer = "" if (!defined $pointer);
3774
3775				if (WARN("UNSPECIFIED_INT",
3776					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
3777				    $fix) {
3778					my $decl = trim($sign) . " int ";
3779					my $comp_pointer = $pointer;
3780					$comp_pointer =~ s/\s//g;
3781					$decl .= $comp_pointer;
3782					$decl = rtrim($decl) if ($var eq "");
3783					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
3784				}
3785			}
3786		}
3787
3788# TEST: allow direct testing of the type matcher.
3789		if ($dbg_type) {
3790			if ($line =~ /^.\s*$Declare\s*$/) {
3791				ERROR("TEST_TYPE",
3792				      "TEST: is type\n" . $herecurr);
3793			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
3794				ERROR("TEST_NOT_TYPE",
3795				      "TEST: is not type ($1 is)\n". $herecurr);
3796			}
3797			next;
3798		}
3799# TEST: allow direct testing of the attribute matcher.
3800		if ($dbg_attr) {
3801			if ($line =~ /^.\s*$Modifier\s*$/) {
3802				ERROR("TEST_ATTR",
3803				      "TEST: is attr\n" . $herecurr);
3804			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
3805				ERROR("TEST_NOT_ATTR",
3806				      "TEST: is not attr ($1 is)\n". $herecurr);
3807			}
3808			next;
3809		}
3810
3811# check for initialisation to aggregates open brace on the next line
3812		if ($line =~ /^.\s*{/ &&
3813		    $prevline =~ /(?:^|[^=])=\s*$/) {
3814			if (ERROR("OPEN_BRACE",
3815				  "that open brace { should be on the previous line\n" . $hereprev) &&
3816			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3817				fix_delete_line($fixlinenr - 1, $prevrawline);
3818				fix_delete_line($fixlinenr, $rawline);
3819				my $fixedline = $prevrawline;
3820				$fixedline =~ s/\s*=\s*$/ = {/;
3821				fix_insert_line($fixlinenr, $fixedline);
3822				$fixedline = $line;
3823				$fixedline =~ s/^(.\s*)\{\s*/$1/;
3824				fix_insert_line($fixlinenr, $fixedline);
3825			}
3826		}
3827
3828#
3829# Checks which are anchored on the added line.
3830#
3831
3832# check for malformed paths in #include statements (uses RAW line)
3833		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
3834			my $path = $1;
3835			if ($path =~ m{//}) {
3836				ERROR("MALFORMED_INCLUDE",
3837				      "malformed #include filename\n" . $herecurr);
3838			}
3839			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
3840				ERROR("UAPI_INCLUDE",
3841				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
3842			}
3843		}
3844
3845# no C99 // comments
3846		if ($line =~ m{//}) {
3847			if (ERROR("C99_COMMENTS",
3848				  "do not use C99 // comments\n" . $herecurr) &&
3849			    $fix) {
3850				my $line = $fixed[$fixlinenr];
3851				if ($line =~ /\/\/(.*)$/) {
3852					my $comment = trim($1);
3853					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3854				}
3855			}
3856		}
3857		# Remove C99 comments.
3858		$line =~ s@//.*@@;
3859		$opline =~ s@//.*@@;
3860
3861# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
3862# the whole statement.
3863#print "APW <$lines[$realline_next - 1]>\n";
3864		if (defined $realline_next &&
3865		    exists $lines[$realline_next - 1] &&
3866		    !defined $suppress_export{$realline_next} &&
3867		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3868		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3869			# Handle definitions which produce identifiers with
3870			# a prefix:
3871			#   XXX(foo);
3872			#   EXPORT_SYMBOL(something_foo);
3873			my $name = $1;
3874			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3875			    $name =~ /^${Ident}_$2/) {
3876#print "FOO C name<$name>\n";
3877				$suppress_export{$realline_next} = 1;
3878
3879			} elsif ($stat !~ /(?:
3880				\n.}\s*$|
3881				^.DEFINE_$Ident\(\Q$name\E\)|
3882				^.DECLARE_$Ident\(\Q$name\E\)|
3883				^.LIST_HEAD\(\Q$name\E\)|
3884				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
3885				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
3886			    )/x) {
3887#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
3888				$suppress_export{$realline_next} = 2;
3889			} else {
3890				$suppress_export{$realline_next} = 1;
3891			}
3892		}
3893		if (!defined $suppress_export{$linenr} &&
3894		    $prevline =~ /^.\s*$/ &&
3895		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3896		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3897#print "FOO B <$lines[$linenr - 1]>\n";
3898			$suppress_export{$linenr} = 2;
3899		}
3900		if (defined $suppress_export{$linenr} &&
3901		    $suppress_export{$linenr} == 2) {
3902			WARN("EXPORT_SYMBOL",
3903			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
3904		}
3905
3906# check for global initialisers.
3907		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
3908			if (ERROR("GLOBAL_INITIALISERS",
3909				  "do not initialise globals to $1\n" . $herecurr) &&
3910			    $fix) {
3911				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
3912			}
3913		}
3914# check for static initialisers.
3915		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
3916			if (ERROR("INITIALISED_STATIC",
3917				  "do not initialise statics to $1\n" .
3918				      $herecurr) &&
3919			    $fix) {
3920				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
3921			}
3922		}
3923
3924# check for misordered declarations of char/short/int/long with signed/unsigned
3925		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
3926			my $tmp = trim($1);
3927			WARN("MISORDERED_TYPE",
3928			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
3929		}
3930
3931# check for unnecessary <signed> int declarations of short/long/long long
3932		while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {
3933			my $type = trim($1);
3934			next if ($type !~ /\bint\b/);
3935			next if ($type !~ /\b(?:short|long\s+long|long)\b/);
3936			my $new_type = $type;
3937			$new_type =~ s/\b\s*int\s*\b/ /;
3938			$new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;
3939			$new_type =~ s/^const\s+//;
3940			$new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);
3941			$new_type = "const $new_type" if ($type =~ /^const\b/);
3942			$new_type =~ s/\s+/ /g;
3943			$new_type = trim($new_type);
3944			if (WARN("UNNECESSARY_INT",
3945				 "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) &&
3946			    $fix) {
3947				$fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;
3948			}
3949		}
3950
3951# check for static const char * arrays.
3952		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
3953			WARN("STATIC_CONST_CHAR_ARRAY",
3954			     "static const char * array should probably be static const char * const\n" .
3955				$herecurr);
3956		}
3957
3958# check for initialized const char arrays that should be static const
3959		if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
3960			if (WARN("STATIC_CONST_CHAR_ARRAY",
3961				 "const array should probably be static const\n" . $herecurr) &&
3962			    $fix) {
3963				$fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
3964			}
3965		}
3966
3967# check for static char foo[] = "bar" declarations.
3968		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
3969			WARN("STATIC_CONST_CHAR_ARRAY",
3970			     "static char array declaration should probably be static const char\n" .
3971				$herecurr);
3972		}
3973
3974# check for const <foo> const where <foo> is not a pointer or array type
3975		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
3976			my $found = $1;
3977			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
3978				WARN("CONST_CONST",
3979				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
3980			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
3981				WARN("CONST_CONST",
3982				     "'const $found const' should probably be 'const $found'\n" . $herecurr);
3983			}
3984		}
3985
3986# check for non-global char *foo[] = {"bar", ...} declarations.
3987		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
3988			WARN("STATIC_CONST_CHAR_ARRAY",
3989			     "char * array declaration might be better as static const\n" .
3990				$herecurr);
3991               }
3992
3993# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
3994		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
3995			my $array = $1;
3996			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
3997				my $array_div = $1;
3998				if (WARN("ARRAY_SIZE",
3999					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
4000				    $fix) {
4001					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
4002				}
4003			}
4004		}
4005
4006# check for function declarations without arguments like "int foo()"
4007		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
4008			if (ERROR("FUNCTION_WITHOUT_ARGS",
4009				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
4010			    $fix) {
4011				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
4012			}
4013		}
4014
4015# check for new typedefs, only function parameters and sparse annotations
4016# make sense.
4017		if ($line =~ /\btypedef\s/ &&
4018		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
4019		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
4020		    $line !~ /\b$typeTypedefs\b/ &&
4021		    $line !~ /\b__bitwise\b/) {
4022			WARN("NEW_TYPEDEFS",
4023			     "do not add new typedefs\n" . $herecurr);
4024		}
4025
4026# * goes on variable not on type
4027		# (char*[ const])
4028		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
4029			#print "AA<$1>\n";
4030			my ($ident, $from, $to) = ($1, $2, $2);
4031
4032			# Should start with a space.
4033			$to =~ s/^(\S)/ $1/;
4034			# Should not end with a space.
4035			$to =~ s/\s+$//;
4036			# '*'s should not have spaces between.
4037			while ($to =~ s/\*\s+\*/\*\*/) {
4038			}
4039
4040##			print "1: from<$from> to<$to> ident<$ident>\n";
4041			if ($from ne $to) {
4042				if (ERROR("POINTER_LOCATION",
4043					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
4044				    $fix) {
4045					my $sub_from = $ident;
4046					my $sub_to = $ident;
4047					$sub_to =~ s/\Q$from\E/$to/;
4048					$fixed[$fixlinenr] =~
4049					    s@\Q$sub_from\E@$sub_to@;
4050				}
4051			}
4052		}
4053		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
4054			#print "BB<$1>\n";
4055			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
4056
4057			# Should start with a space.
4058			$to =~ s/^(\S)/ $1/;
4059			# Should not end with a space.
4060			$to =~ s/\s+$//;
4061			# '*'s should not have spaces between.
4062			while ($to =~ s/\*\s+\*/\*\*/) {
4063			}
4064			# Modifiers should have spaces.
4065			$to =~ s/(\b$Modifier$)/$1 /;
4066
4067##			print "2: from<$from> to<$to> ident<$ident>\n";
4068			if ($from ne $to && $ident !~ /^$Modifier$/) {
4069				if (ERROR("POINTER_LOCATION",
4070					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
4071				    $fix) {
4072
4073					my $sub_from = $match;
4074					my $sub_to = $match;
4075					$sub_to =~ s/\Q$from\E/$to/;
4076					$fixed[$fixlinenr] =~
4077					    s@\Q$sub_from\E@$sub_to@;
4078				}
4079			}
4080		}
4081
4082# avoid BUG() or BUG_ON()
4083		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
4084			my $msg_level = \&WARN;
4085			$msg_level = \&CHK if ($file);
4086			&{$msg_level}("AVOID_BUG",
4087				      "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
4088		}
4089
4090# avoid LINUX_VERSION_CODE
4091		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
4092			WARN("LINUX_VERSION_CODE",
4093			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
4094		}
4095
4096# check for uses of printk_ratelimit
4097		if ($line =~ /\bprintk_ratelimit\s*\(/) {
4098			WARN("PRINTK_RATELIMITED",
4099			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
4100		}
4101
4102# printk should use KERN_* levels
4103		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
4104			WARN("PRINTK_WITHOUT_KERN_LEVEL",
4105			     "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
4106		}
4107
4108		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
4109			my $orig = $1;
4110			my $level = lc($orig);
4111			$level = "warn" if ($level eq "warning");
4112			my $level2 = $level;
4113			$level2 = "dbg" if ($level eq "debug");
4114			WARN("PREFER_PR_LEVEL",
4115			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
4116		}
4117
4118		if ($line =~ /\bpr_warning\s*\(/) {
4119			if (WARN("PREFER_PR_LEVEL",
4120				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
4121			    $fix) {
4122				$fixed[$fixlinenr] =~
4123				    s/\bpr_warning\b/pr_warn/;
4124			}
4125		}
4126
4127		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
4128			my $orig = $1;
4129			my $level = lc($orig);
4130			$level = "warn" if ($level eq "warning");
4131			$level = "dbg" if ($level eq "debug");
4132			WARN("PREFER_DEV_LEVEL",
4133			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
4134		}
4135
4136# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
4137# number of false positives, but assembly files are not checked, so at
4138# least the arch entry code will not trigger this warning.
4139		if ($line =~ /\bENOSYS\b/) {
4140			WARN("ENOSYS",
4141			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
4142		}
4143
4144# function brace can't be on same line, except for #defines of do while,
4145# or if closed on same line
4146		if ($perl_version_ok &&
4147		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
4148		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
4149		    $sline !~ /}/) {
4150			if (ERROR("OPEN_BRACE",
4151				  "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
4152			    $fix) {
4153				fix_delete_line($fixlinenr, $rawline);
4154				my $fixed_line = $rawline;
4155				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
4156				my $line1 = $1;
4157				my $line2 = $2;
4158				fix_insert_line($fixlinenr, ltrim($line1));
4159				fix_insert_line($fixlinenr, "\+{");
4160				if ($line2 !~ /^\s*$/) {
4161					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
4162				}
4163			}
4164		}
4165
4166# open braces for enum, union and struct go on the same line.
4167		if ($line =~ /^.\s*{/ &&
4168		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
4169			if (ERROR("OPEN_BRACE",
4170				  "open brace '{' following $1 go on the same line\n" . $hereprev) &&
4171			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4172				fix_delete_line($fixlinenr - 1, $prevrawline);
4173				fix_delete_line($fixlinenr, $rawline);
4174				my $fixedline = rtrim($prevrawline) . " {";
4175				fix_insert_line($fixlinenr, $fixedline);
4176				$fixedline = $rawline;
4177				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
4178				if ($fixedline !~ /^\+\s*$/) {
4179					fix_insert_line($fixlinenr, $fixedline);
4180				}
4181			}
4182		}
4183
4184# missing space after union, struct or enum definition
4185		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
4186			if (WARN("SPACING",
4187				 "missing space after $1 definition\n" . $herecurr) &&
4188			    $fix) {
4189				$fixed[$fixlinenr] =~
4190				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
4191			}
4192		}
4193
4194# Function pointer declarations
4195# check spacing between type, funcptr, and args
4196# canonical declaration is "type (*funcptr)(args...)"
4197		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
4198			my $declare = $1;
4199			my $pre_pointer_space = $2;
4200			my $post_pointer_space = $3;
4201			my $funcname = $4;
4202			my $post_funcname_space = $5;
4203			my $pre_args_space = $6;
4204
4205# the $Declare variable will capture all spaces after the type
4206# so check it for a missing trailing missing space but pointer return types
4207# don't need a space so don't warn for those.
4208			my $post_declare_space = "";
4209			if ($declare =~ /(\s+)$/) {
4210				$post_declare_space = $1;
4211				$declare = rtrim($declare);
4212			}
4213			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
4214				WARN("SPACING",
4215				     "missing space after return type\n" . $herecurr);
4216				$post_declare_space = " ";
4217			}
4218
4219# unnecessary space "type  (*funcptr)(args...)"
4220# This test is not currently implemented because these declarations are
4221# equivalent to
4222#	int  foo(int bar, ...)
4223# and this is form shouldn't/doesn't generate a checkpatch warning.
4224#
4225#			elsif ($declare =~ /\s{2,}$/) {
4226#				WARN("SPACING",
4227#				     "Multiple spaces after return type\n" . $herecurr);
4228#			}
4229
4230# unnecessary space "type ( *funcptr)(args...)"
4231			if (defined $pre_pointer_space &&
4232			    $pre_pointer_space =~ /^\s/) {
4233				WARN("SPACING",
4234				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
4235			}
4236
4237# unnecessary space "type (* funcptr)(args...)"
4238			if (defined $post_pointer_space &&
4239			    $post_pointer_space =~ /^\s/) {
4240				WARN("SPACING",
4241				     "Unnecessary space before function pointer name\n" . $herecurr);
4242			}
4243
4244# unnecessary space "type (*funcptr )(args...)"
4245			if (defined $post_funcname_space &&
4246			    $post_funcname_space =~ /^\s/) {
4247				WARN("SPACING",
4248				     "Unnecessary space after function pointer name\n" . $herecurr);
4249			}
4250
4251# unnecessary space "type (*funcptr) (args...)"
4252			if (defined $pre_args_space &&
4253			    $pre_args_space =~ /^\s/) {
4254				WARN("SPACING",
4255				     "Unnecessary space before function pointer arguments\n" . $herecurr);
4256			}
4257
4258			if (show_type("SPACING") && $fix) {
4259				$fixed[$fixlinenr] =~
4260				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
4261			}
4262		}
4263
4264# check for spacing round square brackets; allowed:
4265#  1. with a type on the left -- int [] a;
4266#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
4267#  3. inside a curly brace -- = { [0...10] = 5 }
4268		while ($line =~ /(.*?\s)\[/g) {
4269			my ($where, $prefix) = ($-[1], $1);
4270			if ($prefix !~ /$Type\s+$/ &&
4271			    ($where != 0 || $prefix !~ /^.\s+$/) &&
4272			    $prefix !~ /[{,:]\s+$/) {
4273				if (ERROR("BRACKET_SPACE",
4274					  "space prohibited before open square bracket '['\n" . $herecurr) &&
4275				    $fix) {
4276				    $fixed[$fixlinenr] =~
4277					s/^(\+.*?)\s+\[/$1\[/;
4278				}
4279			}
4280		}
4281
4282# check for spaces between functions and their parentheses.
4283		while ($line =~ /($Ident)\s+\(/g) {
4284			my $name = $1;
4285			my $ctx_before = substr($line, 0, $-[1]);
4286			my $ctx = "$ctx_before$name";
4287
4288			# Ignore those directives where spaces _are_ permitted.
4289			if ($name =~ /^(?:
4290				if|for|while|switch|return|case|
4291				volatile|__volatile__|
4292				__attribute__|format|__extension__|
4293				asm|__asm__)$/x)
4294			{
4295			# cpp #define statements have non-optional spaces, ie
4296			# if there is a space between the name and the open
4297			# parenthesis it is simply not a parameter group.
4298			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
4299
4300			# cpp #elif statement condition may start with a (
4301			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
4302
4303			# If this whole things ends with a type its most
4304			# likely a typedef for a function.
4305			} elsif ($ctx =~ /$Type$/) {
4306
4307			} else {
4308				if (WARN("SPACING",
4309					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
4310					     $fix) {
4311					$fixed[$fixlinenr] =~
4312					    s/\b$name\s+\(/$name\(/;
4313				}
4314			}
4315		}
4316
4317# Check operator spacing.
4318		if (!($line=~/\#\s*include/)) {
4319			my $fixed_line = "";
4320			my $line_fixed = 0;
4321
4322			my $ops = qr{
4323				<<=|>>=|<=|>=|==|!=|
4324				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
4325				=>|->|<<|>>|<|>|=|!|~|
4326				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
4327				\?:|\?|:
4328			}x;
4329			my @elements = split(/($ops|;)/, $opline);
4330
4331##			print("element count: <" . $#elements . ">\n");
4332##			foreach my $el (@elements) {
4333##				print("el: <$el>\n");
4334##			}
4335
4336			my @fix_elements = ();
4337			my $off = 0;
4338
4339			foreach my $el (@elements) {
4340				push(@fix_elements, substr($rawline, $off, length($el)));
4341				$off += length($el);
4342			}
4343
4344			$off = 0;
4345
4346			my $blank = copy_spacing($opline);
4347			my $last_after = -1;
4348
4349			for (my $n = 0; $n < $#elements; $n += 2) {
4350
4351				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
4352
4353##				print("n: <$n> good: <$good>\n");
4354
4355				$off += length($elements[$n]);
4356
4357				# Pick up the preceding and succeeding characters.
4358				my $ca = substr($opline, 0, $off);
4359				my $cc = '';
4360				if (length($opline) >= ($off + length($elements[$n + 1]))) {
4361					$cc = substr($opline, $off + length($elements[$n + 1]));
4362				}
4363				my $cb = "$ca$;$cc";
4364
4365				my $a = '';
4366				$a = 'V' if ($elements[$n] ne '');
4367				$a = 'W' if ($elements[$n] =~ /\s$/);
4368				$a = 'C' if ($elements[$n] =~ /$;$/);
4369				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
4370				$a = 'O' if ($elements[$n] eq '');
4371				$a = 'E' if ($ca =~ /^\s*$/);
4372
4373				my $op = $elements[$n + 1];
4374
4375				my $c = '';
4376				if (defined $elements[$n + 2]) {
4377					$c = 'V' if ($elements[$n + 2] ne '');
4378					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
4379					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4380					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
4381					$c = 'O' if ($elements[$n + 2] eq '');
4382					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4383				} else {
4384					$c = 'E';
4385				}
4386
4387				my $ctx = "${a}x${c}";
4388
4389				my $at = "(ctx:$ctx)";
4390
4391				my $ptr = substr($blank, 0, $off) . "^";
4392				my $hereptr = "$hereline$ptr\n";
4393
4394				# Pull out the value of this operator.
4395				my $op_type = substr($curr_values, $off + 1, 1);
4396
4397				# Get the full operator variant.
4398				my $opv = $op . substr($curr_vars, $off, 1);
4399
4400				# Ignore operators passed as parameters.
4401				if ($op_type ne 'V' &&
4402				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
4403
4404#				# Ignore comments
4405#				} elsif ($op =~ /^$;+$/) {
4406
4407				# ; should have either the end of line or a space or \ after it
4408				} elsif ($op eq ';') {
4409					if ($ctx !~ /.x[WEBC]/ &&
4410					    $cc !~ /^\\/ && $cc !~ /^;/) {
4411						if (ERROR("SPACING",
4412							  "space required after that '$op' $at\n" . $hereptr)) {
4413							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
4414							$line_fixed = 1;
4415						}
4416					}
4417
4418				# // is a comment
4419				} elsif ($op eq '//') {
4420
4421				#   :   when part of a bitfield
4422				} elsif ($opv eq ':B') {
4423					# skip the bitfield test for now
4424
4425				# No spaces for:
4426				#   ->
4427				} elsif ($op eq '->') {
4428					if ($ctx =~ /Wx.|.xW/) {
4429						if (ERROR("SPACING",
4430							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
4431							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4432							if (defined $fix_elements[$n + 2]) {
4433								$fix_elements[$n + 2] =~ s/^\s+//;
4434							}
4435							$line_fixed = 1;
4436						}
4437					}
4438
4439				# , must not have a space before and must have a space on the right.
4440				} elsif ($op eq ',') {
4441					my $rtrim_before = 0;
4442					my $space_after = 0;
4443					if ($ctx =~ /Wx./) {
4444						if (ERROR("SPACING",
4445							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4446							$line_fixed = 1;
4447							$rtrim_before = 1;
4448						}
4449					}
4450					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
4451						if (ERROR("SPACING",
4452							  "space required after that '$op' $at\n" . $hereptr)) {
4453							$line_fixed = 1;
4454							$last_after = $n;
4455							$space_after = 1;
4456						}
4457					}
4458					if ($rtrim_before || $space_after) {
4459						if ($rtrim_before) {
4460							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4461						} else {
4462							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4463						}
4464						if ($space_after) {
4465							$good .= " ";
4466						}
4467					}
4468
4469				# '*' as part of a type definition -- reported already.
4470				} elsif ($opv eq '*_') {
4471					#warn "'*' is part of type\n";
4472
4473				# unary operators should have a space before and
4474				# none after.  May be left adjacent to another
4475				# unary operator, or a cast
4476				} elsif ($op eq '!' || $op eq '~' ||
4477					 $opv eq '*U' || $opv eq '-U' ||
4478					 $opv eq '&U' || $opv eq '&&U') {
4479					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
4480						if (ERROR("SPACING",
4481							  "space required before that '$op' $at\n" . $hereptr)) {
4482							if ($n != $last_after + 2) {
4483								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
4484								$line_fixed = 1;
4485							}
4486						}
4487					}
4488					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
4489						# A unary '*' may be const
4490
4491					} elsif ($ctx =~ /.xW/) {
4492						if (ERROR("SPACING",
4493							  "space prohibited after that '$op' $at\n" . $hereptr)) {
4494							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
4495							if (defined $fix_elements[$n + 2]) {
4496								$fix_elements[$n + 2] =~ s/^\s+//;
4497							}
4498							$line_fixed = 1;
4499						}
4500					}
4501
4502				# unary ++ and unary -- are allowed no space on one side.
4503				} elsif ($op eq '++' or $op eq '--') {
4504					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
4505						if (ERROR("SPACING",
4506							  "space required one side of that '$op' $at\n" . $hereptr)) {
4507							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
4508							$line_fixed = 1;
4509						}
4510					}
4511					if ($ctx =~ /Wx[BE]/ ||
4512					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
4513						if (ERROR("SPACING",
4514							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4515							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4516							$line_fixed = 1;
4517						}
4518					}
4519					if ($ctx =~ /ExW/) {
4520						if (ERROR("SPACING",
4521							  "space prohibited after that '$op' $at\n" . $hereptr)) {
4522							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4523							if (defined $fix_elements[$n + 2]) {
4524								$fix_elements[$n + 2] =~ s/^\s+//;
4525							}
4526							$line_fixed = 1;
4527						}
4528					}
4529
4530				# << and >> may either have or not have spaces both sides
4531				} elsif ($op eq '<<' or $op eq '>>' or
4532					 $op eq '&' or $op eq '^' or $op eq '|' or
4533					 $op eq '+' or $op eq '-' or
4534					 $op eq '*' or $op eq '/' or
4535					 $op eq '%')
4536				{
4537					if ($check) {
4538						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
4539							if (CHK("SPACING",
4540								"spaces preferred around that '$op' $at\n" . $hereptr)) {
4541								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4542								$fix_elements[$n + 2] =~ s/^\s+//;
4543								$line_fixed = 1;
4544							}
4545						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
4546							if (CHK("SPACING",
4547								"space preferred before that '$op' $at\n" . $hereptr)) {
4548								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
4549								$line_fixed = 1;
4550							}
4551						}
4552					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
4553						if (ERROR("SPACING",
4554							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
4555							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4556							if (defined $fix_elements[$n + 2]) {
4557								$fix_elements[$n + 2] =~ s/^\s+//;
4558							}
4559							$line_fixed = 1;
4560						}
4561					}
4562
4563				# A colon needs no spaces before when it is
4564				# terminating a case value or a label.
4565				} elsif ($opv eq ':C' || $opv eq ':L') {
4566					if ($ctx =~ /Wx./) {
4567						if (ERROR("SPACING",
4568							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4569							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4570							$line_fixed = 1;
4571						}
4572					}
4573
4574				# All the others need spaces both sides.
4575				} elsif ($ctx !~ /[EWC]x[CWE]/) {
4576					my $ok = 0;
4577
4578					# Ignore email addresses <foo@bar>
4579					if (($op eq '<' &&
4580					     $cc =~ /^\S+\@\S+>/) ||
4581					    ($op eq '>' &&
4582					     $ca =~ /<\S+\@\S+$/))
4583					{
4584					    	$ok = 1;
4585					}
4586
4587					# for asm volatile statements
4588					# ignore a colon with another
4589					# colon immediately before or after
4590					if (($op eq ':') &&
4591					    ($ca =~ /:$/ || $cc =~ /^:/)) {
4592						$ok = 1;
4593					}
4594
4595					# messages are ERROR, but ?: are CHK
4596					if ($ok == 0) {
4597						my $msg_level = \&ERROR;
4598						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
4599
4600						if (&{$msg_level}("SPACING",
4601								  "spaces required around that '$op' $at\n" . $hereptr)) {
4602							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4603							if (defined $fix_elements[$n + 2]) {
4604								$fix_elements[$n + 2] =~ s/^\s+//;
4605							}
4606							$line_fixed = 1;
4607						}
4608					}
4609				}
4610				$off += length($elements[$n + 1]);
4611
4612##				print("n: <$n> GOOD: <$good>\n");
4613
4614				$fixed_line = $fixed_line . $good;
4615			}
4616
4617			if (($#elements % 2) == 0) {
4618				$fixed_line = $fixed_line . $fix_elements[$#elements];
4619			}
4620
4621			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
4622				$fixed[$fixlinenr] = $fixed_line;
4623			}
4624
4625
4626		}
4627
4628# check for whitespace before a non-naked semicolon
4629		if ($line =~ /^\+.*\S\s+;\s*$/) {
4630			if (WARN("SPACING",
4631				 "space prohibited before semicolon\n" . $herecurr) &&
4632			    $fix) {
4633				1 while $fixed[$fixlinenr] =~
4634				    s/^(\+.*\S)\s+;/$1;/;
4635			}
4636		}
4637
4638# check for multiple assignments
4639		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
4640			CHK("MULTIPLE_ASSIGNMENTS",
4641			    "multiple assignments should be avoided\n" . $herecurr);
4642		}
4643
4644## # check for multiple declarations, allowing for a function declaration
4645## # continuation.
4646## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
4647## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
4648##
4649## 			# Remove any bracketed sections to ensure we do not
4650## 			# falsly report the parameters of functions.
4651## 			my $ln = $line;
4652## 			while ($ln =~ s/\([^\(\)]*\)//g) {
4653## 			}
4654## 			if ($ln =~ /,/) {
4655## 				WARN("MULTIPLE_DECLARATION",
4656##				     "declaring multiple variables together should be avoided\n" . $herecurr);
4657## 			}
4658## 		}
4659
4660#need space before brace following if, while, etc
4661		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
4662		    $line =~ /\b(?:else|do)\{/) {
4663			if (ERROR("SPACING",
4664				  "space required before the open brace '{'\n" . $herecurr) &&
4665			    $fix) {
4666				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
4667			}
4668		}
4669
4670## # check for blank lines before declarations
4671##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
4672##		    $prevrawline =~ /^.\s*$/) {
4673##			WARN("SPACING",
4674##			     "No blank lines before declarations\n" . $hereprev);
4675##		}
4676##
4677
4678# closing brace should have a space following it when it has anything
4679# on the line
4680		if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
4681			if (ERROR("SPACING",
4682				  "space required after that close brace '}'\n" . $herecurr) &&
4683			    $fix) {
4684				$fixed[$fixlinenr] =~
4685				    s/}((?!(?:,|;|\)))\S)/} $1/;
4686			}
4687		}
4688
4689# check spacing on square brackets
4690		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
4691			if (ERROR("SPACING",
4692				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
4693			    $fix) {
4694				$fixed[$fixlinenr] =~
4695				    s/\[\s+/\[/;
4696			}
4697		}
4698		if ($line =~ /\s\]/) {
4699			if (ERROR("SPACING",
4700				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
4701			    $fix) {
4702				$fixed[$fixlinenr] =~
4703				    s/\s+\]/\]/;
4704			}
4705		}
4706
4707# check spacing on parentheses
4708		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
4709		    $line !~ /for\s*\(\s+;/) {
4710			if (ERROR("SPACING",
4711				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
4712			    $fix) {
4713				$fixed[$fixlinenr] =~
4714				    s/\(\s+/\(/;
4715			}
4716		}
4717		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
4718		    $line !~ /for\s*\(.*;\s+\)/ &&
4719		    $line !~ /:\s+\)/) {
4720			if (ERROR("SPACING",
4721				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
4722			    $fix) {
4723				$fixed[$fixlinenr] =~
4724				    s/\s+\)/\)/;
4725			}
4726		}
4727
4728# check unnecessary parentheses around addressof/dereference single $Lvals
4729# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
4730
4731		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
4732			my $var = $1;
4733			if (CHK("UNNECESSARY_PARENTHESES",
4734				"Unnecessary parentheses around $var\n" . $herecurr) &&
4735			    $fix) {
4736				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
4737			}
4738		}
4739
4740# check for unnecessary parentheses around function pointer uses
4741# ie: (foo->bar)(); should be foo->bar();
4742# but not "if (foo->bar) (" to avoid some false positives
4743		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
4744			my $var = $2;
4745			if (CHK("UNNECESSARY_PARENTHESES",
4746				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
4747			    $fix) {
4748				my $var2 = deparenthesize($var);
4749				$var2 =~ s/\s//g;
4750				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
4751			}
4752		}
4753
4754# check for unnecessary parentheses around comparisons in if uses
4755# when !drivers/staging or command-line uses --strict
4756		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
4757		    $perl_version_ok && defined($stat) &&
4758		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {
4759			my $if_stat = $1;
4760			my $test = substr($2, 1, -1);
4761			my $herectx;
4762			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
4763				my $match = $1;
4764				# avoid parentheses around potential macro args
4765				next if ($match =~ /^\s*\w+\s*$/);
4766				if (!defined($herectx)) {
4767					$herectx = $here . "\n";
4768					my $cnt = statement_rawlines($if_stat);
4769					for (my $n = 0; $n < $cnt; $n++) {
4770						my $rl = raw_line($linenr, $n);
4771						$herectx .=  $rl . "\n";
4772						last if $rl =~ /^[ \+].*\{/;
4773					}
4774				}
4775				CHK("UNNECESSARY_PARENTHESES",
4776				    "Unnecessary parentheses around '$match'\n" . $herectx);
4777			}
4778		}
4779
4780#goto labels aren't indented, allow a single space however
4781		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
4782		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
4783			if (WARN("INDENTED_LABEL",
4784				 "labels should not be indented\n" . $herecurr) &&
4785			    $fix) {
4786				$fixed[$fixlinenr] =~
4787				    s/^(.)\s+/$1/;
4788			}
4789		}
4790
4791# return is not a function
4792		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
4793			my $spacing = $1;
4794			if ($perl_version_ok &&
4795			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
4796				my $value = $1;
4797				$value = deparenthesize($value);
4798				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
4799					ERROR("RETURN_PARENTHESES",
4800					      "return is not a function, parentheses are not required\n" . $herecurr);
4801				}
4802			} elsif ($spacing !~ /\s+/) {
4803				ERROR("SPACING",
4804				      "space required before the open parenthesis '('\n" . $herecurr);
4805			}
4806		}
4807
4808# unnecessary return in a void function
4809# at end-of-function, with the previous line a single leading tab, then return;
4810# and the line before that not a goto label target like "out:"
4811		if ($sline =~ /^[ \+]}\s*$/ &&
4812		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
4813		    $linenr >= 3 &&
4814		    $lines[$linenr - 3] =~ /^[ +]/ &&
4815		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
4816			WARN("RETURN_VOID",
4817			     "void function return statements are not generally useful\n" . $hereprev);
4818               }
4819
4820# if statements using unnecessary parentheses - ie: if ((foo == bar))
4821		if ($perl_version_ok &&
4822		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
4823			my $openparens = $1;
4824			my $count = $openparens =~ tr@\(@\(@;
4825			my $msg = "";
4826			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
4827				my $comp = $4;	#Not $1 because of $LvalOrFunc
4828				$msg = " - maybe == should be = ?" if ($comp eq "==");
4829				WARN("UNNECESSARY_PARENTHESES",
4830				     "Unnecessary parentheses$msg\n" . $herecurr);
4831			}
4832		}
4833
4834# comparisons with a constant or upper case identifier on the left
4835#	avoid cases like "foo + BAR < baz"
4836#	only fix matches surrounded by parentheses to avoid incorrect
4837#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
4838		if ($perl_version_ok &&
4839		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
4840			my $lead = $1;
4841			my $const = $2;
4842			my $comp = $3;
4843			my $to = $4;
4844			my $newcomp = $comp;
4845			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
4846			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
4847			    WARN("CONSTANT_COMPARISON",
4848				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
4849			    $fix) {
4850				if ($comp eq "<") {
4851					$newcomp = ">";
4852				} elsif ($comp eq "<=") {
4853					$newcomp = ">=";
4854				} elsif ($comp eq ">") {
4855					$newcomp = "<";
4856				} elsif ($comp eq ">=") {
4857					$newcomp = "<=";
4858				}
4859				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
4860			}
4861		}
4862
4863# Return of what appears to be an errno should normally be negative
4864		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
4865			my $name = $1;
4866			if ($name ne 'EOF' && $name ne 'ERROR') {
4867				WARN("USE_NEGATIVE_ERRNO",
4868				     "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
4869			}
4870		}
4871
4872# Need a space before open parenthesis after if, while etc
4873		if ($line =~ /\b(if|while|for|switch)\(/) {
4874			if (ERROR("SPACING",
4875				  "space required before the open parenthesis '('\n" . $herecurr) &&
4876			    $fix) {
4877				$fixed[$fixlinenr] =~
4878				    s/\b(if|while|for|switch)\(/$1 \(/;
4879			}
4880		}
4881
4882# Check for illegal assignment in if conditional -- and check for trailing
4883# statements after the conditional.
4884		if ($line =~ /do\s*(?!{)/) {
4885			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4886				ctx_statement_block($linenr, $realcnt, 0)
4887					if (!defined $stat);
4888			my ($stat_next) = ctx_statement_block($line_nr_next,
4889						$remain_next, $off_next);
4890			$stat_next =~ s/\n./\n /g;
4891			##print "stat<$stat> stat_next<$stat_next>\n";
4892
4893			if ($stat_next =~ /^\s*while\b/) {
4894				# If the statement carries leading newlines,
4895				# then count those as offsets.
4896				my ($whitespace) =
4897					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
4898				my $offset =
4899					statement_rawlines($whitespace) - 1;
4900
4901				$suppress_whiletrailers{$line_nr_next +
4902								$offset} = 1;
4903			}
4904		}
4905		if (!defined $suppress_whiletrailers{$linenr} &&
4906		    defined($stat) && defined($cond) &&
4907		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
4908			my ($s, $c) = ($stat, $cond);
4909
4910			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
4911				ERROR("ASSIGN_IN_IF",
4912				      "do not use assignment in if condition\n" . $herecurr);
4913			}
4914
4915			# Find out what is on the end of the line after the
4916			# conditional.
4917			substr($s, 0, length($c), '');
4918			$s =~ s/\n.*//g;
4919			$s =~ s/$;//g; 	# Remove any comments
4920			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
4921			    $c !~ /}\s*while\s*/)
4922			{
4923				# Find out how long the conditional actually is.
4924				my @newlines = ($c =~ /\n/gs);
4925				my $cond_lines = 1 + $#newlines;
4926				my $stat_real = '';
4927
4928				$stat_real = raw_line($linenr, $cond_lines)
4929							. "\n" if ($cond_lines);
4930				if (defined($stat_real) && $cond_lines > 1) {
4931					$stat_real = "[...]\n$stat_real";
4932				}
4933
4934				ERROR("TRAILING_STATEMENTS",
4935				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
4936			}
4937		}
4938
4939# Check for bitwise tests written as boolean
4940		if ($line =~ /
4941			(?:
4942				(?:\[|\(|\&\&|\|\|)
4943				\s*0[xX][0-9]+\s*
4944				(?:\&\&|\|\|)
4945			|
4946				(?:\&\&|\|\|)
4947				\s*0[xX][0-9]+\s*
4948				(?:\&\&|\|\||\)|\])
4949			)/x)
4950		{
4951			WARN("HEXADECIMAL_BOOLEAN_TEST",
4952			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
4953		}
4954
4955# if and else should not have general statements after it
4956		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
4957			my $s = $1;
4958			$s =~ s/$;//g; 	# Remove any comments
4959			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
4960				ERROR("TRAILING_STATEMENTS",
4961				      "trailing statements should be on next line\n" . $herecurr);
4962			}
4963		}
4964# if should not continue a brace
4965		if ($line =~ /}\s*if\b/) {
4966			ERROR("TRAILING_STATEMENTS",
4967			      "trailing statements should be on next line (or did you mean 'else if'?)\n" .
4968				$herecurr);
4969		}
4970# case and default should not have general statements after them
4971		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
4972		    $line !~ /\G(?:
4973			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
4974			\s*return\s+
4975		    )/xg)
4976		{
4977			ERROR("TRAILING_STATEMENTS",
4978			      "trailing statements should be on next line\n" . $herecurr);
4979		}
4980
4981		# Check for }<nl>else {, these must be at the same
4982		# indent level to be relevant to each other.
4983		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
4984		    $previndent == $indent) {
4985			if (ERROR("ELSE_AFTER_BRACE",
4986				  "else should follow close brace '}'\n" . $hereprev) &&
4987			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4988				fix_delete_line($fixlinenr - 1, $prevrawline);
4989				fix_delete_line($fixlinenr, $rawline);
4990				my $fixedline = $prevrawline;
4991				$fixedline =~ s/}\s*$//;
4992				if ($fixedline !~ /^\+\s*$/) {
4993					fix_insert_line($fixlinenr, $fixedline);
4994				}
4995				$fixedline = $rawline;
4996				$fixedline =~ s/^(.\s*)else/$1} else/;
4997				fix_insert_line($fixlinenr, $fixedline);
4998			}
4999		}
5000
5001		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
5002		    $previndent == $indent) {
5003			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
5004
5005			# Find out what is on the end of the line after the
5006			# conditional.
5007			substr($s, 0, length($c), '');
5008			$s =~ s/\n.*//g;
5009
5010			if ($s =~ /^\s*;/) {
5011				if (ERROR("WHILE_AFTER_BRACE",
5012					  "while should follow close brace '}'\n" . $hereprev) &&
5013				    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
5014					fix_delete_line($fixlinenr - 1, $prevrawline);
5015					fix_delete_line($fixlinenr, $rawline);
5016					my $fixedline = $prevrawline;
5017					my $trailing = $rawline;
5018					$trailing =~ s/^\+//;
5019					$trailing = trim($trailing);
5020					$fixedline =~ s/}\s*$/} $trailing/;
5021					fix_insert_line($fixlinenr, $fixedline);
5022				}
5023			}
5024		}
5025
5026#Specific variable tests
5027		while ($line =~ m{($Constant|$Lval)}g) {
5028			my $var = $1;
5029
5030#CamelCase
5031			if ($var !~ /^$Constant$/ &&
5032			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
5033#Ignore Page<foo> variants
5034			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
5035#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
5036			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
5037#Ignore some three character SI units explicitly, like MiB and KHz
5038			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
5039				while ($var =~ m{($Ident)}g) {
5040					my $word = $1;
5041					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
5042					if ($check) {
5043						seed_camelcase_includes();
5044						if (!$file && !$camelcase_file_seeded) {
5045							seed_camelcase_file($realfile);
5046							$camelcase_file_seeded = 1;
5047						}
5048					}
5049					if (!defined $camelcase{$word}) {
5050						$camelcase{$word} = 1;
5051						CHK("CAMELCASE",
5052						    "Avoid CamelCase: <$word>\n" . $herecurr);
5053					}
5054				}
5055			}
5056		}
5057
5058#no spaces allowed after \ in define
5059		if ($line =~ /\#\s*define.*\\\s+$/) {
5060			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
5061				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
5062			    $fix) {
5063				$fixed[$fixlinenr] =~ s/\s+$//;
5064			}
5065		}
5066
5067# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
5068# itself <asm/foo.h> (uses RAW line)
5069		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
5070			my $file = "$1.h";
5071			my $checkfile = "include/linux/$file";
5072			if (-f "$root/$checkfile" &&
5073			    $realfile ne $checkfile &&
5074			    $1 !~ /$allowed_asm_includes/)
5075			{
5076				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
5077				if ($asminclude > 0) {
5078					if ($realfile =~ m{^arch/}) {
5079						CHK("ARCH_INCLUDE_LINUX",
5080						    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5081					} else {
5082						WARN("INCLUDE_LINUX",
5083						     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5084					}
5085				}
5086			}
5087		}
5088
5089# multi-statement macros should be enclosed in a do while loop, grab the
5090# first statement and ensure its the whole macro if its not enclosed
5091# in a known good container
5092		if ($realfile !~ m@/vmlinux.lds.h$@ &&
5093		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
5094			my $ln = $linenr;
5095			my $cnt = $realcnt;
5096			my ($off, $dstat, $dcond, $rest);
5097			my $ctx = '';
5098			my $has_flow_statement = 0;
5099			my $has_arg_concat = 0;
5100			($dstat, $dcond, $ln, $cnt, $off) =
5101				ctx_statement_block($linenr, $realcnt, 0);
5102			$ctx = $dstat;
5103			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
5104			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
5105
5106			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
5107			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
5108
5109			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
5110			my $define_args = $1;
5111			my $define_stmt = $dstat;
5112			my @def_args = ();
5113
5114			if (defined $define_args && $define_args ne "") {
5115				$define_args = substr($define_args, 1, length($define_args) - 2);
5116				$define_args =~ s/\s*//g;
5117				$define_args =~ s/\\\+?//g;
5118				@def_args = split(",", $define_args);
5119			}
5120
5121			$dstat =~ s/$;//g;
5122			$dstat =~ s/\\\n.//g;
5123			$dstat =~ s/^\s*//s;
5124			$dstat =~ s/\s*$//s;
5125
5126			# Flatten any parentheses and braces
5127			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
5128			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
5129			       $dstat =~ s/.\[[^\[\]]*\]/1/)
5130			{
5131			}
5132
5133			# Flatten any obvious string concatentation.
5134			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
5135			       $dstat =~ s/$Ident\s*($String)/$1/)
5136			{
5137			}
5138
5139			# Make asm volatile uses seem like a generic function
5140			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
5141
5142			my $exceptions = qr{
5143				$Declare|
5144				module_param_named|
5145				MODULE_PARM_DESC|
5146				DECLARE_PER_CPU|
5147				DEFINE_PER_CPU|
5148				__typeof__\(|
5149				union|
5150				struct|
5151				\.$Ident\s*=\s*|
5152				^\"|\"$|
5153				^\[
5154			}x;
5155			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
5156
5157			$ctx =~ s/\n*$//;
5158			my $stmt_cnt = statement_rawlines($ctx);
5159			my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
5160
5161			if ($dstat ne '' &&
5162			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
5163			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
5164			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
5165			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
5166			    $dstat !~ /$exceptions/ &&
5167			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
5168			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
5169			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
5170			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
5171			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
5172			    $dstat !~ /^do\s*{/ &&					# do {...
5173			    $dstat !~ /^\(\{/ &&						# ({...
5174			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
5175			{
5176				if ($dstat =~ /^\s*if\b/) {
5177					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
5178					      "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
5179				} elsif ($dstat =~ /;/) {
5180					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
5181					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
5182				} else {
5183					ERROR("COMPLEX_MACRO",
5184					      "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
5185				}
5186
5187			}
5188
5189			# Make $define_stmt single line, comment-free, etc
5190			my @stmt_array = split('\n', $define_stmt);
5191			my $first = 1;
5192			$define_stmt = "";
5193			foreach my $l (@stmt_array) {
5194				$l =~ s/\\$//;
5195				if ($first) {
5196					$define_stmt = $l;
5197					$first = 0;
5198				} elsif ($l =~ /^[\+ ]/) {
5199					$define_stmt .= substr($l, 1);
5200				}
5201			}
5202			$define_stmt =~ s/$;//g;
5203			$define_stmt =~ s/\s+/ /g;
5204			$define_stmt = trim($define_stmt);
5205
5206# check if any macro arguments are reused (ignore '...' and 'type')
5207			foreach my $arg (@def_args) {
5208			        next if ($arg =~ /\.\.\./);
5209			        next if ($arg =~ /^type$/i);
5210				my $tmp_stmt = $define_stmt;
5211				$tmp_stmt =~ s/\b(sizeof|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
5212				$tmp_stmt =~ s/\#+\s*$arg\b//g;
5213				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
5214				my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
5215				if ($use_cnt > 1) {
5216					CHK("MACRO_ARG_REUSE",
5217					    "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
5218				    }
5219# check if any macro arguments may have other precedence issues
5220				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
5221				    ((defined($1) && $1 ne ',') ||
5222				     (defined($2) && $2 ne ','))) {
5223					CHK("MACRO_ARG_PRECEDENCE",
5224					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
5225				}
5226			}
5227
5228# check for macros with flow control, but without ## concatenation
5229# ## concatenation is commonly a macro that defines a function so ignore those
5230			if ($has_flow_statement && !$has_arg_concat) {
5231				my $cnt = statement_rawlines($ctx);
5232				my $herectx = get_stat_here($linenr, $cnt, $here);
5233
5234				WARN("MACRO_WITH_FLOW_CONTROL",
5235				     "Macros with flow control statements should be avoided\n" . "$herectx");
5236			}
5237
5238# check for line continuations outside of #defines, preprocessor #, and asm
5239
5240		} else {
5241			if ($prevline !~ /^..*\\$/ &&
5242			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
5243			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5244			    $line =~ /^\+.*\\$/) {
5245				WARN("LINE_CONTINUATIONS",
5246				     "Avoid unnecessary line continuations\n" . $herecurr);
5247			}
5248		}
5249
5250# do {} while (0) macro tests:
5251# single-statement macros do not need to be enclosed in do while (0) loop,
5252# macro should not end with a semicolon
5253		if ($perl_version_ok &&
5254		    $realfile !~ m@/vmlinux.lds.h$@ &&
5255		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
5256			my $ln = $linenr;
5257			my $cnt = $realcnt;
5258			my ($off, $dstat, $dcond, $rest);
5259			my $ctx = '';
5260			($dstat, $dcond, $ln, $cnt, $off) =
5261				ctx_statement_block($linenr, $realcnt, 0);
5262			$ctx = $dstat;
5263
5264			$dstat =~ s/\\\n.//g;
5265			$dstat =~ s/$;/ /g;
5266
5267			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
5268				my $stmts = $2;
5269				my $semis = $3;
5270
5271				$ctx =~ s/\n*$//;
5272				my $cnt = statement_rawlines($ctx);
5273				my $herectx = get_stat_here($linenr, $cnt, $here);
5274
5275				if (($stmts =~ tr/;/;/) == 1 &&
5276				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
5277					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
5278					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
5279				}
5280				if (defined $semis && $semis ne "") {
5281					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
5282					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
5283				}
5284			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
5285				$ctx =~ s/\n*$//;
5286				my $cnt = statement_rawlines($ctx);
5287				my $herectx = get_stat_here($linenr, $cnt, $here);
5288
5289				WARN("TRAILING_SEMICOLON",
5290				     "macros should not use a trailing semicolon\n" . "$herectx");
5291			}
5292		}
5293
5294# check for redundant bracing round if etc
5295		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
5296			my ($level, $endln, @chunks) =
5297				ctx_statement_full($linenr, $realcnt, 1);
5298			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
5299			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
5300			if ($#chunks > 0 && $level == 0) {
5301				my @allowed = ();
5302				my $allow = 0;
5303				my $seen = 0;
5304				my $herectx = $here . "\n";
5305				my $ln = $linenr - 1;
5306				for my $chunk (@chunks) {
5307					my ($cond, $block) = @{$chunk};
5308
5309					# If the condition carries leading newlines, then count those as offsets.
5310					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
5311					my $offset = statement_rawlines($whitespace) - 1;
5312
5313					$allowed[$allow] = 0;
5314					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
5315
5316					# We have looked at and allowed this specific line.
5317					$suppress_ifbraces{$ln + $offset} = 1;
5318
5319					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
5320					$ln += statement_rawlines($block) - 1;
5321
5322					substr($block, 0, length($cond), '');
5323
5324					$seen++ if ($block =~ /^\s*{/);
5325
5326					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
5327					if (statement_lines($cond) > 1) {
5328						#print "APW: ALLOWED: cond<$cond>\n";
5329						$allowed[$allow] = 1;
5330					}
5331					if ($block =~/\b(?:if|for|while)\b/) {
5332						#print "APW: ALLOWED: block<$block>\n";
5333						$allowed[$allow] = 1;
5334					}
5335					if (statement_block_size($block) > 1) {
5336						#print "APW: ALLOWED: lines block<$block>\n";
5337						$allowed[$allow] = 1;
5338					}
5339					$allow++;
5340				}
5341				if ($seen) {
5342					my $sum_allowed = 0;
5343					foreach (@allowed) {
5344						$sum_allowed += $_;
5345					}
5346					if ($sum_allowed == 0) {
5347						WARN("BRACES",
5348						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
5349					} elsif ($sum_allowed != $allow &&
5350						 $seen != $allow) {
5351						CHK("BRACES",
5352						    "braces {} should be used on all arms of this statement\n" . $herectx);
5353					}
5354				}
5355			}
5356		}
5357		if (!defined $suppress_ifbraces{$linenr - 1} &&
5358					$line =~ /\b(if|while|for|else)\b/) {
5359			my $allowed = 0;
5360
5361			# Check the pre-context.
5362			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
5363				#print "APW: ALLOWED: pre<$1>\n";
5364				$allowed = 1;
5365			}
5366
5367			my ($level, $endln, @chunks) =
5368				ctx_statement_full($linenr, $realcnt, $-[0]);
5369
5370			# Check the condition.
5371			my ($cond, $block) = @{$chunks[0]};
5372			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
5373			if (defined $cond) {
5374				substr($block, 0, length($cond), '');
5375			}
5376			if (statement_lines($cond) > 1) {
5377				#print "APW: ALLOWED: cond<$cond>\n";
5378				$allowed = 1;
5379			}
5380			if ($block =~/\b(?:if|for|while)\b/) {
5381				#print "APW: ALLOWED: block<$block>\n";
5382				$allowed = 1;
5383			}
5384			if (statement_block_size($block) > 1) {
5385				#print "APW: ALLOWED: lines block<$block>\n";
5386				$allowed = 1;
5387			}
5388			# Check the post-context.
5389			if (defined $chunks[1]) {
5390				my ($cond, $block) = @{$chunks[1]};
5391				if (defined $cond) {
5392					substr($block, 0, length($cond), '');
5393				}
5394				if ($block =~ /^\s*\{/) {
5395					#print "APW: ALLOWED: chunk-1 block<$block>\n";
5396					$allowed = 1;
5397				}
5398			}
5399			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
5400				my $cnt = statement_rawlines($block);
5401				my $herectx = get_stat_here($linenr, $cnt, $here);
5402
5403				WARN("BRACES",
5404				     "braces {} are not necessary for single statement blocks\n" . $herectx);
5405			}
5406		}
5407
5408# check for single line unbalanced braces
5409		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
5410		    $sline =~ /^.\s*else\s*\{\s*$/) {
5411			CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
5412		}
5413
5414# check for unnecessary blank lines around braces
5415		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
5416			if (CHK("BRACES",
5417				"Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
5418			    $fix && $prevrawline =~ /^\+/) {
5419				fix_delete_line($fixlinenr - 1, $prevrawline);
5420			}
5421		}
5422		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
5423			if (CHK("BRACES",
5424				"Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
5425			    $fix) {
5426				fix_delete_line($fixlinenr, $rawline);
5427			}
5428		}
5429
5430# no volatiles please
5431		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
5432		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
5433			WARN("VOLATILE",
5434			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
5435		}
5436
5437# Check for user-visible strings broken across lines, which breaks the ability
5438# to grep for the string.  Make exceptions when the previous string ends in a
5439# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
5440# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
5441		if ($line =~ /^\+\s*$String/ &&
5442		    $prevline =~ /"\s*$/ &&
5443		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
5444			if (WARN("SPLIT_STRING",
5445				 "quoted string split across lines\n" . $hereprev) &&
5446				     $fix &&
5447				     $prevrawline =~ /^\+.*"\s*$/ &&
5448				     $last_coalesced_string_linenr != $linenr - 1) {
5449				my $extracted_string = get_quoted_string($line, $rawline);
5450				my $comma_close = "";
5451				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
5452					$comma_close = $1;
5453				}
5454
5455				fix_delete_line($fixlinenr - 1, $prevrawline);
5456				fix_delete_line($fixlinenr, $rawline);
5457				my $fixedline = $prevrawline;
5458				$fixedline =~ s/"\s*$//;
5459				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
5460				fix_insert_line($fixlinenr - 1, $fixedline);
5461				$fixedline = $rawline;
5462				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
5463				if ($fixedline !~ /\+\s*$/) {
5464					fix_insert_line($fixlinenr, $fixedline);
5465				}
5466				$last_coalesced_string_linenr = $linenr;
5467			}
5468		}
5469
5470# check for missing a space in a string concatenation
5471		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
5472			WARN('MISSING_SPACE',
5473			     "break quoted strings at a space character\n" . $hereprev);
5474		}
5475
5476# check for an embedded function name in a string when the function is known
5477# This does not work very well for -f --file checking as it depends on patch
5478# context providing the function name or a single line form for in-file
5479# function declarations
5480		if ($line =~ /^\+.*$String/ &&
5481		    defined($context_function) &&
5482		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
5483		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
5484			WARN("EMBEDDED_FUNCTION_NAME",
5485			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
5486		}
5487
5488# check for spaces before a quoted newline
5489		if ($rawline =~ /^.*\".*\s\\n/) {
5490			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
5491				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
5492			    $fix) {
5493				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
5494			}
5495
5496		}
5497
5498# concatenated string without spaces between elements
5499		if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) {
5500			if (CHK("CONCATENATED_STRING",
5501				"Concatenated strings should use spaces between elements\n" . $herecurr) &&
5502			    $fix) {
5503				while ($line =~ /($String)/g) {
5504					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
5505					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/;
5506					$fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/;
5507				}
5508			}
5509		}
5510
5511# uncoalesced string fragments
5512		if ($line =~ /$String\s*"/) {
5513			if (WARN("STRING_FRAGMENTS",
5514				 "Consecutive strings are generally better as a single string\n" . $herecurr) &&
5515			    $fix) {
5516				while ($line =~ /($String)(?=\s*")/g) {
5517					my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
5518					$fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e;
5519				}
5520			}
5521		}
5522
5523# check for non-standard and hex prefixed decimal printf formats
5524		my $show_L = 1;	#don't show the same defect twice
5525		my $show_Z = 1;
5526		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
5527			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5528			$string =~ s/%%/__/g;
5529			# check for %L
5530			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5531				WARN("PRINTF_L",
5532				     "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
5533				$show_L = 0;
5534			}
5535			# check for %Z
5536			if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
5537				WARN("PRINTF_Z",
5538				     "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
5539				$show_Z = 0;
5540			}
5541			# check for 0x<decimal>
5542			if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
5543				ERROR("PRINTF_0XDECIMAL",
5544				      "Prefixing 0x with decimal output is defective\n" . $herecurr);
5545			}
5546		}
5547
5548# check for line continuations in quoted strings with odd counts of "
5549		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5550			WARN("LINE_CONTINUATIONS",
5551			     "Avoid line continuations in quoted strings\n" . $herecurr);
5552		}
5553
5554# warn about #if 0
5555		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
5556			WARN("IF_0",
5557			     "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr);
5558		}
5559
5560# warn about #if 1
5561		if ($line =~ /^.\s*\#\s*if\s+1\b/) {
5562			WARN("IF_1",
5563			     "Consider removing the #if 1 and its #endif\n" . $herecurr);
5564		}
5565
5566# check for needless "if (<foo>) fn(<foo>)" uses
5567		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
5568			my $tested = quotemeta($1);
5569			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
5570			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
5571				my $func = $1;
5572				if (WARN('NEEDLESS_IF',
5573					 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
5574				    $fix) {
5575					my $do_fix = 1;
5576					my $leading_tabs = "";
5577					my $new_leading_tabs = "";
5578					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
5579						$leading_tabs = $1;
5580					} else {
5581						$do_fix = 0;
5582					}
5583					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
5584						$new_leading_tabs = $1;
5585						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
5586							$do_fix = 0;
5587						}
5588					} else {
5589						$do_fix = 0;
5590					}
5591					if ($do_fix) {
5592						fix_delete_line($fixlinenr - 1, $prevrawline);
5593						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
5594					}
5595				}
5596			}
5597		}
5598
5599# check for unnecessary "Out of Memory" messages
5600		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
5601		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
5602		    (defined $1 || defined $3) &&
5603		    $linenr > 3) {
5604			my $testval = $2;
5605			my $testline = $lines[$linenr - 3];
5606
5607			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
5608#			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
5609
5610			if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
5611			    $s !~ /\b__GFP_NOWARN\b/ ) {
5612				WARN("OOM_MESSAGE",
5613				     "Possible unnecessary 'out of memory' message\n" . $hereprev);
5614			}
5615		}
5616
5617# check for logging functions with KERN_<LEVEL>
5618		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
5619		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
5620			my $level = $1;
5621			if (WARN("UNNECESSARY_KERN_LEVEL",
5622				 "Possible unnecessary $level\n" . $herecurr) &&
5623			    $fix) {
5624				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
5625			}
5626		}
5627
5628# check for logging continuations
5629		if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
5630			WARN("LOGGING_CONTINUATION",
5631			     "Avoid logging continuation uses where feasible\n" . $herecurr);
5632		}
5633
5634# check for mask then right shift without a parentheses
5635		if ($perl_version_ok &&
5636		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
5637		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
5638			WARN("MASK_THEN_SHIFT",
5639			     "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
5640		}
5641
5642# check for pointer comparisons to NULL
5643		if ($perl_version_ok) {
5644			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
5645				my $val = $1;
5646				my $equal = "!";
5647				$equal = "" if ($4 eq "!=");
5648				if (CHK("COMPARISON_TO_NULL",
5649					"Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
5650					    $fix) {
5651					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
5652				}
5653			}
5654		}
5655
5656# check for bad placement of section $InitAttribute (e.g.: __initdata)
5657		if ($line =~ /(\b$InitAttribute\b)/) {
5658			my $attr = $1;
5659			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
5660				my $ptr = $1;
5661				my $var = $2;
5662				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
5663				      ERROR("MISPLACED_INIT",
5664					    "$attr should be placed after $var\n" . $herecurr)) ||
5665				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
5666				      WARN("MISPLACED_INIT",
5667					   "$attr should be placed after $var\n" . $herecurr))) &&
5668				    $fix) {
5669					$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;
5670				}
5671			}
5672		}
5673
5674# check for $InitAttributeData (ie: __initdata) with const
5675		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
5676			my $attr = $1;
5677			$attr =~ /($InitAttributePrefix)(.*)/;
5678			my $attr_prefix = $1;
5679			my $attr_type = $2;
5680			if (ERROR("INIT_ATTRIBUTE",
5681				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
5682			    $fix) {
5683				$fixed[$fixlinenr] =~
5684				    s/$InitAttributeData/${attr_prefix}initconst/;
5685			}
5686		}
5687
5688# check for $InitAttributeConst (ie: __initconst) without const
5689		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
5690			my $attr = $1;
5691			if (ERROR("INIT_ATTRIBUTE",
5692				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
5693			    $fix) {
5694				my $lead = $fixed[$fixlinenr] =~
5695				    /(^\+\s*(?:static\s+))/;
5696				$lead = rtrim($1);
5697				$lead = "$lead " if ($lead !~ /^\+$/);
5698				$lead = "${lead}const ";
5699				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
5700			}
5701		}
5702
5703# check for __read_mostly with const non-pointer (should just be const)
5704		if ($line =~ /\b__read_mostly\b/ &&
5705		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
5706			if (ERROR("CONST_READ_MOSTLY",
5707				  "Invalid use of __read_mostly with const type\n" . $herecurr) &&
5708			    $fix) {
5709				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
5710			}
5711		}
5712
5713# don't use __constant_<foo> functions outside of include/uapi/
5714		if ($realfile !~ m@^include/uapi/@ &&
5715		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
5716			my $constant_func = $1;
5717			my $func = $constant_func;
5718			$func =~ s/^__constant_//;
5719			if (WARN("CONSTANT_CONVERSION",
5720				 "$constant_func should be $func\n" . $herecurr) &&
5721			    $fix) {
5722				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
5723			}
5724		}
5725
5726# prefer usleep_range over udelay
5727		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
5728			my $delay = $1;
5729			# ignore udelay's < 10, however
5730			if (! ($delay < 10) ) {
5731				CHK("USLEEP_RANGE",
5732				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr);
5733			}
5734			if ($delay > 2000) {
5735				WARN("LONG_UDELAY",
5736				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
5737			}
5738		}
5739
5740# warn about unexpectedly long msleep's
5741		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5742			if ($1 < 20) {
5743				WARN("MSLEEP",
5744				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr);
5745			}
5746		}
5747
5748# check for comparisons of jiffies
5749		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
5750			WARN("JIFFIES_COMPARISON",
5751			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
5752		}
5753
5754# check for comparisons of get_jiffies_64()
5755		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
5756			WARN("JIFFIES_COMPARISON",
5757			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
5758		}
5759
5760# warn about #ifdefs in C files
5761#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
5762#			print "#ifdef in C files should be avoided\n";
5763#			print "$herecurr";
5764#			$clean = 0;
5765#		}
5766
5767# warn about spacing in #ifdefs
5768		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
5769			if (ERROR("SPACING",
5770				  "exactly one space required after that #$1\n" . $herecurr) &&
5771			    $fix) {
5772				$fixed[$fixlinenr] =~
5773				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
5774			}
5775
5776		}
5777
5778# check for spinlock_t definitions without a comment.
5779		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
5780		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
5781			my $which = $1;
5782			if (!ctx_has_comment($first_line, $linenr)) {
5783				CHK("UNCOMMENTED_DEFINITION",
5784				    "$1 definition without comment\n" . $herecurr);
5785			}
5786		}
5787# check for memory barriers without a comment.
5788
5789		my $barriers = qr{
5790			mb|
5791			rmb|
5792			wmb|
5793			read_barrier_depends
5794		}x;
5795		my $barrier_stems = qr{
5796			mb__before_atomic|
5797			mb__after_atomic|
5798			store_release|
5799			load_acquire|
5800			store_mb|
5801			(?:$barriers)
5802		}x;
5803		my $all_barriers = qr{
5804			(?:$barriers)|
5805			smp_(?:$barrier_stems)|
5806			virt_(?:$barrier_stems)
5807		}x;
5808
5809		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
5810			if (!ctx_has_comment($first_line, $linenr)) {
5811				WARN("MEMORY_BARRIER",
5812				     "memory barrier without comment\n" . $herecurr);
5813			}
5814		}
5815
5816		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
5817
5818		if ($realfile !~ m@^include/asm-generic/@ &&
5819		    $realfile !~ m@/barrier\.h$@ &&
5820		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
5821		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
5822			WARN("MEMORY_BARRIER",
5823			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
5824		}
5825
5826# check for waitqueue_active without a comment.
5827		if ($line =~ /\bwaitqueue_active\s*\(/) {
5828			if (!ctx_has_comment($first_line, $linenr)) {
5829				WARN("WAITQUEUE_ACTIVE",
5830				     "waitqueue_active without comment\n" . $herecurr);
5831			}
5832		}
5833
5834# check for smp_read_barrier_depends and read_barrier_depends
5835		if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) {
5836			WARN("READ_BARRIER_DEPENDS",
5837			     "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr);
5838		}
5839
5840# check of hardware specific defines
5841		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
5842			CHK("ARCH_DEFINES",
5843			    "architecture specific defines should be avoided\n" .  $herecurr);
5844		}
5845
5846# check that the storage class is not after a type
5847		if ($line =~ /\b($Type)\s+($Storage)\b/) {
5848			WARN("STORAGE_CLASS",
5849			     "storage class '$2' should be located before type '$1'\n" . $herecurr);
5850		}
5851# Check that the storage class is at the beginning of a declaration
5852		if ($line =~ /\b$Storage\b/ &&
5853		    $line !~ /^.\s*$Storage/ &&
5854		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
5855		    $1 !~ /[\,\)]\s*$/) {
5856			WARN("STORAGE_CLASS",
5857			     "storage class should be at the beginning of the declaration\n" . $herecurr);
5858		}
5859
5860# check the location of the inline attribute, that it is between
5861# storage class and type.
5862		if ($line =~ /\b$Type\s+$Inline\b/ ||
5863		    $line =~ /\b$Inline\s+$Storage\b/) {
5864			ERROR("INLINE_LOCATION",
5865			      "inline keyword should sit between storage class and type\n" . $herecurr);
5866		}
5867
5868# Check for __inline__ and __inline, prefer inline
5869		if ($realfile !~ m@\binclude/uapi/@ &&
5870		    $line =~ /\b(__inline__|__inline)\b/) {
5871			if (WARN("INLINE",
5872				 "plain inline is preferred over $1\n" . $herecurr) &&
5873			    $fix) {
5874				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
5875
5876			}
5877		}
5878
5879# Check for __attribute__ packed, prefer __packed
5880		if ($realfile !~ m@\binclude/uapi/@ &&
5881		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
5882			WARN("PREFER_PACKED",
5883			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
5884		}
5885
5886# Check for __attribute__ aligned, prefer __aligned
5887		if ($realfile !~ m@\binclude/uapi/@ &&
5888		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
5889			WARN("PREFER_ALIGNED",
5890			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
5891		}
5892
5893# Check for __attribute__ section, prefer __section
5894		if ($realfile !~ m@\binclude/uapi/@ &&
5895		    $line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) {
5896			my $old = substr($rawline, $-[1], $+[1] - $-[1]);
5897			my $new = substr($old, 1, -1);
5898			if (WARN("PREFER_SECTION",
5899				 "__section($new) is preferred over __attribute__((section($old)))\n" . $herecurr) &&
5900			    $fix) {
5901				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/;
5902			}
5903		}
5904
5905# Check for __attribute__ format(printf, prefer __printf
5906		if ($realfile !~ m@\binclude/uapi/@ &&
5907		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
5908			if (WARN("PREFER_PRINTF",
5909				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
5910			    $fix) {
5911				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
5912
5913			}
5914		}
5915
5916# Check for __attribute__ format(scanf, prefer __scanf
5917		if ($realfile !~ m@\binclude/uapi/@ &&
5918		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
5919			if (WARN("PREFER_SCANF",
5920				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
5921			    $fix) {
5922				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
5923			}
5924		}
5925
5926# Check for __attribute__ weak, or __weak declarations (may have link issues)
5927		if ($perl_version_ok &&
5928		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
5929		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
5930		     $line =~ /\b__weak\b/)) {
5931			ERROR("WEAK_DECLARATION",
5932			      "Using weak declarations can have unintended link defects\n" . $herecurr);
5933		}
5934
5935# check for c99 types like uint8_t used outside of uapi/ and tools/
5936		if ($realfile !~ m@\binclude/uapi/@ &&
5937		    $realfile !~ m@\btools/@ &&
5938		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
5939			my $type = $1;
5940			if ($type =~ /\b($typeC99Typedefs)\b/) {
5941				$type = $1;
5942				my $kernel_type = 'u';
5943				$kernel_type = 's' if ($type =~ /^_*[si]/);
5944				$type =~ /(\d+)/;
5945				$kernel_type .= $1;
5946				if (CHK("PREFER_KERNEL_TYPES",
5947					"Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
5948				    $fix) {
5949					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
5950				}
5951			}
5952		}
5953
5954# check for cast of C90 native int or longer types constants
5955		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
5956			my $cast = $1;
5957			my $const = $2;
5958			if (WARN("TYPECAST_INT_CONSTANT",
5959				 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
5960			    $fix) {
5961				my $suffix = "";
5962				my $newconst = $const;
5963				$newconst =~ s/${Int_type}$//;
5964				$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
5965				if ($cast =~ /\blong\s+long\b/) {
5966					$suffix .= 'LL';
5967				} elsif ($cast =~ /\blong\b/) {
5968					$suffix .= 'L';
5969				}
5970				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
5971			}
5972		}
5973
5974# check for sizeof(&)
5975		if ($line =~ /\bsizeof\s*\(\s*\&/) {
5976			WARN("SIZEOF_ADDRESS",
5977			     "sizeof(& should be avoided\n" . $herecurr);
5978		}
5979
5980# check for sizeof without parenthesis
5981		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
5982			if (WARN("SIZEOF_PARENTHESIS",
5983				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
5984			    $fix) {
5985				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
5986			}
5987		}
5988
5989# check for struct spinlock declarations
5990		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
5991			WARN("USE_SPINLOCK_T",
5992			     "struct spinlock should be spinlock_t\n" . $herecurr);
5993		}
5994
5995# check for seq_printf uses that could be seq_puts
5996		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
5997			my $fmt = get_quoted_string($line, $rawline);
5998			$fmt =~ s/%%//g;
5999			if ($fmt !~ /%/) {
6000				if (WARN("PREFER_SEQ_PUTS",
6001					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
6002				    $fix) {
6003					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
6004				}
6005			}
6006		}
6007
6008# check for vsprintf extension %p<foo> misuses
6009		if ($perl_version_ok &&
6010		    defined $stat &&
6011		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
6012		    $1 !~ /^_*volatile_*$/) {
6013			my $stat_real;
6014
6015			my $lc = $stat =~ tr@\n@@;
6016			$lc = $lc + $linenr;
6017		        for (my $count = $linenr; $count <= $lc; $count++) {
6018				my $specifier;
6019				my $extension;
6020				my $bad_specifier = "";
6021				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
6022				$fmt =~ s/%%//g;
6023
6024				while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
6025					$specifier = $1;
6026					$extension = $2;
6027					if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxt]/) {
6028						$bad_specifier = $specifier;
6029						last;
6030					}
6031					if ($extension eq "x" && !defined($stat_real)) {
6032						if (!defined($stat_real)) {
6033							$stat_real = get_stat_real($linenr, $lc);
6034						}
6035						WARN("VSPRINTF_SPECIFIER_PX",
6036						     "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");
6037					}
6038				}
6039				if ($bad_specifier ne "") {
6040					my $stat_real = get_stat_real($linenr, $lc);
6041					my $ext_type = "Invalid";
6042					my $use = "";
6043					if ($bad_specifier =~ /p[Ff]/) {
6044						$ext_type = "Deprecated";
6045						$use = " - use %pS instead";
6046						$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
6047					}
6048
6049					WARN("VSPRINTF_POINTER_EXTENSION",
6050					     "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
6051				}
6052			}
6053		}
6054
6055# Check for misused memsets
6056		if ($perl_version_ok &&
6057		    defined $stat &&
6058		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
6059
6060			my $ms_addr = $2;
6061			my $ms_val = $7;
6062			my $ms_size = $12;
6063
6064			if ($ms_size =~ /^(0x|)0$/i) {
6065				ERROR("MEMSET",
6066				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
6067			} elsif ($ms_size =~ /^(0x|)1$/i) {
6068				WARN("MEMSET",
6069				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
6070			}
6071		}
6072
6073# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
6074#		if ($perl_version_ok &&
6075#		    defined $stat &&
6076#		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6077#			if (WARN("PREFER_ETHER_ADDR_COPY",
6078#				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
6079#			    $fix) {
6080#				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
6081#			}
6082#		}
6083
6084# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
6085#		if ($perl_version_ok &&
6086#		    defined $stat &&
6087#		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6088#			WARN("PREFER_ETHER_ADDR_EQUAL",
6089#			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
6090#		}
6091
6092# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
6093# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
6094#		if ($perl_version_ok &&
6095#		    defined $stat &&
6096#		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6097#
6098#			my $ms_val = $7;
6099#
6100#			if ($ms_val =~ /^(?:0x|)0+$/i) {
6101#				if (WARN("PREFER_ETH_ZERO_ADDR",
6102#					 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
6103#				    $fix) {
6104#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
6105#				}
6106#			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
6107#				if (WARN("PREFER_ETH_BROADCAST_ADDR",
6108#					 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
6109#				    $fix) {
6110#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
6111#				}
6112#			}
6113#		}
6114
6115# typecasts on min/max could be min_t/max_t
6116		if ($perl_version_ok &&
6117		    defined $stat &&
6118		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
6119			if (defined $2 || defined $7) {
6120				my $call = $1;
6121				my $cast1 = deparenthesize($2);
6122				my $arg1 = $3;
6123				my $cast2 = deparenthesize($7);
6124				my $arg2 = $8;
6125				my $cast;
6126
6127				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
6128					$cast = "$cast1 or $cast2";
6129				} elsif ($cast1 ne "") {
6130					$cast = $cast1;
6131				} else {
6132					$cast = $cast2;
6133				}
6134				WARN("MINMAX",
6135				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
6136			}
6137		}
6138
6139# check usleep_range arguments
6140		if ($perl_version_ok &&
6141		    defined $stat &&
6142		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
6143			my $min = $1;
6144			my $max = $7;
6145			if ($min eq $max) {
6146				WARN("USLEEP_RANGE",
6147				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6148			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
6149				 $min > $max) {
6150				WARN("USLEEP_RANGE",
6151				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6152			}
6153		}
6154
6155# check for naked sscanf
6156		if ($perl_version_ok &&
6157		    defined $stat &&
6158		    $line =~ /\bsscanf\b/ &&
6159		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
6160		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
6161		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
6162			my $lc = $stat =~ tr@\n@@;
6163			$lc = $lc + $linenr;
6164			my $stat_real = get_stat_real($linenr, $lc);
6165			WARN("NAKED_SSCANF",
6166			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
6167		}
6168
6169# check for simple sscanf that should be kstrto<foo>
6170		if ($perl_version_ok &&
6171		    defined $stat &&
6172		    $line =~ /\bsscanf\b/) {
6173			my $lc = $stat =~ tr@\n@@;
6174			$lc = $lc + $linenr;
6175			my $stat_real = get_stat_real($linenr, $lc);
6176			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
6177				my $format = $6;
6178				my $count = $format =~ tr@%@%@;
6179				if ($count == 1 &&
6180				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
6181					WARN("SSCANF_TO_KSTRTO",
6182					     "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
6183				}
6184			}
6185		}
6186
6187# check for new externs in .h files.
6188		if ($realfile =~ /\.h$/ &&
6189		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
6190			if (CHK("AVOID_EXTERNS",
6191				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
6192			    $fix) {
6193				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
6194			}
6195		}
6196
6197# check for new externs in .c files.
6198		if ($realfile =~ /\.c$/ && defined $stat &&
6199		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
6200		{
6201			my $function_name = $1;
6202			my $paren_space = $2;
6203
6204			my $s = $stat;
6205			if (defined $cond) {
6206				substr($s, 0, length($cond), '');
6207			}
6208			if ($s =~ /^\s*;/ &&
6209			    $function_name ne 'uninitialized_var')
6210			{
6211				WARN("AVOID_EXTERNS",
6212				     "externs should be avoided in .c files\n" .  $herecurr);
6213			}
6214
6215			if ($paren_space =~ /\n/) {
6216				WARN("FUNCTION_ARGUMENTS",
6217				     "arguments for function declarations should follow identifier\n" . $herecurr);
6218			}
6219
6220		} elsif ($realfile =~ /\.c$/ && defined $stat &&
6221		    $stat =~ /^.\s*extern\s+/)
6222		{
6223			WARN("AVOID_EXTERNS",
6224			     "externs should be avoided in .c files\n" .  $herecurr);
6225		}
6226
6227# check for function declarations that have arguments without identifier names
6228		if (defined $stat &&
6229		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
6230		    $1 ne "void") {
6231			my $args = trim($1);
6232			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
6233				my $arg = trim($1);
6234				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
6235					WARN("FUNCTION_ARGUMENTS",
6236					     "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
6237				}
6238			}
6239		}
6240
6241# check for function definitions
6242		if ($perl_version_ok &&
6243		    defined $stat &&
6244		    $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
6245			$context_function = $1;
6246
6247# check for multiline function definition with misplaced open brace
6248			my $ok = 0;
6249			my $cnt = statement_rawlines($stat);
6250			my $herectx = $here . "\n";
6251			for (my $n = 0; $n < $cnt; $n++) {
6252				my $rl = raw_line($linenr, $n);
6253				$herectx .=  $rl . "\n";
6254				$ok = 1 if ($rl =~ /^[ \+]\{/);
6255				$ok = 1 if ($rl =~ /\{/ && $n == 0);
6256				last if $rl =~ /^[ \+].*\{/;
6257			}
6258			if (!$ok) {
6259				ERROR("OPEN_BRACE",
6260				      "open brace '{' following function definitions go on the next line\n" . $herectx);
6261			}
6262		}
6263
6264# checks for new __setup's
6265		if ($rawline =~ /\b__setup\("([^"]*)"/) {
6266			my $name = $1;
6267
6268			if (!grep(/$name/, @setup_docs)) {
6269				CHK("UNDOCUMENTED_SETUP",
6270				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
6271			}
6272		}
6273
6274# check for pointless casting of alloc functions
6275		if ($line =~ /\*\s*\)\s*$allocFunctions\b/) {
6276			WARN("UNNECESSARY_CASTS",
6277			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
6278		}
6279
6280# alloc style
6281# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
6282		if ($perl_version_ok &&
6283		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
6284			CHK("ALLOC_SIZEOF_STRUCT",
6285			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
6286		}
6287
6288# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
6289		if ($perl_version_ok &&
6290		    defined $stat &&
6291		    $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
6292			my $oldfunc = $3;
6293			my $a1 = $4;
6294			my $a2 = $10;
6295			my $newfunc = "kmalloc_array";
6296			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
6297			my $r1 = $a1;
6298			my $r2 = $a2;
6299			if ($a1 =~ /^sizeof\s*\S/) {
6300				$r1 = $a2;
6301				$r2 = $a1;
6302			}
6303			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
6304			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
6305				my $cnt = statement_rawlines($stat);
6306				my $herectx = get_stat_here($linenr, $cnt, $here);
6307
6308				if (WARN("ALLOC_WITH_MULTIPLY",
6309					 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
6310				    $cnt == 1 &&
6311				    $fix) {
6312					$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;
6313				}
6314			}
6315		}
6316
6317# check for krealloc arg reuse
6318		if ($perl_version_ok &&
6319		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
6320		    $1 eq $3) {
6321			WARN("KREALLOC_ARG_REUSE",
6322			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
6323		}
6324
6325# check for alloc argument mismatch
6326		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
6327			WARN("ALLOC_ARRAY_ARGS",
6328			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
6329		}
6330
6331# check for multiple semicolons
6332		if ($line =~ /;\s*;\s*$/) {
6333			if (WARN("ONE_SEMICOLON",
6334				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
6335			    $fix) {
6336				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
6337			}
6338		}
6339
6340# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
6341		if ($realfile !~ m@^include/uapi/@ &&
6342		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
6343			my $ull = "";
6344			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
6345			if (CHK("BIT_MACRO",
6346				"Prefer using the BIT$ull macro\n" . $herecurr) &&
6347			    $fix) {
6348				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
6349			}
6350		}
6351
6352# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
6353		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
6354			my $config = $1;
6355			if (WARN("PREFER_IS_ENABLED",
6356				 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
6357			    $fix) {
6358				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
6359			}
6360		}
6361
6362# check for case / default statements not preceded by break/fallthrough/switch
6363		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
6364			my $has_break = 0;
6365			my $has_statement = 0;
6366			my $count = 0;
6367			my $prevline = $linenr;
6368			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
6369				$prevline--;
6370				my $rline = $rawlines[$prevline - 1];
6371				my $fline = $lines[$prevline - 1];
6372				last if ($fline =~ /^\@\@/);
6373				next if ($fline =~ /^\-/);
6374				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
6375				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
6376				next if ($fline =~ /^.[\s$;]*$/);
6377				$has_statement = 1;
6378				$count++;
6379				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/);
6380			}
6381			if (!$has_break && $has_statement) {
6382				WARN("MISSING_BREAK",
6383				     "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
6384			}
6385		}
6386
6387# check for switch/default statements without a break;
6388		if ($perl_version_ok &&
6389		    defined $stat &&
6390		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
6391			my $cnt = statement_rawlines($stat);
6392			my $herectx = get_stat_here($linenr, $cnt, $here);
6393
6394			WARN("DEFAULT_NO_BREAK",
6395			     "switch default: should use break\n" . $herectx);
6396		}
6397
6398# check for gcc specific __FUNCTION__
6399		if ($line =~ /\b__FUNCTION__\b/) {
6400			if (WARN("USE_FUNC",
6401				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
6402			    $fix) {
6403				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
6404			}
6405		}
6406
6407# check for uses of __DATE__, __TIME__, __TIMESTAMP__
6408		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
6409			ERROR("DATE_TIME",
6410			      "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
6411		}
6412
6413# check for use of yield()
6414		if ($line =~ /\byield\s*\(\s*\)/) {
6415			WARN("YIELD",
6416			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
6417		}
6418
6419# check for comparisons against true and false
6420		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
6421			my $lead = $1;
6422			my $arg = $2;
6423			my $test = $3;
6424			my $otype = $4;
6425			my $trail = $5;
6426			my $op = "!";
6427
6428			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
6429
6430			my $type = lc($otype);
6431			if ($type =~ /^(?:true|false)$/) {
6432				if (("$test" eq "==" && "$type" eq "true") ||
6433				    ("$test" eq "!=" && "$type" eq "false")) {
6434					$op = "";
6435				}
6436
6437				CHK("BOOL_COMPARISON",
6438				    "Using comparison to $otype is error prone\n" . $herecurr);
6439
6440## maybe suggesting a correct construct would better
6441##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
6442
6443			}
6444		}
6445
6446# check for semaphores initialized locked
6447		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
6448			WARN("CONSIDER_COMPLETION",
6449			     "consider using a completion\n" . $herecurr);
6450		}
6451
6452# recommend kstrto* over simple_strto* and strict_strto*
6453		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
6454			WARN("CONSIDER_KSTRTO",
6455			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
6456		}
6457
6458# check for __initcall(), use device_initcall() explicitly or more appropriate function please
6459		if ($line =~ /^.\s*__initcall\s*\(/) {
6460			WARN("USE_DEVICE_INITCALL",
6461			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
6462		}
6463
6464# check for spin_is_locked(), suggest lockdep instead
6465		if ($line =~ /\bspin_is_locked\(/) {
6466			WARN("USE_LOCKDEP",
6467			     "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr);
6468		}
6469
6470# check for deprecated apis
6471		if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
6472			my $deprecated_api = $1;
6473			my $new_api = $deprecated_apis{$deprecated_api};
6474			WARN("DEPRECATED_API",
6475			     "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr);
6476		}
6477
6478# check for various structs that are normally const (ops, kgdb, device_tree)
6479# and avoid what seem like struct definitions 'struct foo {'
6480		if ($line !~ /\bconst\b/ &&
6481		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
6482			WARN("CONST_STRUCT",
6483			     "struct $1 should normally be const\n" . $herecurr);
6484		}
6485
6486# use of NR_CPUS is usually wrong
6487# ignore definitions of NR_CPUS and usage to define arrays as likely right
6488		if ($line =~ /\bNR_CPUS\b/ &&
6489		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
6490		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
6491		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
6492		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
6493		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
6494		{
6495			WARN("NR_CPUS",
6496			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
6497		}
6498
6499# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
6500		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
6501			ERROR("DEFINE_ARCH_HAS",
6502			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
6503		}
6504
6505# likely/unlikely comparisons similar to "(likely(foo) > 0)"
6506		if ($perl_version_ok &&
6507		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
6508			WARN("LIKELY_MISUSE",
6509			     "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
6510		}
6511
6512# nested likely/unlikely calls
6513		if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
6514			WARN("LIKELY_MISUSE",
6515			     "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr);
6516		}
6517
6518# whine mightly about in_atomic
6519		if ($line =~ /\bin_atomic\s*\(/) {
6520			if ($realfile =~ m@^drivers/@) {
6521				ERROR("IN_ATOMIC",
6522				      "do not use in_atomic in drivers\n" . $herecurr);
6523			} elsif ($realfile !~ m@^kernel/@) {
6524				WARN("IN_ATOMIC",
6525				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
6526			}
6527		}
6528
6529# check for mutex_trylock_recursive usage
6530		if ($line =~ /mutex_trylock_recursive/) {
6531			ERROR("LOCKING",
6532			      "recursive locking is bad, do not use this ever.\n" . $herecurr);
6533		}
6534
6535# check for lockdep_set_novalidate_class
6536		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
6537		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
6538			if ($realfile !~ m@^kernel/lockdep@ &&
6539			    $realfile !~ m@^include/linux/lockdep@ &&
6540			    $realfile !~ m@^drivers/base/core@) {
6541				ERROR("LOCKDEP",
6542				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
6543			}
6544		}
6545
6546		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
6547		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
6548			WARN("EXPORTED_WORLD_WRITABLE",
6549			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
6550		}
6551
6552# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
6553# and whether or not function naming is typical and if
6554# DEVICE_ATTR permissions uses are unusual too
6555		if ($perl_version_ok &&
6556		    defined $stat &&
6557		    $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
6558			my $var = $1;
6559			my $perms = $2;
6560			my $show = $3;
6561			my $store = $4;
6562			my $octal_perms = perms_to_octal($perms);
6563			if ($show =~ /^${var}_show$/ &&
6564			    $store =~ /^${var}_store$/ &&
6565			    $octal_perms eq "0644") {
6566				if (WARN("DEVICE_ATTR_RW",
6567					 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
6568				    $fix) {
6569					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
6570				}
6571			} elsif ($show =~ /^${var}_show$/ &&
6572				 $store =~ /^NULL$/ &&
6573				 $octal_perms eq "0444") {
6574				if (WARN("DEVICE_ATTR_RO",
6575					 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
6576				    $fix) {
6577					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
6578				}
6579			} elsif ($show =~ /^NULL$/ &&
6580				 $store =~ /^${var}_store$/ &&
6581				 $octal_perms eq "0200") {
6582				if (WARN("DEVICE_ATTR_WO",
6583					 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
6584				    $fix) {
6585					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
6586				}
6587			} elsif ($octal_perms eq "0644" ||
6588				 $octal_perms eq "0444" ||
6589				 $octal_perms eq "0200") {
6590				my $newshow = "$show";
6591				$newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
6592				my $newstore = $store;
6593				$newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
6594				my $rename = "";
6595				if ($show ne $newshow) {
6596					$rename .= " '$show' to '$newshow'";
6597				}
6598				if ($store ne $newstore) {
6599					$rename .= " '$store' to '$newstore'";
6600				}
6601				WARN("DEVICE_ATTR_FUNCTIONS",
6602				     "Consider renaming function(s)$rename\n" . $herecurr);
6603			} else {
6604				WARN("DEVICE_ATTR_PERMS",
6605				     "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
6606			}
6607		}
6608
6609# Mode permission misuses where it seems decimal should be octal
6610# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
6611# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
6612#   specific definition of not visible in sysfs.
6613# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
6614#   use the default permissions
6615		if ($perl_version_ok &&
6616		    defined $stat &&
6617		    $line =~ /$mode_perms_search/) {
6618			foreach my $entry (@mode_permission_funcs) {
6619				my $func = $entry->[0];
6620				my $arg_pos = $entry->[1];
6621
6622				my $lc = $stat =~ tr@\n@@;
6623				$lc = $lc + $linenr;
6624				my $stat_real = get_stat_real($linenr, $lc);
6625
6626				my $skip_args = "";
6627				if ($arg_pos > 1) {
6628					$arg_pos--;
6629					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
6630				}
6631				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
6632				if ($stat =~ /$test/) {
6633					my $val = $1;
6634					$val = $6 if ($skip_args ne "");
6635					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
6636					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
6637					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
6638						ERROR("NON_OCTAL_PERMISSIONS",
6639						      "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
6640					}
6641					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
6642						ERROR("EXPORTED_WORLD_WRITABLE",
6643						      "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
6644					}
6645				}
6646			}
6647		}
6648
6649# check for uses of S_<PERMS> that could be octal for readability
6650		while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
6651			my $oval = $1;
6652			my $octal = perms_to_octal($oval);
6653			if (WARN("SYMBOLIC_PERMS",
6654				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
6655			    $fix) {
6656				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
6657			}
6658		}
6659
6660# validate content of MODULE_LICENSE against list from include/linux/module.h
6661		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
6662			my $extracted_string = get_quoted_string($line, $rawline);
6663			my $valid_licenses = qr{
6664						GPL|
6665						GPL\ v2|
6666						GPL\ and\ additional\ rights|
6667						Dual\ BSD/GPL|
6668						Dual\ MIT/GPL|
6669						Dual\ MPL/GPL|
6670						Proprietary
6671					}x;
6672			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
6673				WARN("MODULE_LICENSE",
6674				     "unknown module license " . $extracted_string . "\n" . $herecurr);
6675			}
6676		}
6677
6678# check for sysctl duplicate constants
6679		if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
6680			WARN("DUPLICATED_SYSCTL_CONST",
6681				"duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
6682		}
6683	}
6684
6685	# If we have no input at all, then there is nothing to report on
6686	# so just keep quiet.
6687	if ($#rawlines == -1) {
6688		exit(0);
6689	}
6690
6691	# In mailback mode only produce a report in the negative, for
6692	# things that appear to be patches.
6693	if ($mailback && ($clean == 1 || !$is_patch)) {
6694		exit(0);
6695	}
6696
6697	# This is not a patch, and we are are in 'no-patch' mode so
6698	# just keep quiet.
6699	if (!$chk_patch && !$is_patch) {
6700		exit(0);
6701	}
6702
6703	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
6704		ERROR("NOT_UNIFIED_DIFF",
6705		      "Does not appear to be a unified-diff format patch\n");
6706	}
6707	if ($is_patch && $has_commit_log && $chk_signoff) {
6708		if ($signoff == 0) {
6709			ERROR("MISSING_SIGN_OFF",
6710			      "Missing Signed-off-by: line(s)\n");
6711		} elsif (!$authorsignoff) {
6712			WARN("NO_AUTHOR_SIGN_OFF",
6713			     "Missing Signed-off-by: line by nominal patch author '$author'\n");
6714		}
6715	}
6716
6717	print report_dump();
6718	if ($summary && !($clean == 1 && $quiet == 1)) {
6719		print "$filename " if ($summary_file);
6720		print "total: $cnt_error errors, $cnt_warn warnings, " .
6721			(($check)? "$cnt_chk checks, " : "") .
6722			"$cnt_lines lines checked\n";
6723	}
6724
6725	if ($quiet == 0) {
6726		# If there were any defects found and not already fixing them
6727		if (!$clean and !$fix) {
6728			print << "EOM"
6729
6730NOTE: For some of the reported defects, checkpatch may be able to
6731      mechanically convert to the typical style using --fix or --fix-inplace.
6732EOM
6733		}
6734		# If there were whitespace errors which cleanpatch can fix
6735		# then suggest that.
6736		if ($rpt_cleaners) {
6737			$rpt_cleaners = 0;
6738			print << "EOM"
6739
6740NOTE: Whitespace errors detected.
6741      You may wish to use scripts/cleanpatch or scripts/cleanfile
6742EOM
6743		}
6744	}
6745
6746	if ($clean == 0 && $fix &&
6747	    ("@rawlines" ne "@fixed" ||
6748	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
6749		my $newfile = $filename;
6750		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
6751		my $linecount = 0;
6752		my $f;
6753
6754		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
6755
6756		open($f, '>', $newfile)
6757		    or die "$P: Can't open $newfile for write\n";
6758		foreach my $fixed_line (@fixed) {
6759			$linecount++;
6760			if ($file) {
6761				if ($linecount > 3) {
6762					$fixed_line =~ s/^\+//;
6763					print $f $fixed_line . "\n";
6764				}
6765			} else {
6766				print $f $fixed_line . "\n";
6767			}
6768		}
6769		close($f);
6770
6771		if (!$quiet) {
6772			print << "EOM";
6773
6774Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
6775
6776Do _NOT_ trust the results written to this file.
6777Do _NOT_ submit these changes without inspecting them for correctness.
6778
6779This EXPERIMENTAL file is simply a convenience to help rewrite patches.
6780No warranties, expressed or implied...
6781EOM
6782		}
6783	}
6784
6785	if ($quiet == 0) {
6786		print "\n";
6787		if ($clean == 1) {
6788			print "$vname has no obvious style problems and is ready for submission.\n";
6789		} else {
6790			print "$vname has style problems, please review.\n";
6791		}
6792	}
6793	return $clean;
6794}
6795