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