xref: /openbmc/linux/scripts/checkpatch.pl (revision b240b419db5d624ce7a5a397d6f62a1a686009ec)
1#!/usr/bin/env perl
2# (c) 2001, Dave Jones. (the file handling bit)
3# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
4# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
5# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
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 joe@smith.com" bad
1087		#   "joe smith <joe@smith.com" 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# check we are in a valid source file C or perl if not then ignore this hunk
2986		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
2987
2988# at the beginning of a line any tabs must come first and anything
2989# more than 8 must use tabs.
2990		if ($rawline =~ /^\+\s* \t\s*\S/ ||
2991		    $rawline =~ /^\+\s*        \s*/) {
2992			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2993			$rpt_cleaners = 1;
2994			if (ERROR("CODE_INDENT",
2995				  "code indent should use tabs where possible\n" . $herevet) &&
2996			    $fix) {
2997				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2998			}
2999		}
3000
3001# check for space before tabs.
3002		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
3003			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3004			if (WARN("SPACE_BEFORE_TAB",
3005				"please, no space before tabs\n" . $herevet) &&
3006			    $fix) {
3007				while ($fixed[$fixlinenr] =~
3008					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
3009				while ($fixed[$fixlinenr] =~
3010					   s/(^\+.*) +\t/$1\t/) {}
3011			}
3012		}
3013
3014# check for && or || at the start of a line
3015		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
3016			CHK("LOGICAL_CONTINUATIONS",
3017			    "Logical continuations should be on the previous line\n" . $hereprev);
3018		}
3019
3020# check indentation starts on a tab stop
3021		if ($^V && $^V ge 5.10.0 &&
3022		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
3023			my $indent = length($1);
3024			if ($indent % 8) {
3025				if (WARN("TABSTOP",
3026					 "Statements should start on a tabstop\n" . $herecurr) &&
3027				    $fix) {
3028					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
3029				}
3030			}
3031		}
3032
3033# check multi-line statement indentation matches previous line
3034		if ($^V && $^V ge 5.10.0 &&
3035		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
3036			$prevline =~ /^\+(\t*)(.*)$/;
3037			my $oldindent = $1;
3038			my $rest = $2;
3039
3040			my $pos = pos_last_openparen($rest);
3041			if ($pos >= 0) {
3042				$line =~ /^(\+| )([ \t]*)/;
3043				my $newindent = $2;
3044
3045				my $goodtabindent = $oldindent .
3046					"\t" x ($pos / 8) .
3047					" "  x ($pos % 8);
3048				my $goodspaceindent = $oldindent . " "  x $pos;
3049
3050				if ($newindent ne $goodtabindent &&
3051				    $newindent ne $goodspaceindent) {
3052
3053					if (CHK("PARENTHESIS_ALIGNMENT",
3054						"Alignment should match open parenthesis\n" . $hereprev) &&
3055					    $fix && $line =~ /^\+/) {
3056						$fixed[$fixlinenr] =~
3057						    s/^\+[ \t]*/\+$goodtabindent/;
3058					}
3059				}
3060			}
3061		}
3062
3063# check for space after cast like "(int) foo" or "(struct foo) bar"
3064# avoid checking a few false positives:
3065#   "sizeof(<type>)" or "__alignof__(<type>)"
3066#   function pointer declarations like "(*foo)(int) = bar;"
3067#   structure definitions like "(struct foo) { 0 };"
3068#   multiline macros that define functions
3069#   known attributes or the __attribute__ keyword
3070		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
3071		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3072			if (CHK("SPACING",
3073				"No space is necessary after a cast\n" . $herecurr) &&
3074			    $fix) {
3075				$fixed[$fixlinenr] =~
3076				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
3077			}
3078		}
3079
3080# Block comment styles
3081# Networking with an initial /*
3082		if ($realfile =~ m@^(drivers/net/|net/)@ &&
3083		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
3084		    $rawline =~ /^\+[ \t]*\*/ &&
3085		    $realline > 2) {
3086			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
3087			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
3088		}
3089
3090# Block comments use * on subsequent lines
3091		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3092		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
3093		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
3094		    $rawline =~ /^\+/ &&			#line is new
3095		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
3096			WARN("BLOCK_COMMENT_STYLE",
3097			     "Block comments use * on subsequent lines\n" . $hereprev);
3098		}
3099
3100# Block comments use */ on trailing lines
3101		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
3102		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
3103		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
3104		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
3105			WARN("BLOCK_COMMENT_STYLE",
3106			     "Block comments use a trailing */ on a separate line\n" . $herecurr);
3107		}
3108
3109# Block comment * alignment
3110		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
3111		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
3112		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
3113		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
3114		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
3115		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
3116			my $oldindent;
3117			$prevrawline =~ m@^\+([ \t]*/?)\*@;
3118			if (defined($1)) {
3119				$oldindent = expand_tabs($1);
3120			} else {
3121				$prevrawline =~ m@^\+(.*/?)\*@;
3122				$oldindent = expand_tabs($1);
3123			}
3124			$rawline =~ m@^\+([ \t]*)\*@;
3125			my $newindent = $1;
3126			$newindent = expand_tabs($newindent);
3127			if (length($oldindent) ne length($newindent)) {
3128				WARN("BLOCK_COMMENT_STYLE",
3129				     "Block comments should align the * on each line\n" . $hereprev);
3130			}
3131		}
3132
3133# check for missing blank lines after struct/union declarations
3134# with exceptions for various attributes and macros
3135		if ($prevline =~ /^[\+ ]};?\s*$/ &&
3136		    $line =~ /^\+/ &&
3137		    !($line =~ /^\+\s*$/ ||
3138		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
3139		      $line =~ /^\+\s*MODULE_/i ||
3140		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
3141		      $line =~ /^\+[a-z_]*init/ ||
3142		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
3143		      $line =~ /^\+\s*DECLARE/ ||
3144		      $line =~ /^\+\s*builtin_[\w_]*driver/ ||
3145		      $line =~ /^\+\s*__setup/)) {
3146			if (CHK("LINE_SPACING",
3147				"Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
3148			    $fix) {
3149				fix_insert_line($fixlinenr, "\+");
3150			}
3151		}
3152
3153# check for multiple consecutive blank lines
3154		if ($prevline =~ /^[\+ ]\s*$/ &&
3155		    $line =~ /^\+\s*$/ &&
3156		    $last_blank_line != ($linenr - 1)) {
3157			if (CHK("LINE_SPACING",
3158				"Please don't use multiple blank lines\n" . $hereprev) &&
3159			    $fix) {
3160				fix_delete_line($fixlinenr, $rawline);
3161			}
3162
3163			$last_blank_line = $linenr;
3164		}
3165
3166# check for missing blank lines after declarations
3167		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
3168			# actual declarations
3169		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3170			# function pointer declarations
3171		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3172			# foo bar; where foo is some local typedef or #define
3173		     $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3174			# known declaration macros
3175		     $prevline =~ /^\+\s+$declaration_macros/) &&
3176			# for "else if" which can look like "$Ident $Ident"
3177		    !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
3178			# other possible extensions of declaration lines
3179		      $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
3180			# not starting a section or a macro "\" extended line
3181		      $prevline =~ /(?:\{\s*|\\)$/) &&
3182			# looks like a declaration
3183		    !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
3184			# function pointer declarations
3185		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3186			# foo bar; where foo is some local typedef or #define
3187		      $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3188			# known declaration macros
3189		      $sline =~ /^\+\s+$declaration_macros/ ||
3190			# start of struct or union or enum
3191		      $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3192			# start or end of block or continuation of declaration
3193		      $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
3194			# bitfield continuation
3195		      $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
3196			# other possible extensions of declaration lines
3197		      $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
3198			# indentation of previous and current line are the same
3199		    (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
3200			if (WARN("LINE_SPACING",
3201				 "Missing a blank line after declarations\n" . $hereprev) &&
3202			    $fix) {
3203				fix_insert_line($fixlinenr, "\+");
3204			}
3205		}
3206
3207# check for spaces at the beginning of a line.
3208# Exceptions:
3209#  1) within comments
3210#  2) indented preprocessor commands
3211#  3) hanging labels
3212		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
3213			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3214			if (WARN("LEADING_SPACE",
3215				 "please, no spaces at the start of a line\n" . $herevet) &&
3216			    $fix) {
3217				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3218			}
3219		}
3220
3221# check we are in a valid C source file if not then ignore this hunk
3222		next if ($realfile !~ /\.(h|c)$/);
3223
3224# check for unusual line ending [ or (
3225		if ($line =~ /^\+.*([\[\(])\s*$/) {
3226			CHK("OPEN_ENDED_LINE",
3227			    "Lines should not end with a '$1'\n" . $herecurr);
3228		}
3229
3230# check if this appears to be the start function declaration, save the name
3231		if ($sline =~ /^\+\{\s*$/ &&
3232		    $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
3233			$context_function = $1;
3234		}
3235
3236# check if this appears to be the end of function declaration
3237		if ($sline =~ /^\+\}\s*$/) {
3238			undef $context_function;
3239		}
3240
3241# check indentation of any line with a bare else
3242# (but not if it is a multiple line "if (foo) return bar; else return baz;")
3243# if the previous line is a break or return and is indented 1 tab more...
3244		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
3245			my $tabs = length($1) + 1;
3246			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
3247			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
3248			     defined $lines[$linenr] &&
3249			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
3250				WARN("UNNECESSARY_ELSE",
3251				     "else is not generally useful after a break or return\n" . $hereprev);
3252			}
3253		}
3254
3255# check indentation of a line with a break;
3256# if the previous line is a goto or return and is indented the same # of tabs
3257		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
3258			my $tabs = $1;
3259			if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
3260				WARN("UNNECESSARY_BREAK",
3261				     "break is not useful after a goto or return\n" . $hereprev);
3262			}
3263		}
3264
3265# check for RCS/CVS revision markers
3266		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
3267			WARN("CVS_KEYWORD",
3268			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
3269		}
3270
3271# check for old HOTPLUG __dev<foo> section markings
3272		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
3273			WARN("HOTPLUG_SECTION",
3274			     "Using $1 is unnecessary\n" . $herecurr);
3275		}
3276
3277# Check for potential 'bare' types
3278		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
3279		    $realline_next);
3280#print "LINE<$line>\n";
3281		if ($linenr > $suppress_statement &&
3282		    $realcnt && $sline =~ /.\s*\S/) {
3283			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3284				ctx_statement_block($linenr, $realcnt, 0);
3285			$stat =~ s/\n./\n /g;
3286			$cond =~ s/\n./\n /g;
3287
3288#print "linenr<$linenr> <$stat>\n";
3289			# If this statement has no statement boundaries within
3290			# it there is no point in retrying a statement scan
3291			# until we hit end of it.
3292			my $frag = $stat; $frag =~ s/;+\s*$//;
3293			if ($frag !~ /(?:{|;)/) {
3294#print "skip<$line_nr_next>\n";
3295				$suppress_statement = $line_nr_next;
3296			}
3297
3298			# Find the real next line.
3299			$realline_next = $line_nr_next;
3300			if (defined $realline_next &&
3301			    (!defined $lines[$realline_next - 1] ||
3302			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
3303				$realline_next++;
3304			}
3305
3306			my $s = $stat;
3307			$s =~ s/{.*$//s;
3308
3309			# Ignore goto labels.
3310			if ($s =~ /$Ident:\*$/s) {
3311
3312			# Ignore functions being called
3313			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
3314
3315			} elsif ($s =~ /^.\s*else\b/s) {
3316
3317			# declarations always start with types
3318			} 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) {
3319				my $type = $1;
3320				$type =~ s/\s+/ /g;
3321				possible($type, "A:" . $s);
3322
3323			# definitions in global scope can only start with types
3324			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
3325				possible($1, "B:" . $s);
3326			}
3327
3328			# any (foo ... *) is a pointer cast, and foo is a type
3329			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
3330				possible($1, "C:" . $s);
3331			}
3332
3333			# Check for any sort of function declaration.
3334			# int foo(something bar, other baz);
3335			# void (*store_gdt)(x86_descr_ptr *);
3336			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
3337				my ($name_len) = length($1);
3338
3339				my $ctx = $s;
3340				substr($ctx, 0, $name_len + 1, '');
3341				$ctx =~ s/\)[^\)]*$//;
3342
3343				for my $arg (split(/\s*,\s*/, $ctx)) {
3344					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
3345
3346						possible($1, "D:" . $s);
3347					}
3348				}
3349			}
3350
3351		}
3352
3353#
3354# Checks which may be anchored in the context.
3355#
3356
3357# Check for switch () and associated case and default
3358# statements should be at the same indent.
3359		if ($line=~/\bswitch\s*\(.*\)/) {
3360			my $err = '';
3361			my $sep = '';
3362			my @ctx = ctx_block_outer($linenr, $realcnt);
3363			shift(@ctx);
3364			for my $ctx (@ctx) {
3365				my ($clen, $cindent) = line_stats($ctx);
3366				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
3367							$indent != $cindent) {
3368					$err .= "$sep$ctx\n";
3369					$sep = '';
3370				} else {
3371					$sep = "[...]\n";
3372				}
3373			}
3374			if ($err ne '') {
3375				ERROR("SWITCH_CASE_INDENT_LEVEL",
3376				      "switch and case should be at the same indent\n$hereline$err");
3377			}
3378		}
3379
3380# if/while/etc brace do not go on next line, unless defining a do while loop,
3381# or if that brace on the next line is for something else
3382		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
3383			my $pre_ctx = "$1$2";
3384
3385			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
3386
3387			if ($line =~ /^\+\t{6,}/) {
3388				WARN("DEEP_INDENTATION",
3389				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
3390			}
3391
3392			my $ctx_cnt = $realcnt - $#ctx - 1;
3393			my $ctx = join("\n", @ctx);
3394
3395			my $ctx_ln = $linenr;
3396			my $ctx_skip = $realcnt;
3397
3398			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
3399					defined $lines[$ctx_ln - 1] &&
3400					$lines[$ctx_ln - 1] =~ /^-/)) {
3401				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
3402				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
3403				$ctx_ln++;
3404			}
3405
3406			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
3407			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
3408
3409			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
3410				ERROR("OPEN_BRACE",
3411				      "that open brace { should be on the previous line\n" .
3412					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3413			}
3414			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
3415			    $ctx =~ /\)\s*\;\s*$/ &&
3416			    defined $lines[$ctx_ln - 1])
3417			{
3418				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
3419				if ($nindent > $indent) {
3420					WARN("TRAILING_SEMICOLON",
3421					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
3422						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
3423				}
3424			}
3425		}
3426
3427# Check relative indent for conditionals and blocks.
3428		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3429			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3430				ctx_statement_block($linenr, $realcnt, 0)
3431					if (!defined $stat);
3432			my ($s, $c) = ($stat, $cond);
3433
3434			substr($s, 0, length($c), '');
3435
3436			# remove inline comments
3437			$s =~ s/$;/ /g;
3438			$c =~ s/$;/ /g;
3439
3440			# Find out how long the conditional actually is.
3441			my @newlines = ($c =~ /\n/gs);
3442			my $cond_lines = 1 + $#newlines;
3443
3444			# Make sure we remove the line prefixes as we have
3445			# none on the first line, and are going to readd them
3446			# where necessary.
3447			$s =~ s/\n./\n/gs;
3448			while ($s =~ /\n\s+\\\n/) {
3449				$cond_lines += $s =~ s/\n\s+\\\n/\n/g;
3450			}
3451
3452			# We want to check the first line inside the block
3453			# starting at the end of the conditional, so remove:
3454			#  1) any blank line termination
3455			#  2) any opening brace { on end of the line
3456			#  3) any do (...) {
3457			my $continuation = 0;
3458			my $check = 0;
3459			$s =~ s/^.*\bdo\b//;
3460			$s =~ s/^\s*{//;
3461			if ($s =~ s/^\s*\\//) {
3462				$continuation = 1;
3463			}
3464			if ($s =~ s/^\s*?\n//) {
3465				$check = 1;
3466				$cond_lines++;
3467			}
3468
3469			# Also ignore a loop construct at the end of a
3470			# preprocessor statement.
3471			if (($prevline =~ /^.\s*#\s*define\s/ ||
3472			    $prevline =~ /\\\s*$/) && $continuation == 0) {
3473				$check = 0;
3474			}
3475
3476			my $cond_ptr = -1;
3477			$continuation = 0;
3478			while ($cond_ptr != $cond_lines) {
3479				$cond_ptr = $cond_lines;
3480
3481				# If we see an #else/#elif then the code
3482				# is not linear.
3483				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
3484					$check = 0;
3485				}
3486
3487				# Ignore:
3488				#  1) blank lines, they should be at 0,
3489				#  2) preprocessor lines, and
3490				#  3) labels.
3491				if ($continuation ||
3492				    $s =~ /^\s*?\n/ ||
3493				    $s =~ /^\s*#\s*?/ ||
3494				    $s =~ /^\s*$Ident\s*:/) {
3495					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
3496					if ($s =~ s/^.*?\n//) {
3497						$cond_lines++;
3498					}
3499				}
3500			}
3501
3502			my (undef, $sindent) = line_stats("+" . $s);
3503			my $stat_real = raw_line($linenr, $cond_lines);
3504
3505			# Check if either of these lines are modified, else
3506			# this is not this patch's fault.
3507			if (!defined($stat_real) ||
3508			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
3509				$check = 0;
3510			}
3511			if (defined($stat_real) && $cond_lines > 1) {
3512				$stat_real = "[...]\n$stat_real";
3513			}
3514
3515			#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";
3516
3517			if ($check && $s ne '' &&
3518			    (($sindent % 8) != 0 ||
3519			     ($sindent < $indent) ||
3520			     ($sindent == $indent &&
3521			      ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
3522			     ($sindent > $indent + 8))) {
3523				WARN("SUSPECT_CODE_INDENT",
3524				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
3525			}
3526		}
3527
3528		# Track the 'values' across context and added lines.
3529		my $opline = $line; $opline =~ s/^./ /;
3530		my ($curr_values, $curr_vars) =
3531				annotate_values($opline . "\n", $prev_values);
3532		$curr_values = $prev_values . $curr_values;
3533		if ($dbg_values) {
3534			my $outline = $opline; $outline =~ s/\t/ /g;
3535			print "$linenr > .$outline\n";
3536			print "$linenr > $curr_values\n";
3537			print "$linenr >  $curr_vars\n";
3538		}
3539		$prev_values = substr($curr_values, -1);
3540
3541#ignore lines not being added
3542		next if ($line =~ /^[^\+]/);
3543
3544# check for dereferences that span multiple lines
3545		if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
3546		    $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
3547			$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
3548			my $ref = $1;
3549			$line =~ /^.\s*($Lval)/;
3550			$ref .= $1;
3551			$ref =~ s/\s//g;
3552			WARN("MULTILINE_DEREFERENCE",
3553			     "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
3554		}
3555
3556# check for declarations of signed or unsigned without int
3557		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
3558			my $type = $1;
3559			my $var = $2;
3560			$var = "" if (!defined $var);
3561			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
3562				my $sign = $1;
3563				my $pointer = $2;
3564
3565				$pointer = "" if (!defined $pointer);
3566
3567				if (WARN("UNSPECIFIED_INT",
3568					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
3569				    $fix) {
3570					my $decl = trim($sign) . " int ";
3571					my $comp_pointer = $pointer;
3572					$comp_pointer =~ s/\s//g;
3573					$decl .= $comp_pointer;
3574					$decl = rtrim($decl) if ($var eq "");
3575					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
3576				}
3577			}
3578		}
3579
3580# TEST: allow direct testing of the type matcher.
3581		if ($dbg_type) {
3582			if ($line =~ /^.\s*$Declare\s*$/) {
3583				ERROR("TEST_TYPE",
3584				      "TEST: is type\n" . $herecurr);
3585			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
3586				ERROR("TEST_NOT_TYPE",
3587				      "TEST: is not type ($1 is)\n". $herecurr);
3588			}
3589			next;
3590		}
3591# TEST: allow direct testing of the attribute matcher.
3592		if ($dbg_attr) {
3593			if ($line =~ /^.\s*$Modifier\s*$/) {
3594				ERROR("TEST_ATTR",
3595				      "TEST: is attr\n" . $herecurr);
3596			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
3597				ERROR("TEST_NOT_ATTR",
3598				      "TEST: is not attr ($1 is)\n". $herecurr);
3599			}
3600			next;
3601		}
3602
3603# check for initialisation to aggregates open brace on the next line
3604		if ($line =~ /^.\s*{/ &&
3605		    $prevline =~ /(?:^|[^=])=\s*$/) {
3606			if (ERROR("OPEN_BRACE",
3607				  "that open brace { should be on the previous line\n" . $hereprev) &&
3608			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3609				fix_delete_line($fixlinenr - 1, $prevrawline);
3610				fix_delete_line($fixlinenr, $rawline);
3611				my $fixedline = $prevrawline;
3612				$fixedline =~ s/\s*=\s*$/ = {/;
3613				fix_insert_line($fixlinenr, $fixedline);
3614				$fixedline = $line;
3615				$fixedline =~ s/^(.\s*)\{\s*/$1/;
3616				fix_insert_line($fixlinenr, $fixedline);
3617			}
3618		}
3619
3620#
3621# Checks which are anchored on the added line.
3622#
3623
3624# check for malformed paths in #include statements (uses RAW line)
3625		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
3626			my $path = $1;
3627			if ($path =~ m{//}) {
3628				ERROR("MALFORMED_INCLUDE",
3629				      "malformed #include filename\n" . $herecurr);
3630			}
3631			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
3632				ERROR("UAPI_INCLUDE",
3633				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
3634			}
3635		}
3636
3637# no C99 // comments
3638		if ($line =~ m{//}) {
3639			if (ERROR("C99_COMMENTS",
3640				  "do not use C99 // comments\n" . $herecurr) &&
3641			    $fix) {
3642				my $line = $fixed[$fixlinenr];
3643				if ($line =~ /\/\/(.*)$/) {
3644					my $comment = trim($1);
3645					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3646				}
3647			}
3648		}
3649		# Remove C99 comments.
3650		$line =~ s@//.*@@;
3651		$opline =~ s@//.*@@;
3652
3653# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
3654# the whole statement.
3655#print "APW <$lines[$realline_next - 1]>\n";
3656		if (defined $realline_next &&
3657		    exists $lines[$realline_next - 1] &&
3658		    !defined $suppress_export{$realline_next} &&
3659		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3660		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3661			# Handle definitions which produce identifiers with
3662			# a prefix:
3663			#   XXX(foo);
3664			#   EXPORT_SYMBOL(something_foo);
3665			my $name = $1;
3666			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3667			    $name =~ /^${Ident}_$2/) {
3668#print "FOO C name<$name>\n";
3669				$suppress_export{$realline_next} = 1;
3670
3671			} elsif ($stat !~ /(?:
3672				\n.}\s*$|
3673				^.DEFINE_$Ident\(\Q$name\E\)|
3674				^.DECLARE_$Ident\(\Q$name\E\)|
3675				^.LIST_HEAD\(\Q$name\E\)|
3676				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
3677				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
3678			    )/x) {
3679#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
3680				$suppress_export{$realline_next} = 2;
3681			} else {
3682				$suppress_export{$realline_next} = 1;
3683			}
3684		}
3685		if (!defined $suppress_export{$linenr} &&
3686		    $prevline =~ /^.\s*$/ &&
3687		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3688		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3689#print "FOO B <$lines[$linenr - 1]>\n";
3690			$suppress_export{$linenr} = 2;
3691		}
3692		if (defined $suppress_export{$linenr} &&
3693		    $suppress_export{$linenr} == 2) {
3694			WARN("EXPORT_SYMBOL",
3695			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
3696		}
3697
3698# check for global initialisers.
3699		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
3700			if (ERROR("GLOBAL_INITIALISERS",
3701				  "do not initialise globals to $1\n" . $herecurr) &&
3702			    $fix) {
3703				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
3704			}
3705		}
3706# check for static initialisers.
3707		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
3708			if (ERROR("INITIALISED_STATIC",
3709				  "do not initialise statics to $1\n" .
3710				      $herecurr) &&
3711			    $fix) {
3712				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
3713			}
3714		}
3715
3716# check for misordered declarations of char/short/int/long with signed/unsigned
3717		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
3718			my $tmp = trim($1);
3719			WARN("MISORDERED_TYPE",
3720			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
3721		}
3722
3723# check for static const char * arrays.
3724		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
3725			WARN("STATIC_CONST_CHAR_ARRAY",
3726			     "static const char * array should probably be static const char * const\n" .
3727				$herecurr);
3728               }
3729
3730# check for static char foo[] = "bar" declarations.
3731		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
3732			WARN("STATIC_CONST_CHAR_ARRAY",
3733			     "static char array declaration should probably be static const char\n" .
3734				$herecurr);
3735               }
3736
3737# check for const <foo> const where <foo> is not a pointer or array type
3738		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
3739			my $found = $1;
3740			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
3741				WARN("CONST_CONST",
3742				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
3743			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
3744				WARN("CONST_CONST",
3745				     "'const $found const' should probably be 'const $found'\n" . $herecurr);
3746			}
3747		}
3748
3749# check for non-global char *foo[] = {"bar", ...} declarations.
3750		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
3751			WARN("STATIC_CONST_CHAR_ARRAY",
3752			     "char * array declaration might be better as static const\n" .
3753				$herecurr);
3754               }
3755
3756# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
3757		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
3758			my $array = $1;
3759			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
3760				my $array_div = $1;
3761				if (WARN("ARRAY_SIZE",
3762					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
3763				    $fix) {
3764					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
3765				}
3766			}
3767		}
3768
3769# check for function declarations without arguments like "int foo()"
3770		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
3771			if (ERROR("FUNCTION_WITHOUT_ARGS",
3772				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
3773			    $fix) {
3774				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
3775			}
3776		}
3777
3778# check for new typedefs, only function parameters and sparse annotations
3779# make sense.
3780		if ($line =~ /\btypedef\s/ &&
3781		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
3782		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
3783		    $line !~ /\b$typeTypedefs\b/ &&
3784		    $line !~ /\b__bitwise\b/) {
3785			WARN("NEW_TYPEDEFS",
3786			     "do not add new typedefs\n" . $herecurr);
3787		}
3788
3789# * goes on variable not on type
3790		# (char*[ const])
3791		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
3792			#print "AA<$1>\n";
3793			my ($ident, $from, $to) = ($1, $2, $2);
3794
3795			# Should start with a space.
3796			$to =~ s/^(\S)/ $1/;
3797			# Should not end with a space.
3798			$to =~ s/\s+$//;
3799			# '*'s should not have spaces between.
3800			while ($to =~ s/\*\s+\*/\*\*/) {
3801			}
3802
3803##			print "1: from<$from> to<$to> ident<$ident>\n";
3804			if ($from ne $to) {
3805				if (ERROR("POINTER_LOCATION",
3806					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
3807				    $fix) {
3808					my $sub_from = $ident;
3809					my $sub_to = $ident;
3810					$sub_to =~ s/\Q$from\E/$to/;
3811					$fixed[$fixlinenr] =~
3812					    s@\Q$sub_from\E@$sub_to@;
3813				}
3814			}
3815		}
3816		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
3817			#print "BB<$1>\n";
3818			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
3819
3820			# Should start with a space.
3821			$to =~ s/^(\S)/ $1/;
3822			# Should not end with a space.
3823			$to =~ s/\s+$//;
3824			# '*'s should not have spaces between.
3825			while ($to =~ s/\*\s+\*/\*\*/) {
3826			}
3827			# Modifiers should have spaces.
3828			$to =~ s/(\b$Modifier$)/$1 /;
3829
3830##			print "2: from<$from> to<$to> ident<$ident>\n";
3831			if ($from ne $to && $ident !~ /^$Modifier$/) {
3832				if (ERROR("POINTER_LOCATION",
3833					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
3834				    $fix) {
3835
3836					my $sub_from = $match;
3837					my $sub_to = $match;
3838					$sub_to =~ s/\Q$from\E/$to/;
3839					$fixed[$fixlinenr] =~
3840					    s@\Q$sub_from\E@$sub_to@;
3841				}
3842			}
3843		}
3844
3845# avoid BUG() or BUG_ON()
3846		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
3847			my $msg_level = \&WARN;
3848			$msg_level = \&CHK if ($file);
3849			&{$msg_level}("AVOID_BUG",
3850				      "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
3851		}
3852
3853# avoid LINUX_VERSION_CODE
3854		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
3855			WARN("LINUX_VERSION_CODE",
3856			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
3857		}
3858
3859# check for uses of printk_ratelimit
3860		if ($line =~ /\bprintk_ratelimit\s*\(/) {
3861			WARN("PRINTK_RATELIMITED",
3862			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
3863		}
3864
3865# printk should use KERN_* levels
3866		if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
3867			WARN("PRINTK_WITHOUT_KERN_LEVEL",
3868			     "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
3869		}
3870
3871		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3872			my $orig = $1;
3873			my $level = lc($orig);
3874			$level = "warn" if ($level eq "warning");
3875			my $level2 = $level;
3876			$level2 = "dbg" if ($level eq "debug");
3877			WARN("PREFER_PR_LEVEL",
3878			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
3879		}
3880
3881		if ($line =~ /\bpr_warning\s*\(/) {
3882			if (WARN("PREFER_PR_LEVEL",
3883				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
3884			    $fix) {
3885				$fixed[$fixlinenr] =~
3886				    s/\bpr_warning\b/pr_warn/;
3887			}
3888		}
3889
3890		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3891			my $orig = $1;
3892			my $level = lc($orig);
3893			$level = "warn" if ($level eq "warning");
3894			$level = "dbg" if ($level eq "debug");
3895			WARN("PREFER_DEV_LEVEL",
3896			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3897		}
3898
3899# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
3900# number of false positives, but assembly files are not checked, so at
3901# least the arch entry code will not trigger this warning.
3902		if ($line =~ /\bENOSYS\b/) {
3903			WARN("ENOSYS",
3904			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
3905		}
3906
3907# function brace can't be on same line, except for #defines of do while,
3908# or if closed on same line
3909		if ($^V && $^V ge 5.10.0 &&
3910		    $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
3911		    $sline !~ /\#\s*define\b.*do\s*\{/ &&
3912		    $sline !~ /}/) {
3913			if (ERROR("OPEN_BRACE",
3914				  "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
3915			    $fix) {
3916				fix_delete_line($fixlinenr, $rawline);
3917				my $fixed_line = $rawline;
3918				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
3919				my $line1 = $1;
3920				my $line2 = $2;
3921				fix_insert_line($fixlinenr, ltrim($line1));
3922				fix_insert_line($fixlinenr, "\+{");
3923				if ($line2 !~ /^\s*$/) {
3924					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
3925				}
3926			}
3927		}
3928
3929# open braces for enum, union and struct go on the same line.
3930		if ($line =~ /^.\s*{/ &&
3931		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
3932			if (ERROR("OPEN_BRACE",
3933				  "open brace '{' following $1 go on the same line\n" . $hereprev) &&
3934			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3935				fix_delete_line($fixlinenr - 1, $prevrawline);
3936				fix_delete_line($fixlinenr, $rawline);
3937				my $fixedline = rtrim($prevrawline) . " {";
3938				fix_insert_line($fixlinenr, $fixedline);
3939				$fixedline = $rawline;
3940				$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
3941				if ($fixedline !~ /^\+\s*$/) {
3942					fix_insert_line($fixlinenr, $fixedline);
3943				}
3944			}
3945		}
3946
3947# missing space after union, struct or enum definition
3948		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
3949			if (WARN("SPACING",
3950				 "missing space after $1 definition\n" . $herecurr) &&
3951			    $fix) {
3952				$fixed[$fixlinenr] =~
3953				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
3954			}
3955		}
3956
3957# Function pointer declarations
3958# check spacing between type, funcptr, and args
3959# canonical declaration is "type (*funcptr)(args...)"
3960		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
3961			my $declare = $1;
3962			my $pre_pointer_space = $2;
3963			my $post_pointer_space = $3;
3964			my $funcname = $4;
3965			my $post_funcname_space = $5;
3966			my $pre_args_space = $6;
3967
3968# the $Declare variable will capture all spaces after the type
3969# so check it for a missing trailing missing space but pointer return types
3970# don't need a space so don't warn for those.
3971			my $post_declare_space = "";
3972			if ($declare =~ /(\s+)$/) {
3973				$post_declare_space = $1;
3974				$declare = rtrim($declare);
3975			}
3976			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
3977				WARN("SPACING",
3978				     "missing space after return type\n" . $herecurr);
3979				$post_declare_space = " ";
3980			}
3981
3982# unnecessary space "type  (*funcptr)(args...)"
3983# This test is not currently implemented because these declarations are
3984# equivalent to
3985#	int  foo(int bar, ...)
3986# and this is form shouldn't/doesn't generate a checkpatch warning.
3987#
3988#			elsif ($declare =~ /\s{2,}$/) {
3989#				WARN("SPACING",
3990#				     "Multiple spaces after return type\n" . $herecurr);
3991#			}
3992
3993# unnecessary space "type ( *funcptr)(args...)"
3994			if (defined $pre_pointer_space &&
3995			    $pre_pointer_space =~ /^\s/) {
3996				WARN("SPACING",
3997				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3998			}
3999
4000# unnecessary space "type (* funcptr)(args...)"
4001			if (defined $post_pointer_space &&
4002			    $post_pointer_space =~ /^\s/) {
4003				WARN("SPACING",
4004				     "Unnecessary space before function pointer name\n" . $herecurr);
4005			}
4006
4007# unnecessary space "type (*funcptr )(args...)"
4008			if (defined $post_funcname_space &&
4009			    $post_funcname_space =~ /^\s/) {
4010				WARN("SPACING",
4011				     "Unnecessary space after function pointer name\n" . $herecurr);
4012			}
4013
4014# unnecessary space "type (*funcptr) (args...)"
4015			if (defined $pre_args_space &&
4016			    $pre_args_space =~ /^\s/) {
4017				WARN("SPACING",
4018				     "Unnecessary space before function pointer arguments\n" . $herecurr);
4019			}
4020
4021			if (show_type("SPACING") && $fix) {
4022				$fixed[$fixlinenr] =~
4023				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
4024			}
4025		}
4026
4027# check for spacing round square brackets; allowed:
4028#  1. with a type on the left -- int [] a;
4029#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
4030#  3. inside a curly brace -- = { [0...10] = 5 }
4031		while ($line =~ /(.*?\s)\[/g) {
4032			my ($where, $prefix) = ($-[1], $1);
4033			if ($prefix !~ /$Type\s+$/ &&
4034			    ($where != 0 || $prefix !~ /^.\s+$/) &&
4035			    $prefix !~ /[{,]\s+$/) {
4036				if (ERROR("BRACKET_SPACE",
4037					  "space prohibited before open square bracket '['\n" . $herecurr) &&
4038				    $fix) {
4039				    $fixed[$fixlinenr] =~
4040					s/^(\+.*?)\s+\[/$1\[/;
4041				}
4042			}
4043		}
4044
4045# check for spaces between functions and their parentheses.
4046		while ($line =~ /($Ident)\s+\(/g) {
4047			my $name = $1;
4048			my $ctx_before = substr($line, 0, $-[1]);
4049			my $ctx = "$ctx_before$name";
4050
4051			# Ignore those directives where spaces _are_ permitted.
4052			if ($name =~ /^(?:
4053				if|for|while|switch|return|case|
4054				volatile|__volatile__|
4055				__attribute__|format|__extension__|
4056				asm|__asm__)$/x)
4057			{
4058			# cpp #define statements have non-optional spaces, ie
4059			# if there is a space between the name and the open
4060			# parenthesis it is simply not a parameter group.
4061			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
4062
4063			# cpp #elif statement condition may start with a (
4064			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
4065
4066			# If this whole things ends with a type its most
4067			# likely a typedef for a function.
4068			} elsif ($ctx =~ /$Type$/) {
4069
4070			} else {
4071				if (WARN("SPACING",
4072					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
4073					     $fix) {
4074					$fixed[$fixlinenr] =~
4075					    s/\b$name\s+\(/$name\(/;
4076				}
4077			}
4078		}
4079
4080# Check operator spacing.
4081		if (!($line=~/\#\s*include/)) {
4082			my $fixed_line = "";
4083			my $line_fixed = 0;
4084
4085			my $ops = qr{
4086				<<=|>>=|<=|>=|==|!=|
4087				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
4088				=>|->|<<|>>|<|>|=|!|~|
4089				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
4090				\?:|\?|:
4091			}x;
4092			my @elements = split(/($ops|;)/, $opline);
4093
4094##			print("element count: <" . $#elements . ">\n");
4095##			foreach my $el (@elements) {
4096##				print("el: <$el>\n");
4097##			}
4098
4099			my @fix_elements = ();
4100			my $off = 0;
4101
4102			foreach my $el (@elements) {
4103				push(@fix_elements, substr($rawline, $off, length($el)));
4104				$off += length($el);
4105			}
4106
4107			$off = 0;
4108
4109			my $blank = copy_spacing($opline);
4110			my $last_after = -1;
4111
4112			for (my $n = 0; $n < $#elements; $n += 2) {
4113
4114				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
4115
4116##				print("n: <$n> good: <$good>\n");
4117
4118				$off += length($elements[$n]);
4119
4120				# Pick up the preceding and succeeding characters.
4121				my $ca = substr($opline, 0, $off);
4122				my $cc = '';
4123				if (length($opline) >= ($off + length($elements[$n + 1]))) {
4124					$cc = substr($opline, $off + length($elements[$n + 1]));
4125				}
4126				my $cb = "$ca$;$cc";
4127
4128				my $a = '';
4129				$a = 'V' if ($elements[$n] ne '');
4130				$a = 'W' if ($elements[$n] =~ /\s$/);
4131				$a = 'C' if ($elements[$n] =~ /$;$/);
4132				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
4133				$a = 'O' if ($elements[$n] eq '');
4134				$a = 'E' if ($ca =~ /^\s*$/);
4135
4136				my $op = $elements[$n + 1];
4137
4138				my $c = '';
4139				if (defined $elements[$n + 2]) {
4140					$c = 'V' if ($elements[$n + 2] ne '');
4141					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
4142					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
4143					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
4144					$c = 'O' if ($elements[$n + 2] eq '');
4145					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4146				} else {
4147					$c = 'E';
4148				}
4149
4150				my $ctx = "${a}x${c}";
4151
4152				my $at = "(ctx:$ctx)";
4153
4154				my $ptr = substr($blank, 0, $off) . "^";
4155				my $hereptr = "$hereline$ptr\n";
4156
4157				# Pull out the value of this operator.
4158				my $op_type = substr($curr_values, $off + 1, 1);
4159
4160				# Get the full operator variant.
4161				my $opv = $op . substr($curr_vars, $off, 1);
4162
4163				# Ignore operators passed as parameters.
4164				if ($op_type ne 'V' &&
4165				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
4166
4167#				# Ignore comments
4168#				} elsif ($op =~ /^$;+$/) {
4169
4170				# ; should have either the end of line or a space or \ after it
4171				} elsif ($op eq ';') {
4172					if ($ctx !~ /.x[WEBC]/ &&
4173					    $cc !~ /^\\/ && $cc !~ /^;/) {
4174						if (ERROR("SPACING",
4175							  "space required after that '$op' $at\n" . $hereptr)) {
4176							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
4177							$line_fixed = 1;
4178						}
4179					}
4180
4181				# // is a comment
4182				} elsif ($op eq '//') {
4183
4184				#   :   when part of a bitfield
4185				} elsif ($opv eq ':B') {
4186					# skip the bitfield test for now
4187
4188				# No spaces for:
4189				#   ->
4190				} elsif ($op eq '->') {
4191					if ($ctx =~ /Wx.|.xW/) {
4192						if (ERROR("SPACING",
4193							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
4194							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4195							if (defined $fix_elements[$n + 2]) {
4196								$fix_elements[$n + 2] =~ s/^\s+//;
4197							}
4198							$line_fixed = 1;
4199						}
4200					}
4201
4202				# , must not have a space before and must have a space on the right.
4203				} elsif ($op eq ',') {
4204					my $rtrim_before = 0;
4205					my $space_after = 0;
4206					if ($ctx =~ /Wx./) {
4207						if (ERROR("SPACING",
4208							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4209							$line_fixed = 1;
4210							$rtrim_before = 1;
4211						}
4212					}
4213					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
4214						if (ERROR("SPACING",
4215							  "space required after that '$op' $at\n" . $hereptr)) {
4216							$line_fixed = 1;
4217							$last_after = $n;
4218							$space_after = 1;
4219						}
4220					}
4221					if ($rtrim_before || $space_after) {
4222						if ($rtrim_before) {
4223							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4224						} else {
4225							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4226						}
4227						if ($space_after) {
4228							$good .= " ";
4229						}
4230					}
4231
4232				# '*' as part of a type definition -- reported already.
4233				} elsif ($opv eq '*_') {
4234					#warn "'*' is part of type\n";
4235
4236				# unary operators should have a space before and
4237				# none after.  May be left adjacent to another
4238				# unary operator, or a cast
4239				} elsif ($op eq '!' || $op eq '~' ||
4240					 $opv eq '*U' || $opv eq '-U' ||
4241					 $opv eq '&U' || $opv eq '&&U') {
4242					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
4243						if (ERROR("SPACING",
4244							  "space required before that '$op' $at\n" . $hereptr)) {
4245							if ($n != $last_after + 2) {
4246								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
4247								$line_fixed = 1;
4248							}
4249						}
4250					}
4251					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
4252						# A unary '*' may be const
4253
4254					} elsif ($ctx =~ /.xW/) {
4255						if (ERROR("SPACING",
4256							  "space prohibited after that '$op' $at\n" . $hereptr)) {
4257							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
4258							if (defined $fix_elements[$n + 2]) {
4259								$fix_elements[$n + 2] =~ s/^\s+//;
4260							}
4261							$line_fixed = 1;
4262						}
4263					}
4264
4265				# unary ++ and unary -- are allowed no space on one side.
4266				} elsif ($op eq '++' or $op eq '--') {
4267					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
4268						if (ERROR("SPACING",
4269							  "space required one side of that '$op' $at\n" . $hereptr)) {
4270							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
4271							$line_fixed = 1;
4272						}
4273					}
4274					if ($ctx =~ /Wx[BE]/ ||
4275					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
4276						if (ERROR("SPACING",
4277							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4278							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4279							$line_fixed = 1;
4280						}
4281					}
4282					if ($ctx =~ /ExW/) {
4283						if (ERROR("SPACING",
4284							  "space prohibited after that '$op' $at\n" . $hereptr)) {
4285							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4286							if (defined $fix_elements[$n + 2]) {
4287								$fix_elements[$n + 2] =~ s/^\s+//;
4288							}
4289							$line_fixed = 1;
4290						}
4291					}
4292
4293				# << and >> may either have or not have spaces both sides
4294				} elsif ($op eq '<<' or $op eq '>>' or
4295					 $op eq '&' or $op eq '^' or $op eq '|' or
4296					 $op eq '+' or $op eq '-' or
4297					 $op eq '*' or $op eq '/' or
4298					 $op eq '%')
4299				{
4300					if ($check) {
4301						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
4302							if (CHK("SPACING",
4303								"spaces preferred around that '$op' $at\n" . $hereptr)) {
4304								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4305								$fix_elements[$n + 2] =~ s/^\s+//;
4306								$line_fixed = 1;
4307							}
4308						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
4309							if (CHK("SPACING",
4310								"space preferred before that '$op' $at\n" . $hereptr)) {
4311								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
4312								$line_fixed = 1;
4313							}
4314						}
4315					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
4316						if (ERROR("SPACING",
4317							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
4318							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4319							if (defined $fix_elements[$n + 2]) {
4320								$fix_elements[$n + 2] =~ s/^\s+//;
4321							}
4322							$line_fixed = 1;
4323						}
4324					}
4325
4326				# A colon needs no spaces before when it is
4327				# terminating a case value or a label.
4328				} elsif ($opv eq ':C' || $opv eq ':L') {
4329					if ($ctx =~ /Wx./) {
4330						if (ERROR("SPACING",
4331							  "space prohibited before that '$op' $at\n" . $hereptr)) {
4332							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4333							$line_fixed = 1;
4334						}
4335					}
4336
4337				# All the others need spaces both sides.
4338				} elsif ($ctx !~ /[EWC]x[CWE]/) {
4339					my $ok = 0;
4340
4341					# Ignore email addresses <foo@bar>
4342					if (($op eq '<' &&
4343					     $cc =~ /^\S+\@\S+>/) ||
4344					    ($op eq '>' &&
4345					     $ca =~ /<\S+\@\S+$/))
4346					{
4347					    	$ok = 1;
4348					}
4349
4350					# for asm volatile statements
4351					# ignore a colon with another
4352					# colon immediately before or after
4353					if (($op eq ':') &&
4354					    ($ca =~ /:$/ || $cc =~ /^:/)) {
4355						$ok = 1;
4356					}
4357
4358					# messages are ERROR, but ?: are CHK
4359					if ($ok == 0) {
4360						my $msg_level = \&ERROR;
4361						$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
4362
4363						if (&{$msg_level}("SPACING",
4364								  "spaces required around that '$op' $at\n" . $hereptr)) {
4365							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4366							if (defined $fix_elements[$n + 2]) {
4367								$fix_elements[$n + 2] =~ s/^\s+//;
4368							}
4369							$line_fixed = 1;
4370						}
4371					}
4372				}
4373				$off += length($elements[$n + 1]);
4374
4375##				print("n: <$n> GOOD: <$good>\n");
4376
4377				$fixed_line = $fixed_line . $good;
4378			}
4379
4380			if (($#elements % 2) == 0) {
4381				$fixed_line = $fixed_line . $fix_elements[$#elements];
4382			}
4383
4384			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
4385				$fixed[$fixlinenr] = $fixed_line;
4386			}
4387
4388
4389		}
4390
4391# check for whitespace before a non-naked semicolon
4392		if ($line =~ /^\+.*\S\s+;\s*$/) {
4393			if (WARN("SPACING",
4394				 "space prohibited before semicolon\n" . $herecurr) &&
4395			    $fix) {
4396				1 while $fixed[$fixlinenr] =~
4397				    s/^(\+.*\S)\s+;/$1;/;
4398			}
4399		}
4400
4401# check for multiple assignments
4402		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
4403			CHK("MULTIPLE_ASSIGNMENTS",
4404			    "multiple assignments should be avoided\n" . $herecurr);
4405		}
4406
4407## # check for multiple declarations, allowing for a function declaration
4408## # continuation.
4409## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
4410## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
4411##
4412## 			# Remove any bracketed sections to ensure we do not
4413## 			# falsly report the parameters of functions.
4414## 			my $ln = $line;
4415## 			while ($ln =~ s/\([^\(\)]*\)//g) {
4416## 			}
4417## 			if ($ln =~ /,/) {
4418## 				WARN("MULTIPLE_DECLARATION",
4419##				     "declaring multiple variables together should be avoided\n" . $herecurr);
4420## 			}
4421## 		}
4422
4423#need space before brace following if, while, etc
4424		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
4425		    $line =~ /do\{/) {
4426			if (ERROR("SPACING",
4427				  "space required before the open brace '{'\n" . $herecurr) &&
4428			    $fix) {
4429				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\)))\{/$1 {/;
4430			}
4431		}
4432
4433## # check for blank lines before declarations
4434##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
4435##		    $prevrawline =~ /^.\s*$/) {
4436##			WARN("SPACING",
4437##			     "No blank lines before declarations\n" . $hereprev);
4438##		}
4439##
4440
4441# closing brace should have a space following it when it has anything
4442# on the line
4443		if ($line =~ /}(?!(?:,|;|\)))\S/) {
4444			if (ERROR("SPACING",
4445				  "space required after that close brace '}'\n" . $herecurr) &&
4446			    $fix) {
4447				$fixed[$fixlinenr] =~
4448				    s/}((?!(?:,|;|\)))\S)/} $1/;
4449			}
4450		}
4451
4452# check spacing on square brackets
4453		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
4454			if (ERROR("SPACING",
4455				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
4456			    $fix) {
4457				$fixed[$fixlinenr] =~
4458				    s/\[\s+/\[/;
4459			}
4460		}
4461		if ($line =~ /\s\]/) {
4462			if (ERROR("SPACING",
4463				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
4464			    $fix) {
4465				$fixed[$fixlinenr] =~
4466				    s/\s+\]/\]/;
4467			}
4468		}
4469
4470# check spacing on parentheses
4471		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
4472		    $line !~ /for\s*\(\s+;/) {
4473			if (ERROR("SPACING",
4474				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
4475			    $fix) {
4476				$fixed[$fixlinenr] =~
4477				    s/\(\s+/\(/;
4478			}
4479		}
4480		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
4481		    $line !~ /for\s*\(.*;\s+\)/ &&
4482		    $line !~ /:\s+\)/) {
4483			if (ERROR("SPACING",
4484				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
4485			    $fix) {
4486				$fixed[$fixlinenr] =~
4487				    s/\s+\)/\)/;
4488			}
4489		}
4490
4491# check unnecessary parentheses around addressof/dereference single $Lvals
4492# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
4493
4494		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
4495			my $var = $1;
4496			if (CHK("UNNECESSARY_PARENTHESES",
4497				"Unnecessary parentheses around $var\n" . $herecurr) &&
4498			    $fix) {
4499				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
4500			}
4501		}
4502
4503# check for unnecessary parentheses around function pointer uses
4504# ie: (foo->bar)(); should be foo->bar();
4505# but not "if (foo->bar) (" to avoid some false positives
4506		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
4507			my $var = $2;
4508			if (CHK("UNNECESSARY_PARENTHESES",
4509				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
4510			    $fix) {
4511				my $var2 = deparenthesize($var);
4512				$var2 =~ s/\s//g;
4513				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
4514			}
4515		}
4516
4517# check for unnecessary parentheses around comparisons in if uses
4518# when !drivers/staging or command-line uses --strict
4519		if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
4520		    $^V && $^V ge 5.10.0 && defined($stat) &&
4521		    $stat =~ /(^.\s*if\s*($balanced_parens))/) {
4522			my $if_stat = $1;
4523			my $test = substr($2, 1, -1);
4524			my $herectx;
4525			while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
4526				my $match = $1;
4527				# avoid parentheses around potential macro args
4528				next if ($match =~ /^\s*\w+\s*$/);
4529				if (!defined($herectx)) {
4530					$herectx = $here . "\n";
4531					my $cnt = statement_rawlines($if_stat);
4532					for (my $n = 0; $n < $cnt; $n++) {
4533						my $rl = raw_line($linenr, $n);
4534						$herectx .=  $rl . "\n";
4535						last if $rl =~ /^[ \+].*\{/;
4536					}
4537				}
4538				CHK("UNNECESSARY_PARENTHESES",
4539				    "Unnecessary parentheses around '$match'\n" . $herectx);
4540			}
4541		}
4542
4543#goto labels aren't indented, allow a single space however
4544		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
4545		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
4546			if (WARN("INDENTED_LABEL",
4547				 "labels should not be indented\n" . $herecurr) &&
4548			    $fix) {
4549				$fixed[$fixlinenr] =~
4550				    s/^(.)\s+/$1/;
4551			}
4552		}
4553
4554# return is not a function
4555		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
4556			my $spacing = $1;
4557			if ($^V && $^V ge 5.10.0 &&
4558			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
4559				my $value = $1;
4560				$value = deparenthesize($value);
4561				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
4562					ERROR("RETURN_PARENTHESES",
4563					      "return is not a function, parentheses are not required\n" . $herecurr);
4564				}
4565			} elsif ($spacing !~ /\s+/) {
4566				ERROR("SPACING",
4567				      "space required before the open parenthesis '('\n" . $herecurr);
4568			}
4569		}
4570
4571# unnecessary return in a void function
4572# at end-of-function, with the previous line a single leading tab, then return;
4573# and the line before that not a goto label target like "out:"
4574		if ($sline =~ /^[ \+]}\s*$/ &&
4575		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
4576		    $linenr >= 3 &&
4577		    $lines[$linenr - 3] =~ /^[ +]/ &&
4578		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
4579			WARN("RETURN_VOID",
4580			     "void function return statements are not generally useful\n" . $hereprev);
4581               }
4582
4583# if statements using unnecessary parentheses - ie: if ((foo == bar))
4584		if ($^V && $^V ge 5.10.0 &&
4585		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
4586			my $openparens = $1;
4587			my $count = $openparens =~ tr@\(@\(@;
4588			my $msg = "";
4589			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
4590				my $comp = $4;	#Not $1 because of $LvalOrFunc
4591				$msg = " - maybe == should be = ?" if ($comp eq "==");
4592				WARN("UNNECESSARY_PARENTHESES",
4593				     "Unnecessary parentheses$msg\n" . $herecurr);
4594			}
4595		}
4596
4597# comparisons with a constant or upper case identifier on the left
4598#	avoid cases like "foo + BAR < baz"
4599#	only fix matches surrounded by parentheses to avoid incorrect
4600#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
4601		if ($^V && $^V ge 5.10.0 &&
4602		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
4603			my $lead = $1;
4604			my $const = $2;
4605			my $comp = $3;
4606			my $to = $4;
4607			my $newcomp = $comp;
4608			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
4609			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
4610			    WARN("CONSTANT_COMPARISON",
4611				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
4612			    $fix) {
4613				if ($comp eq "<") {
4614					$newcomp = ">";
4615				} elsif ($comp eq "<=") {
4616					$newcomp = ">=";
4617				} elsif ($comp eq ">") {
4618					$newcomp = "<";
4619				} elsif ($comp eq ">=") {
4620					$newcomp = "<=";
4621				}
4622				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
4623			}
4624		}
4625
4626# Return of what appears to be an errno should normally be negative
4627		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
4628			my $name = $1;
4629			if ($name ne 'EOF' && $name ne 'ERROR') {
4630				WARN("USE_NEGATIVE_ERRNO",
4631				     "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
4632			}
4633		}
4634
4635# Need a space before open parenthesis after if, while etc
4636		if ($line =~ /\b(if|while|for|switch)\(/) {
4637			if (ERROR("SPACING",
4638				  "space required before the open parenthesis '('\n" . $herecurr) &&
4639			    $fix) {
4640				$fixed[$fixlinenr] =~
4641				    s/\b(if|while|for|switch)\(/$1 \(/;
4642			}
4643		}
4644
4645# Check for illegal assignment in if conditional -- and check for trailing
4646# statements after the conditional.
4647		if ($line =~ /do\s*(?!{)/) {
4648			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4649				ctx_statement_block($linenr, $realcnt, 0)
4650					if (!defined $stat);
4651			my ($stat_next) = ctx_statement_block($line_nr_next,
4652						$remain_next, $off_next);
4653			$stat_next =~ s/\n./\n /g;
4654			##print "stat<$stat> stat_next<$stat_next>\n";
4655
4656			if ($stat_next =~ /^\s*while\b/) {
4657				# If the statement carries leading newlines,
4658				# then count those as offsets.
4659				my ($whitespace) =
4660					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
4661				my $offset =
4662					statement_rawlines($whitespace) - 1;
4663
4664				$suppress_whiletrailers{$line_nr_next +
4665								$offset} = 1;
4666			}
4667		}
4668		if (!defined $suppress_whiletrailers{$linenr} &&
4669		    defined($stat) && defined($cond) &&
4670		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
4671			my ($s, $c) = ($stat, $cond);
4672
4673			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
4674				ERROR("ASSIGN_IN_IF",
4675				      "do not use assignment in if condition\n" . $herecurr);
4676			}
4677
4678			# Find out what is on the end of the line after the
4679			# conditional.
4680			substr($s, 0, length($c), '');
4681			$s =~ s/\n.*//g;
4682			$s =~ s/$;//g; 	# Remove any comments
4683			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
4684			    $c !~ /}\s*while\s*/)
4685			{
4686				# Find out how long the conditional actually is.
4687				my @newlines = ($c =~ /\n/gs);
4688				my $cond_lines = 1 + $#newlines;
4689				my $stat_real = '';
4690
4691				$stat_real = raw_line($linenr, $cond_lines)
4692							. "\n" if ($cond_lines);
4693				if (defined($stat_real) && $cond_lines > 1) {
4694					$stat_real = "[...]\n$stat_real";
4695				}
4696
4697				ERROR("TRAILING_STATEMENTS",
4698				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
4699			}
4700		}
4701
4702# Check for bitwise tests written as boolean
4703		if ($line =~ /
4704			(?:
4705				(?:\[|\(|\&\&|\|\|)
4706				\s*0[xX][0-9]+\s*
4707				(?:\&\&|\|\|)
4708			|
4709				(?:\&\&|\|\|)
4710				\s*0[xX][0-9]+\s*
4711				(?:\&\&|\|\||\)|\])
4712			)/x)
4713		{
4714			WARN("HEXADECIMAL_BOOLEAN_TEST",
4715			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
4716		}
4717
4718# if and else should not have general statements after it
4719		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
4720			my $s = $1;
4721			$s =~ s/$;//g; 	# Remove any comments
4722			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
4723				ERROR("TRAILING_STATEMENTS",
4724				      "trailing statements should be on next line\n" . $herecurr);
4725			}
4726		}
4727# if should not continue a brace
4728		if ($line =~ /}\s*if\b/) {
4729			ERROR("TRAILING_STATEMENTS",
4730			      "trailing statements should be on next line (or did you mean 'else if'?)\n" .
4731				$herecurr);
4732		}
4733# case and default should not have general statements after them
4734		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
4735		    $line !~ /\G(?:
4736			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
4737			\s*return\s+
4738		    )/xg)
4739		{
4740			ERROR("TRAILING_STATEMENTS",
4741			      "trailing statements should be on next line\n" . $herecurr);
4742		}
4743
4744		# Check for }<nl>else {, these must be at the same
4745		# indent level to be relevant to each other.
4746		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
4747		    $previndent == $indent) {
4748			if (ERROR("ELSE_AFTER_BRACE",
4749				  "else should follow close brace '}'\n" . $hereprev) &&
4750			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4751				fix_delete_line($fixlinenr - 1, $prevrawline);
4752				fix_delete_line($fixlinenr, $rawline);
4753				my $fixedline = $prevrawline;
4754				$fixedline =~ s/}\s*$//;
4755				if ($fixedline !~ /^\+\s*$/) {
4756					fix_insert_line($fixlinenr, $fixedline);
4757				}
4758				$fixedline = $rawline;
4759				$fixedline =~ s/^(.\s*)else/$1} else/;
4760				fix_insert_line($fixlinenr, $fixedline);
4761			}
4762		}
4763
4764		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
4765		    $previndent == $indent) {
4766			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
4767
4768			# Find out what is on the end of the line after the
4769			# conditional.
4770			substr($s, 0, length($c), '');
4771			$s =~ s/\n.*//g;
4772
4773			if ($s =~ /^\s*;/) {
4774				if (ERROR("WHILE_AFTER_BRACE",
4775					  "while 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					my $trailing = $rawline;
4781					$trailing =~ s/^\+//;
4782					$trailing = trim($trailing);
4783					$fixedline =~ s/}\s*$/} $trailing/;
4784					fix_insert_line($fixlinenr, $fixedline);
4785				}
4786			}
4787		}
4788
4789#Specific variable tests
4790		while ($line =~ m{($Constant|$Lval)}g) {
4791			my $var = $1;
4792
4793#gcc binary extension
4794			if ($var =~ /^$Binary$/) {
4795				if (WARN("GCC_BINARY_CONSTANT",
4796					 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
4797				    $fix) {
4798					my $hexval = sprintf("0x%x", oct($var));
4799					$fixed[$fixlinenr] =~
4800					    s/\b$var\b/$hexval/;
4801				}
4802			}
4803
4804#CamelCase
4805			if ($var !~ /^$Constant$/ &&
4806			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
4807#Ignore Page<foo> variants
4808			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
4809#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
4810			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
4811#Ignore some three character SI units explicitly, like MiB and KHz
4812			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
4813				while ($var =~ m{($Ident)}g) {
4814					my $word = $1;
4815					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
4816					if ($check) {
4817						seed_camelcase_includes();
4818						if (!$file && !$camelcase_file_seeded) {
4819							seed_camelcase_file($realfile);
4820							$camelcase_file_seeded = 1;
4821						}
4822					}
4823					if (!defined $camelcase{$word}) {
4824						$camelcase{$word} = 1;
4825						CHK("CAMELCASE",
4826						    "Avoid CamelCase: <$word>\n" . $herecurr);
4827					}
4828				}
4829			}
4830		}
4831
4832#no spaces allowed after \ in define
4833		if ($line =~ /\#\s*define.*\\\s+$/) {
4834			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
4835				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
4836			    $fix) {
4837				$fixed[$fixlinenr] =~ s/\s+$//;
4838			}
4839		}
4840
4841# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
4842# itself <asm/foo.h> (uses RAW line)
4843		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
4844			my $file = "$1.h";
4845			my $checkfile = "include/linux/$file";
4846			if (-f "$root/$checkfile" &&
4847			    $realfile ne $checkfile &&
4848			    $1 !~ /$allowed_asm_includes/)
4849			{
4850				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
4851				if ($asminclude > 0) {
4852					if ($realfile =~ m{^arch/}) {
4853						CHK("ARCH_INCLUDE_LINUX",
4854						    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4855					} else {
4856						WARN("INCLUDE_LINUX",
4857						     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4858					}
4859				}
4860			}
4861		}
4862
4863# multi-statement macros should be enclosed in a do while loop, grab the
4864# first statement and ensure its the whole macro if its not enclosed
4865# in a known good container
4866		if ($realfile !~ m@/vmlinux.lds.h$@ &&
4867		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
4868			my $ln = $linenr;
4869			my $cnt = $realcnt;
4870			my ($off, $dstat, $dcond, $rest);
4871			my $ctx = '';
4872			my $has_flow_statement = 0;
4873			my $has_arg_concat = 0;
4874			($dstat, $dcond, $ln, $cnt, $off) =
4875				ctx_statement_block($linenr, $realcnt, 0);
4876			$ctx = $dstat;
4877			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
4878			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
4879
4880			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
4881			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
4882
4883			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
4884			my $define_args = $1;
4885			my $define_stmt = $dstat;
4886			my @def_args = ();
4887
4888			if (defined $define_args && $define_args ne "") {
4889				$define_args = substr($define_args, 1, length($define_args) - 2);
4890				$define_args =~ s/\s*//g;
4891				@def_args = split(",", $define_args);
4892			}
4893
4894			$dstat =~ s/$;//g;
4895			$dstat =~ s/\\\n.//g;
4896			$dstat =~ s/^\s*//s;
4897			$dstat =~ s/\s*$//s;
4898
4899			# Flatten any parentheses and braces
4900			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
4901			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
4902			       $dstat =~ s/.\[[^\[\]]*\]/1/)
4903			{
4904			}
4905
4906			# Flatten any obvious string concatentation.
4907			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
4908			       $dstat =~ s/$Ident\s*($String)/$1/)
4909			{
4910			}
4911
4912			# Make asm volatile uses seem like a generic function
4913			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
4914
4915			my $exceptions = qr{
4916				$Declare|
4917				module_param_named|
4918				MODULE_PARM_DESC|
4919				DECLARE_PER_CPU|
4920				DEFINE_PER_CPU|
4921				__typeof__\(|
4922				union|
4923				struct|
4924				\.$Ident\s*=\s*|
4925				^\"|\"$|
4926				^\[
4927			}x;
4928			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
4929
4930			$ctx =~ s/\n*$//;
4931			my $herectx = $here . "\n";
4932			my $stmt_cnt = statement_rawlines($ctx);
4933
4934			for (my $n = 0; $n < $stmt_cnt; $n++) {
4935				$herectx .= raw_line($linenr, $n) . "\n";
4936			}
4937
4938			if ($dstat ne '' &&
4939			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
4940			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
4941			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
4942			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
4943			    $dstat !~ /$exceptions/ &&
4944			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
4945			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
4946			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
4947			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
4948			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
4949			    $dstat !~ /^do\s*{/ &&					# do {...
4950			    $dstat !~ /^\(\{/ &&						# ({...
4951			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
4952			{
4953				if ($dstat =~ /^\s*if\b/) {
4954					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4955					      "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
4956				} elsif ($dstat =~ /;/) {
4957					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4958					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
4959				} else {
4960					ERROR("COMPLEX_MACRO",
4961					      "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
4962				}
4963
4964			}
4965
4966			# Make $define_stmt single line, comment-free, etc
4967			my @stmt_array = split('\n', $define_stmt);
4968			my $first = 1;
4969			$define_stmt = "";
4970			foreach my $l (@stmt_array) {
4971				$l =~ s/\\$//;
4972				if ($first) {
4973					$define_stmt = $l;
4974					$first = 0;
4975				} elsif ($l =~ /^[\+ ]/) {
4976					$define_stmt .= substr($l, 1);
4977				}
4978			}
4979			$define_stmt =~ s/$;//g;
4980			$define_stmt =~ s/\s+/ /g;
4981			$define_stmt = trim($define_stmt);
4982
4983# check if any macro arguments are reused (ignore '...' and 'type')
4984			foreach my $arg (@def_args) {
4985			        next if ($arg =~ /\.\.\./);
4986			        next if ($arg =~ /^type$/i);
4987				my $tmp_stmt = $define_stmt;
4988				$tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
4989				$tmp_stmt =~ s/\#+\s*$arg\b//g;
4990				$tmp_stmt =~ s/\b$arg\s*\#\#//g;
4991				my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g;
4992				if ($use_cnt > 1) {
4993					CHK("MACRO_ARG_REUSE",
4994					    "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
4995				    }
4996# check if any macro arguments may have other precedence issues
4997				if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
4998				    ((defined($1) && $1 ne ',') ||
4999				     (defined($2) && $2 ne ','))) {
5000					CHK("MACRO_ARG_PRECEDENCE",
5001					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
5002				}
5003			}
5004
5005# check for macros with flow control, but without ## concatenation
5006# ## concatenation is commonly a macro that defines a function so ignore those
5007			if ($has_flow_statement && !$has_arg_concat) {
5008				my $herectx = $here . "\n";
5009				my $cnt = statement_rawlines($ctx);
5010
5011				for (my $n = 0; $n < $cnt; $n++) {
5012					$herectx .= raw_line($linenr, $n) . "\n";
5013				}
5014				WARN("MACRO_WITH_FLOW_CONTROL",
5015				     "Macros with flow control statements should be avoided\n" . "$herectx");
5016			}
5017
5018# check for line continuations outside of #defines, preprocessor #, and asm
5019
5020		} else {
5021			if ($prevline !~ /^..*\\$/ &&
5022			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
5023			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
5024			    $line =~ /^\+.*\\$/) {
5025				WARN("LINE_CONTINUATIONS",
5026				     "Avoid unnecessary line continuations\n" . $herecurr);
5027			}
5028		}
5029
5030# do {} while (0) macro tests:
5031# single-statement macros do not need to be enclosed in do while (0) loop,
5032# macro should not end with a semicolon
5033		if ($^V && $^V ge 5.10.0 &&
5034		    $realfile !~ m@/vmlinux.lds.h$@ &&
5035		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
5036			my $ln = $linenr;
5037			my $cnt = $realcnt;
5038			my ($off, $dstat, $dcond, $rest);
5039			my $ctx = '';
5040			($dstat, $dcond, $ln, $cnt, $off) =
5041				ctx_statement_block($linenr, $realcnt, 0);
5042			$ctx = $dstat;
5043
5044			$dstat =~ s/\\\n.//g;
5045			$dstat =~ s/$;/ /g;
5046
5047			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
5048				my $stmts = $2;
5049				my $semis = $3;
5050
5051				$ctx =~ s/\n*$//;
5052				my $cnt = statement_rawlines($ctx);
5053				my $herectx = $here . "\n";
5054
5055				for (my $n = 0; $n < $cnt; $n++) {
5056					$herectx .= raw_line($linenr, $n) . "\n";
5057				}
5058
5059				if (($stmts =~ tr/;/;/) == 1 &&
5060				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
5061					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
5062					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
5063				}
5064				if (defined $semis && $semis ne "") {
5065					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
5066					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
5067				}
5068			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
5069				$ctx =~ s/\n*$//;
5070				my $cnt = statement_rawlines($ctx);
5071				my $herectx = $here . "\n";
5072
5073				for (my $n = 0; $n < $cnt; $n++) {
5074					$herectx .= raw_line($linenr, $n) . "\n";
5075				}
5076
5077				WARN("TRAILING_SEMICOLON",
5078				     "macros should not use a trailing semicolon\n" . "$herectx");
5079			}
5080		}
5081
5082# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
5083# all assignments may have only one of the following with an assignment:
5084#	.
5085#	ALIGN(...)
5086#	VMLINUX_SYMBOL(...)
5087		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
5088			WARN("MISSING_VMLINUX_SYMBOL",
5089			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
5090		}
5091
5092# check for redundant bracing round if etc
5093		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
5094			my ($level, $endln, @chunks) =
5095				ctx_statement_full($linenr, $realcnt, 1);
5096			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
5097			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
5098			if ($#chunks > 0 && $level == 0) {
5099				my @allowed = ();
5100				my $allow = 0;
5101				my $seen = 0;
5102				my $herectx = $here . "\n";
5103				my $ln = $linenr - 1;
5104				for my $chunk (@chunks) {
5105					my ($cond, $block) = @{$chunk};
5106
5107					# If the condition carries leading newlines, then count those as offsets.
5108					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
5109					my $offset = statement_rawlines($whitespace) - 1;
5110
5111					$allowed[$allow] = 0;
5112					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
5113
5114					# We have looked at and allowed this specific line.
5115					$suppress_ifbraces{$ln + $offset} = 1;
5116
5117					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
5118					$ln += statement_rawlines($block) - 1;
5119
5120					substr($block, 0, length($cond), '');
5121
5122					$seen++ if ($block =~ /^\s*{/);
5123
5124					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
5125					if (statement_lines($cond) > 1) {
5126						#print "APW: ALLOWED: cond<$cond>\n";
5127						$allowed[$allow] = 1;
5128					}
5129					if ($block =~/\b(?:if|for|while)\b/) {
5130						#print "APW: ALLOWED: block<$block>\n";
5131						$allowed[$allow] = 1;
5132					}
5133					if (statement_block_size($block) > 1) {
5134						#print "APW: ALLOWED: lines block<$block>\n";
5135						$allowed[$allow] = 1;
5136					}
5137					$allow++;
5138				}
5139				if ($seen) {
5140					my $sum_allowed = 0;
5141					foreach (@allowed) {
5142						$sum_allowed += $_;
5143					}
5144					if ($sum_allowed == 0) {
5145						WARN("BRACES",
5146						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
5147					} elsif ($sum_allowed != $allow &&
5148						 $seen != $allow) {
5149						CHK("BRACES",
5150						    "braces {} should be used on all arms of this statement\n" . $herectx);
5151					}
5152				}
5153			}
5154		}
5155		if (!defined $suppress_ifbraces{$linenr - 1} &&
5156					$line =~ /\b(if|while|for|else)\b/) {
5157			my $allowed = 0;
5158
5159			# Check the pre-context.
5160			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
5161				#print "APW: ALLOWED: pre<$1>\n";
5162				$allowed = 1;
5163			}
5164
5165			my ($level, $endln, @chunks) =
5166				ctx_statement_full($linenr, $realcnt, $-[0]);
5167
5168			# Check the condition.
5169			my ($cond, $block) = @{$chunks[0]};
5170			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
5171			if (defined $cond) {
5172				substr($block, 0, length($cond), '');
5173			}
5174			if (statement_lines($cond) > 1) {
5175				#print "APW: ALLOWED: cond<$cond>\n";
5176				$allowed = 1;
5177			}
5178			if ($block =~/\b(?:if|for|while)\b/) {
5179				#print "APW: ALLOWED: block<$block>\n";
5180				$allowed = 1;
5181			}
5182			if (statement_block_size($block) > 1) {
5183				#print "APW: ALLOWED: lines block<$block>\n";
5184				$allowed = 1;
5185			}
5186			# Check the post-context.
5187			if (defined $chunks[1]) {
5188				my ($cond, $block) = @{$chunks[1]};
5189				if (defined $cond) {
5190					substr($block, 0, length($cond), '');
5191				}
5192				if ($block =~ /^\s*\{/) {
5193					#print "APW: ALLOWED: chunk-1 block<$block>\n";
5194					$allowed = 1;
5195				}
5196			}
5197			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
5198				my $herectx = $here . "\n";
5199				my $cnt = statement_rawlines($block);
5200
5201				for (my $n = 0; $n < $cnt; $n++) {
5202					$herectx .= raw_line($linenr, $n) . "\n";
5203				}
5204
5205				WARN("BRACES",
5206				     "braces {} are not necessary for single statement blocks\n" . $herectx);
5207			}
5208		}
5209
5210# check for single line unbalanced braces
5211		if ($sline =~ /^.\s*\}\s*else\s*$/ ||
5212		    $sline =~ /^.\s*else\s*\{\s*$/) {
5213			CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
5214		}
5215
5216# check for unnecessary blank lines around braces
5217		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
5218			if (CHK("BRACES",
5219				"Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
5220			    $fix && $prevrawline =~ /^\+/) {
5221				fix_delete_line($fixlinenr - 1, $prevrawline);
5222			}
5223		}
5224		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
5225			if (CHK("BRACES",
5226				"Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
5227			    $fix) {
5228				fix_delete_line($fixlinenr, $rawline);
5229			}
5230		}
5231
5232# no volatiles please
5233		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
5234		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
5235			WARN("VOLATILE",
5236			     "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
5237		}
5238
5239# Check for user-visible strings broken across lines, which breaks the ability
5240# to grep for the string.  Make exceptions when the previous string ends in a
5241# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
5242# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
5243		if ($line =~ /^\+\s*$String/ &&
5244		    $prevline =~ /"\s*$/ &&
5245		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
5246			if (WARN("SPLIT_STRING",
5247				 "quoted string split across lines\n" . $hereprev) &&
5248				     $fix &&
5249				     $prevrawline =~ /^\+.*"\s*$/ &&
5250				     $last_coalesced_string_linenr != $linenr - 1) {
5251				my $extracted_string = get_quoted_string($line, $rawline);
5252				my $comma_close = "";
5253				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
5254					$comma_close = $1;
5255				}
5256
5257				fix_delete_line($fixlinenr - 1, $prevrawline);
5258				fix_delete_line($fixlinenr, $rawline);
5259				my $fixedline = $prevrawline;
5260				$fixedline =~ s/"\s*$//;
5261				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
5262				fix_insert_line($fixlinenr - 1, $fixedline);
5263				$fixedline = $rawline;
5264				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
5265				if ($fixedline !~ /\+\s*$/) {
5266					fix_insert_line($fixlinenr, $fixedline);
5267				}
5268				$last_coalesced_string_linenr = $linenr;
5269			}
5270		}
5271
5272# check for missing a space in a string concatenation
5273		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
5274			WARN('MISSING_SPACE',
5275			     "break quoted strings at a space character\n" . $hereprev);
5276		}
5277
5278# check for an embedded function name in a string when the function is known
5279# This does not work very well for -f --file checking as it depends on patch
5280# context providing the function name or a single line form for in-file
5281# function declarations
5282		if ($line =~ /^\+.*$String/ &&
5283		    defined($context_function) &&
5284		    get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
5285		    length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
5286			WARN("EMBEDDED_FUNCTION_NAME",
5287			     "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
5288		}
5289
5290# check for spaces before a quoted newline
5291		if ($rawline =~ /^.*\".*\s\\n/) {
5292			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
5293				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
5294			    $fix) {
5295				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
5296			}
5297
5298		}
5299
5300# concatenated string without spaces between elements
5301		if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
5302			CHK("CONCATENATED_STRING",
5303			    "Concatenated strings should use spaces between elements\n" . $herecurr);
5304		}
5305
5306# uncoalesced string fragments
5307		if ($line =~ /$String\s*"/) {
5308			WARN("STRING_FRAGMENTS",
5309			     "Consecutive strings are generally better as a single string\n" . $herecurr);
5310		}
5311
5312# check for non-standard and hex prefixed decimal printf formats
5313		my $show_L = 1;	#don't show the same defect twice
5314		my $show_Z = 1;
5315		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
5316			my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5317			$string =~ s/%%/__/g;
5318			# check for %L
5319			if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5320				WARN("PRINTF_L",
5321				     "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
5322				$show_L = 0;
5323			}
5324			# check for %Z
5325			if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
5326				WARN("PRINTF_Z",
5327				     "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
5328				$show_Z = 0;
5329			}
5330			# check for 0x<decimal>
5331			if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
5332				ERROR("PRINTF_0XDECIMAL",
5333				      "Prefixing 0x with decimal output is defective\n" . $herecurr);
5334			}
5335		}
5336
5337# check for line continuations in quoted strings with odd counts of "
5338		if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5339			WARN("LINE_CONTINUATIONS",
5340			     "Avoid line continuations in quoted strings\n" . $herecurr);
5341		}
5342
5343# warn about #if 0
5344		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
5345			CHK("REDUNDANT_CODE",
5346			    "if this code is redundant consider removing it\n" .
5347				$herecurr);
5348		}
5349
5350# check for needless "if (<foo>) fn(<foo>)" uses
5351		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
5352			my $tested = quotemeta($1);
5353			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
5354			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
5355				my $func = $1;
5356				if (WARN('NEEDLESS_IF',
5357					 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
5358				    $fix) {
5359					my $do_fix = 1;
5360					my $leading_tabs = "";
5361					my $new_leading_tabs = "";
5362					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
5363						$leading_tabs = $1;
5364					} else {
5365						$do_fix = 0;
5366					}
5367					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
5368						$new_leading_tabs = $1;
5369						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
5370							$do_fix = 0;
5371						}
5372					} else {
5373						$do_fix = 0;
5374					}
5375					if ($do_fix) {
5376						fix_delete_line($fixlinenr - 1, $prevrawline);
5377						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
5378					}
5379				}
5380			}
5381		}
5382
5383# check for unnecessary "Out of Memory" messages
5384		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
5385		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
5386		    (defined $1 || defined $3) &&
5387		    $linenr > 3) {
5388			my $testval = $2;
5389			my $testline = $lines[$linenr - 3];
5390
5391			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
5392#			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
5393
5394			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)/) {
5395				WARN("OOM_MESSAGE",
5396				     "Possible unnecessary 'out of memory' message\n" . $hereprev);
5397			}
5398		}
5399
5400# check for logging functions with KERN_<LEVEL>
5401		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
5402		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
5403			my $level = $1;
5404			if (WARN("UNNECESSARY_KERN_LEVEL",
5405				 "Possible unnecessary $level\n" . $herecurr) &&
5406			    $fix) {
5407				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
5408			}
5409		}
5410
5411# check for logging continuations
5412		if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
5413			WARN("LOGGING_CONTINUATION",
5414			     "Avoid logging continuation uses where feasible\n" . $herecurr);
5415		}
5416
5417# check for mask then right shift without a parentheses
5418		if ($^V && $^V ge 5.10.0 &&
5419		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
5420		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
5421			WARN("MASK_THEN_SHIFT",
5422			     "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
5423		}
5424
5425# check for pointer comparisons to NULL
5426		if ($^V && $^V ge 5.10.0) {
5427			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
5428				my $val = $1;
5429				my $equal = "!";
5430				$equal = "" if ($4 eq "!=");
5431				if (CHK("COMPARISON_TO_NULL",
5432					"Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
5433					    $fix) {
5434					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
5435				}
5436			}
5437		}
5438
5439# check for bad placement of section $InitAttribute (e.g.: __initdata)
5440		if ($line =~ /(\b$InitAttribute\b)/) {
5441			my $attr = $1;
5442			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
5443				my $ptr = $1;
5444				my $var = $2;
5445				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
5446				      ERROR("MISPLACED_INIT",
5447					    "$attr should be placed after $var\n" . $herecurr)) ||
5448				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
5449				      WARN("MISPLACED_INIT",
5450					   "$attr should be placed after $var\n" . $herecurr))) &&
5451				    $fix) {
5452					$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;
5453				}
5454			}
5455		}
5456
5457# check for $InitAttributeData (ie: __initdata) with const
5458		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
5459			my $attr = $1;
5460			$attr =~ /($InitAttributePrefix)(.*)/;
5461			my $attr_prefix = $1;
5462			my $attr_type = $2;
5463			if (ERROR("INIT_ATTRIBUTE",
5464				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
5465			    $fix) {
5466				$fixed[$fixlinenr] =~
5467				    s/$InitAttributeData/${attr_prefix}initconst/;
5468			}
5469		}
5470
5471# check for $InitAttributeConst (ie: __initconst) without const
5472		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
5473			my $attr = $1;
5474			if (ERROR("INIT_ATTRIBUTE",
5475				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
5476			    $fix) {
5477				my $lead = $fixed[$fixlinenr] =~
5478				    /(^\+\s*(?:static\s+))/;
5479				$lead = rtrim($1);
5480				$lead = "$lead " if ($lead !~ /^\+$/);
5481				$lead = "${lead}const ";
5482				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
5483			}
5484		}
5485
5486# check for __read_mostly with const non-pointer (should just be const)
5487		if ($line =~ /\b__read_mostly\b/ &&
5488		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
5489			if (ERROR("CONST_READ_MOSTLY",
5490				  "Invalid use of __read_mostly with const type\n" . $herecurr) &&
5491			    $fix) {
5492				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
5493			}
5494		}
5495
5496# don't use __constant_<foo> functions outside of include/uapi/
5497		if ($realfile !~ m@^include/uapi/@ &&
5498		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
5499			my $constant_func = $1;
5500			my $func = $constant_func;
5501			$func =~ s/^__constant_//;
5502			if (WARN("CONSTANT_CONVERSION",
5503				 "$constant_func should be $func\n" . $herecurr) &&
5504			    $fix) {
5505				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
5506			}
5507		}
5508
5509# prefer usleep_range over udelay
5510		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
5511			my $delay = $1;
5512			# ignore udelay's < 10, however
5513			if (! ($delay < 10) ) {
5514				CHK("USLEEP_RANGE",
5515				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
5516			}
5517			if ($delay > 2000) {
5518				WARN("LONG_UDELAY",
5519				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
5520			}
5521		}
5522
5523# warn about unexpectedly long msleep's
5524		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5525			if ($1 < 20) {
5526				WARN("MSLEEP",
5527				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
5528			}
5529		}
5530
5531# check for comparisons of jiffies
5532		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
5533			WARN("JIFFIES_COMPARISON",
5534			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
5535		}
5536
5537# check for comparisons of get_jiffies_64()
5538		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
5539			WARN("JIFFIES_COMPARISON",
5540			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
5541		}
5542
5543# warn about #ifdefs in C files
5544#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
5545#			print "#ifdef in C files should be avoided\n";
5546#			print "$herecurr";
5547#			$clean = 0;
5548#		}
5549
5550# warn about spacing in #ifdefs
5551		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
5552			if (ERROR("SPACING",
5553				  "exactly one space required after that #$1\n" . $herecurr) &&
5554			    $fix) {
5555				$fixed[$fixlinenr] =~
5556				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
5557			}
5558
5559		}
5560
5561# check for spinlock_t definitions without a comment.
5562		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
5563		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
5564			my $which = $1;
5565			if (!ctx_has_comment($first_line, $linenr)) {
5566				CHK("UNCOMMENTED_DEFINITION",
5567				    "$1 definition without comment\n" . $herecurr);
5568			}
5569		}
5570# check for memory barriers without a comment.
5571
5572		my $barriers = qr{
5573			mb|
5574			rmb|
5575			wmb|
5576			read_barrier_depends
5577		}x;
5578		my $barrier_stems = qr{
5579			mb__before_atomic|
5580			mb__after_atomic|
5581			store_release|
5582			load_acquire|
5583			store_mb|
5584			(?:$barriers)
5585		}x;
5586		my $all_barriers = qr{
5587			(?:$barriers)|
5588			smp_(?:$barrier_stems)|
5589			virt_(?:$barrier_stems)
5590		}x;
5591
5592		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
5593			if (!ctx_has_comment($first_line, $linenr)) {
5594				WARN("MEMORY_BARRIER",
5595				     "memory barrier without comment\n" . $herecurr);
5596			}
5597		}
5598
5599		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
5600
5601		if ($realfile !~ m@^include/asm-generic/@ &&
5602		    $realfile !~ m@/barrier\.h$@ &&
5603		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
5604		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
5605			WARN("MEMORY_BARRIER",
5606			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
5607		}
5608
5609# check for waitqueue_active without a comment.
5610		if ($line =~ /\bwaitqueue_active\s*\(/) {
5611			if (!ctx_has_comment($first_line, $linenr)) {
5612				WARN("WAITQUEUE_ACTIVE",
5613				     "waitqueue_active without comment\n" . $herecurr);
5614			}
5615		}
5616
5617# check for smp_read_barrier_depends and read_barrier_depends
5618		if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) {
5619			WARN("READ_BARRIER_DEPENDS",
5620			     "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr);
5621		}
5622
5623# check of hardware specific defines
5624		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
5625			CHK("ARCH_DEFINES",
5626			    "architecture specific defines should be avoided\n" .  $herecurr);
5627		}
5628
5629# check that the storage class is not after a type
5630		if ($line =~ /\b($Type)\s+($Storage)\b/) {
5631			WARN("STORAGE_CLASS",
5632			     "storage class '$2' should be located before type '$1'\n" . $herecurr);
5633		}
5634# Check that the storage class is at the beginning of a declaration
5635		if ($line =~ /\b$Storage\b/ &&
5636		    $line !~ /^.\s*$Storage/ &&
5637		    $line =~ /^.\s*(.+?)\$Storage\s/ &&
5638		    $1 !~ /[\,\)]\s*$/) {
5639			WARN("STORAGE_CLASS",
5640			     "storage class should be at the beginning of the declaration\n" . $herecurr);
5641		}
5642
5643# check the location of the inline attribute, that it is between
5644# storage class and type.
5645		if ($line =~ /\b$Type\s+$Inline\b/ ||
5646		    $line =~ /\b$Inline\s+$Storage\b/) {
5647			ERROR("INLINE_LOCATION",
5648			      "inline keyword should sit between storage class and type\n" . $herecurr);
5649		}
5650
5651# Check for __inline__ and __inline, prefer inline
5652		if ($realfile !~ m@\binclude/uapi/@ &&
5653		    $line =~ /\b(__inline__|__inline)\b/) {
5654			if (WARN("INLINE",
5655				 "plain inline is preferred over $1\n" . $herecurr) &&
5656			    $fix) {
5657				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
5658
5659			}
5660		}
5661
5662# Check for __attribute__ packed, prefer __packed
5663		if ($realfile !~ m@\binclude/uapi/@ &&
5664		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
5665			WARN("PREFER_PACKED",
5666			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
5667		}
5668
5669# Check for __attribute__ aligned, prefer __aligned
5670		if ($realfile !~ m@\binclude/uapi/@ &&
5671		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
5672			WARN("PREFER_ALIGNED",
5673			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
5674		}
5675
5676# Check for __attribute__ format(printf, prefer __printf
5677		if ($realfile !~ m@\binclude/uapi/@ &&
5678		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
5679			if (WARN("PREFER_PRINTF",
5680				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
5681			    $fix) {
5682				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
5683
5684			}
5685		}
5686
5687# Check for __attribute__ format(scanf, prefer __scanf
5688		if ($realfile !~ m@\binclude/uapi/@ &&
5689		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
5690			if (WARN("PREFER_SCANF",
5691				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
5692			    $fix) {
5693				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
5694			}
5695		}
5696
5697# Check for __attribute__ weak, or __weak declarations (may have link issues)
5698		if ($^V && $^V ge 5.10.0 &&
5699		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
5700		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
5701		     $line =~ /\b__weak\b/)) {
5702			ERROR("WEAK_DECLARATION",
5703			      "Using weak declarations can have unintended link defects\n" . $herecurr);
5704		}
5705
5706# check for c99 types like uint8_t used outside of uapi/ and tools/
5707		if ($realfile !~ m@\binclude/uapi/@ &&
5708		    $realfile !~ m@\btools/@ &&
5709		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
5710			my $type = $1;
5711			if ($type =~ /\b($typeC99Typedefs)\b/) {
5712				$type = $1;
5713				my $kernel_type = 'u';
5714				$kernel_type = 's' if ($type =~ /^_*[si]/);
5715				$type =~ /(\d+)/;
5716				$kernel_type .= $1;
5717				if (CHK("PREFER_KERNEL_TYPES",
5718					"Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
5719				    $fix) {
5720					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
5721				}
5722			}
5723		}
5724
5725# check for cast of C90 native int or longer types constants
5726		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
5727			my $cast = $1;
5728			my $const = $2;
5729			if (WARN("TYPECAST_INT_CONSTANT",
5730				 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
5731			    $fix) {
5732				my $suffix = "";
5733				my $newconst = $const;
5734				$newconst =~ s/${Int_type}$//;
5735				$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
5736				if ($cast =~ /\blong\s+long\b/) {
5737					$suffix .= 'LL';
5738				} elsif ($cast =~ /\blong\b/) {
5739					$suffix .= 'L';
5740				}
5741				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
5742			}
5743		}
5744
5745# check for sizeof(&)
5746		if ($line =~ /\bsizeof\s*\(\s*\&/) {
5747			WARN("SIZEOF_ADDRESS",
5748			     "sizeof(& should be avoided\n" . $herecurr);
5749		}
5750
5751# check for sizeof without parenthesis
5752		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
5753			if (WARN("SIZEOF_PARENTHESIS",
5754				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
5755			    $fix) {
5756				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
5757			}
5758		}
5759
5760# check for struct spinlock declarations
5761		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
5762			WARN("USE_SPINLOCK_T",
5763			     "struct spinlock should be spinlock_t\n" . $herecurr);
5764		}
5765
5766# check for seq_printf uses that could be seq_puts
5767		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
5768			my $fmt = get_quoted_string($line, $rawline);
5769			$fmt =~ s/%%//g;
5770			if ($fmt !~ /%/) {
5771				if (WARN("PREFER_SEQ_PUTS",
5772					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
5773				    $fix) {
5774					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
5775				}
5776			}
5777		}
5778
5779		# check for vsprintf extension %p<foo> misuses
5780		if ($^V && $^V ge 5.10.0 &&
5781		    defined $stat &&
5782		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
5783		    $1 !~ /^_*volatile_*$/) {
5784			my $bad_extension = "";
5785			my $lc = $stat =~ tr@\n@@;
5786			$lc = $lc + $linenr;
5787		        for (my $count = $linenr; $count <= $lc; $count++) {
5788				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
5789				$fmt =~ s/%%//g;
5790				if ($fmt =~ /(\%[\*\d\.]*p(?![\WSsBKRraEhMmIiUDdgVCbGNOx]).)/) {
5791					$bad_extension = $1;
5792					last;
5793				}
5794			}
5795			if ($bad_extension ne "") {
5796				my $stat_real = raw_line($linenr, 0);
5797				my $ext_type = "Invalid";
5798				my $use = "";
5799				for (my $count = $linenr + 1; $count <= $lc; $count++) {
5800					$stat_real = $stat_real . "\n" . raw_line($count, 0);
5801				}
5802				if ($bad_extension =~ /p[Ff]/) {
5803					$ext_type = "Deprecated";
5804					$use = " - use %pS instead";
5805					$use =~ s/pS/ps/ if ($bad_extension =~ /pf/);
5806				}
5807				WARN("VSPRINTF_POINTER_EXTENSION",
5808				     "$ext_type vsprintf pointer extension '$bad_extension'$use\n" . "$here\n$stat_real\n");
5809			}
5810		}
5811
5812# Check for misused memsets
5813		if ($^V && $^V ge 5.10.0 &&
5814		    defined $stat &&
5815		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
5816
5817			my $ms_addr = $2;
5818			my $ms_val = $7;
5819			my $ms_size = $12;
5820
5821			if ($ms_size =~ /^(0x|)0$/i) {
5822				ERROR("MEMSET",
5823				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
5824			} elsif ($ms_size =~ /^(0x|)1$/i) {
5825				WARN("MEMSET",
5826				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
5827			}
5828		}
5829
5830# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
5831#		if ($^V && $^V ge 5.10.0 &&
5832#		    defined $stat &&
5833#		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5834#			if (WARN("PREFER_ETHER_ADDR_COPY",
5835#				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
5836#			    $fix) {
5837#				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
5838#			}
5839#		}
5840
5841# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
5842#		if ($^V && $^V ge 5.10.0 &&
5843#		    defined $stat &&
5844#		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5845#			WARN("PREFER_ETHER_ADDR_EQUAL",
5846#			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
5847#		}
5848
5849# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
5850# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
5851#		if ($^V && $^V ge 5.10.0 &&
5852#		    defined $stat &&
5853#		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5854#
5855#			my $ms_val = $7;
5856#
5857#			if ($ms_val =~ /^(?:0x|)0+$/i) {
5858#				if (WARN("PREFER_ETH_ZERO_ADDR",
5859#					 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
5860#				    $fix) {
5861#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
5862#				}
5863#			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
5864#				if (WARN("PREFER_ETH_BROADCAST_ADDR",
5865#					 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
5866#				    $fix) {
5867#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
5868#				}
5869#			}
5870#		}
5871
5872# typecasts on min/max could be min_t/max_t
5873		if ($^V && $^V ge 5.10.0 &&
5874		    defined $stat &&
5875		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
5876			if (defined $2 || defined $7) {
5877				my $call = $1;
5878				my $cast1 = deparenthesize($2);
5879				my $arg1 = $3;
5880				my $cast2 = deparenthesize($7);
5881				my $arg2 = $8;
5882				my $cast;
5883
5884				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
5885					$cast = "$cast1 or $cast2";
5886				} elsif ($cast1 ne "") {
5887					$cast = $cast1;
5888				} else {
5889					$cast = $cast2;
5890				}
5891				WARN("MINMAX",
5892				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
5893			}
5894		}
5895
5896# check usleep_range arguments
5897		if ($^V && $^V ge 5.10.0 &&
5898		    defined $stat &&
5899		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
5900			my $min = $1;
5901			my $max = $7;
5902			if ($min eq $max) {
5903				WARN("USLEEP_RANGE",
5904				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5905			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
5906				 $min > $max) {
5907				WARN("USLEEP_RANGE",
5908				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5909			}
5910		}
5911
5912# check for naked sscanf
5913		if ($^V && $^V ge 5.10.0 &&
5914		    defined $stat &&
5915		    $line =~ /\bsscanf\b/ &&
5916		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
5917		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
5918		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
5919			my $lc = $stat =~ tr@\n@@;
5920			$lc = $lc + $linenr;
5921			my $stat_real = raw_line($linenr, 0);
5922		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
5923				$stat_real = $stat_real . "\n" . raw_line($count, 0);
5924			}
5925			WARN("NAKED_SSCANF",
5926			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
5927		}
5928
5929# check for simple sscanf that should be kstrto<foo>
5930		if ($^V && $^V ge 5.10.0 &&
5931		    defined $stat &&
5932		    $line =~ /\bsscanf\b/) {
5933			my $lc = $stat =~ tr@\n@@;
5934			$lc = $lc + $linenr;
5935			my $stat_real = raw_line($linenr, 0);
5936		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
5937				$stat_real = $stat_real . "\n" . raw_line($count, 0);
5938			}
5939			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
5940				my $format = $6;
5941				my $count = $format =~ tr@%@%@;
5942				if ($count == 1 &&
5943				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
5944					WARN("SSCANF_TO_KSTRTO",
5945					     "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
5946				}
5947			}
5948		}
5949
5950# check for new externs in .h files.
5951		if ($realfile =~ /\.h$/ &&
5952		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
5953			if (CHK("AVOID_EXTERNS",
5954				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
5955			    $fix) {
5956				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
5957			}
5958		}
5959
5960# check for new externs in .c files.
5961		if ($realfile =~ /\.c$/ && defined $stat &&
5962		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
5963		{
5964			my $function_name = $1;
5965			my $paren_space = $2;
5966
5967			my $s = $stat;
5968			if (defined $cond) {
5969				substr($s, 0, length($cond), '');
5970			}
5971			if ($s =~ /^\s*;/ &&
5972			    $function_name ne 'uninitialized_var')
5973			{
5974				WARN("AVOID_EXTERNS",
5975				     "externs should be avoided in .c files\n" .  $herecurr);
5976			}
5977
5978			if ($paren_space =~ /\n/) {
5979				WARN("FUNCTION_ARGUMENTS",
5980				     "arguments for function declarations should follow identifier\n" . $herecurr);
5981			}
5982
5983		} elsif ($realfile =~ /\.c$/ && defined $stat &&
5984		    $stat =~ /^.\s*extern\s+/)
5985		{
5986			WARN("AVOID_EXTERNS",
5987			     "externs should be avoided in .c files\n" .  $herecurr);
5988		}
5989
5990# check for function declarations that have arguments without identifier names
5991		if (defined $stat &&
5992		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
5993		    $1 ne "void") {
5994			my $args = trim($1);
5995			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
5996				my $arg = trim($1);
5997				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
5998					WARN("FUNCTION_ARGUMENTS",
5999					     "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
6000				}
6001			}
6002		}
6003
6004# check for function definitions
6005		if ($^V && $^V ge 5.10.0 &&
6006		    defined $stat &&
6007		    $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
6008			$context_function = $1;
6009
6010# check for multiline function definition with misplaced open brace
6011			my $ok = 0;
6012			my $cnt = statement_rawlines($stat);
6013			my $herectx = $here . "\n";
6014			for (my $n = 0; $n < $cnt; $n++) {
6015				my $rl = raw_line($linenr, $n);
6016				$herectx .=  $rl . "\n";
6017				$ok = 1 if ($rl =~ /^[ \+]\{/);
6018				$ok = 1 if ($rl =~ /\{/ && $n == 0);
6019				last if $rl =~ /^[ \+].*\{/;
6020			}
6021			if (!$ok) {
6022				ERROR("OPEN_BRACE",
6023				      "open brace '{' following function definitions go on the next line\n" . $herectx);
6024			}
6025		}
6026
6027# checks for new __setup's
6028		if ($rawline =~ /\b__setup\("([^"]*)"/) {
6029			my $name = $1;
6030
6031			if (!grep(/$name/, @setup_docs)) {
6032				CHK("UNDOCUMENTED_SETUP",
6033				    "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
6034			}
6035		}
6036
6037# check for pointless casting of kmalloc return
6038		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
6039			WARN("UNNECESSARY_CASTS",
6040			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
6041		}
6042
6043# alloc style
6044# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
6045		if ($^V && $^V ge 5.10.0 &&
6046		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
6047			CHK("ALLOC_SIZEOF_STRUCT",
6048			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
6049		}
6050
6051# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
6052		if ($^V && $^V ge 5.10.0 &&
6053		    defined $stat &&
6054		    $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
6055			my $oldfunc = $3;
6056			my $a1 = $4;
6057			my $a2 = $10;
6058			my $newfunc = "kmalloc_array";
6059			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
6060			my $r1 = $a1;
6061			my $r2 = $a2;
6062			if ($a1 =~ /^sizeof\s*\S/) {
6063				$r1 = $a2;
6064				$r2 = $a1;
6065			}
6066			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
6067			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
6068				my $ctx = '';
6069				my $herectx = $here . "\n";
6070				my $cnt = statement_rawlines($stat);
6071				for (my $n = 0; $n < $cnt; $n++) {
6072					$herectx .= raw_line($linenr, $n) . "\n";
6073				}
6074				if (WARN("ALLOC_WITH_MULTIPLY",
6075					 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
6076				    $cnt == 1 &&
6077				    $fix) {
6078					$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;
6079				}
6080			}
6081		}
6082
6083# check for krealloc arg reuse
6084		if ($^V && $^V ge 5.10.0 &&
6085		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
6086			WARN("KREALLOC_ARG_REUSE",
6087			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
6088		}
6089
6090# check for alloc argument mismatch
6091		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
6092			WARN("ALLOC_ARRAY_ARGS",
6093			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
6094		}
6095
6096# check for multiple semicolons
6097		if ($line =~ /;\s*;\s*$/) {
6098			if (WARN("ONE_SEMICOLON",
6099				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
6100			    $fix) {
6101				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
6102			}
6103		}
6104
6105# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
6106		if ($realfile !~ m@^include/uapi/@ &&
6107		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
6108			my $ull = "";
6109			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
6110			if (CHK("BIT_MACRO",
6111				"Prefer using the BIT$ull macro\n" . $herecurr) &&
6112			    $fix) {
6113				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
6114			}
6115		}
6116
6117# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
6118		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
6119			my $config = $1;
6120			if (WARN("PREFER_IS_ENABLED",
6121				 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
6122			    $fix) {
6123				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
6124			}
6125		}
6126
6127# check for case / default statements not preceded by break/fallthrough/switch
6128		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
6129			my $has_break = 0;
6130			my $has_statement = 0;
6131			my $count = 0;
6132			my $prevline = $linenr;
6133			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
6134				$prevline--;
6135				my $rline = $rawlines[$prevline - 1];
6136				my $fline = $lines[$prevline - 1];
6137				last if ($fline =~ /^\@\@/);
6138				next if ($fline =~ /^\-/);
6139				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
6140				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
6141				next if ($fline =~ /^.[\s$;]*$/);
6142				$has_statement = 1;
6143				$count++;
6144				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/);
6145			}
6146			if (!$has_break && $has_statement) {
6147				WARN("MISSING_BREAK",
6148				     "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
6149			}
6150		}
6151
6152# check for switch/default statements without a break;
6153		if ($^V && $^V ge 5.10.0 &&
6154		    defined $stat &&
6155		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
6156			my $ctx = '';
6157			my $herectx = $here . "\n";
6158			my $cnt = statement_rawlines($stat);
6159			for (my $n = 0; $n < $cnt; $n++) {
6160				$herectx .= raw_line($linenr, $n) . "\n";
6161			}
6162			WARN("DEFAULT_NO_BREAK",
6163			     "switch default: should use break\n" . $herectx);
6164		}
6165
6166# check for gcc specific __FUNCTION__
6167		if ($line =~ /\b__FUNCTION__\b/) {
6168			if (WARN("USE_FUNC",
6169				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
6170			    $fix) {
6171				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
6172			}
6173		}
6174
6175# check for uses of __DATE__, __TIME__, __TIMESTAMP__
6176		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
6177			ERROR("DATE_TIME",
6178			      "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
6179		}
6180
6181# check for use of yield()
6182		if ($line =~ /\byield\s*\(\s*\)/) {
6183			WARN("YIELD",
6184			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
6185		}
6186
6187# check for comparisons against true and false
6188		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
6189			my $lead = $1;
6190			my $arg = $2;
6191			my $test = $3;
6192			my $otype = $4;
6193			my $trail = $5;
6194			my $op = "!";
6195
6196			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
6197
6198			my $type = lc($otype);
6199			if ($type =~ /^(?:true|false)$/) {
6200				if (("$test" eq "==" && "$type" eq "true") ||
6201				    ("$test" eq "!=" && "$type" eq "false")) {
6202					$op = "";
6203				}
6204
6205				CHK("BOOL_COMPARISON",
6206				    "Using comparison to $otype is error prone\n" . $herecurr);
6207
6208## maybe suggesting a correct construct would better
6209##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
6210
6211			}
6212		}
6213
6214# check for semaphores initialized locked
6215		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
6216			WARN("CONSIDER_COMPLETION",
6217			     "consider using a completion\n" . $herecurr);
6218		}
6219
6220# recommend kstrto* over simple_strto* and strict_strto*
6221		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
6222			WARN("CONSIDER_KSTRTO",
6223			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
6224		}
6225
6226# check for __initcall(), use device_initcall() explicitly or more appropriate function please
6227		if ($line =~ /^.\s*__initcall\s*\(/) {
6228			WARN("USE_DEVICE_INITCALL",
6229			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
6230		}
6231
6232# check for various structs that are normally const (ops, kgdb, device_tree)
6233# and avoid what seem like struct definitions 'struct foo {'
6234		if ($line !~ /\bconst\b/ &&
6235		    $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
6236			WARN("CONST_STRUCT",
6237			     "struct $1 should normally be const\n" . $herecurr);
6238		}
6239
6240# use of NR_CPUS is usually wrong
6241# ignore definitions of NR_CPUS and usage to define arrays as likely right
6242		if ($line =~ /\bNR_CPUS\b/ &&
6243		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
6244		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
6245		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
6246		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
6247		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
6248		{
6249			WARN("NR_CPUS",
6250			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
6251		}
6252
6253# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
6254		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
6255			ERROR("DEFINE_ARCH_HAS",
6256			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
6257		}
6258
6259# likely/unlikely comparisons similar to "(likely(foo) > 0)"
6260		if ($^V && $^V ge 5.10.0 &&
6261		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
6262			WARN("LIKELY_MISUSE",
6263			     "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
6264		}
6265
6266# whine mightly about in_atomic
6267		if ($line =~ /\bin_atomic\s*\(/) {
6268			if ($realfile =~ m@^drivers/@) {
6269				ERROR("IN_ATOMIC",
6270				      "do not use in_atomic in drivers\n" . $herecurr);
6271			} elsif ($realfile !~ m@^kernel/@) {
6272				WARN("IN_ATOMIC",
6273				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
6274			}
6275		}
6276
6277# check for mutex_trylock_recursive usage
6278		if ($line =~ /mutex_trylock_recursive/) {
6279			ERROR("LOCKING",
6280			      "recursive locking is bad, do not use this ever.\n" . $herecurr);
6281		}
6282
6283# check for lockdep_set_novalidate_class
6284		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
6285		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
6286			if ($realfile !~ m@^kernel/lockdep@ &&
6287			    $realfile !~ m@^include/linux/lockdep@ &&
6288			    $realfile !~ m@^drivers/base/core@) {
6289				ERROR("LOCKDEP",
6290				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
6291			}
6292		}
6293
6294		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
6295		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
6296			WARN("EXPORTED_WORLD_WRITABLE",
6297			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
6298		}
6299
6300# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
6301# and whether or not function naming is typical and if
6302# DEVICE_ATTR permissions uses are unusual too
6303		if ($^V && $^V ge 5.10.0 &&
6304		    defined $stat &&
6305		    $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*\)/) {
6306			my $var = $1;
6307			my $perms = $2;
6308			my $show = $3;
6309			my $store = $4;
6310			my $octal_perms = perms_to_octal($perms);
6311			if ($show =~ /^${var}_show$/ &&
6312			    $store =~ /^${var}_store$/ &&
6313			    $octal_perms eq "0644") {
6314				if (WARN("DEVICE_ATTR_RW",
6315					 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
6316				    $fix) {
6317					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
6318				}
6319			} elsif ($show =~ /^${var}_show$/ &&
6320				 $store =~ /^NULL$/ &&
6321				 $octal_perms eq "0444") {
6322				if (WARN("DEVICE_ATTR_RO",
6323					 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
6324				    $fix) {
6325					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
6326				}
6327			} elsif ($show =~ /^NULL$/ &&
6328				 $store =~ /^${var}_store$/ &&
6329				 $octal_perms eq "0200") {
6330				if (WARN("DEVICE_ATTR_WO",
6331					 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
6332				    $fix) {
6333					$fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
6334				}
6335			} elsif ($octal_perms eq "0644" ||
6336				 $octal_perms eq "0444" ||
6337				 $octal_perms eq "0200") {
6338				my $newshow = "$show";
6339				$newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
6340				my $newstore = $store;
6341				$newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
6342				my $rename = "";
6343				if ($show ne $newshow) {
6344					$rename .= " '$show' to '$newshow'";
6345				}
6346				if ($store ne $newstore) {
6347					$rename .= " '$store' to '$newstore'";
6348				}
6349				WARN("DEVICE_ATTR_FUNCTIONS",
6350				     "Consider renaming function(s)$rename\n" . $herecurr);
6351			} else {
6352				WARN("DEVICE_ATTR_PERMS",
6353				     "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
6354			}
6355		}
6356
6357# Mode permission misuses where it seems decimal should be octal
6358# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
6359# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
6360#   specific definition of not visible in sysfs.
6361# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
6362#   use the default permissions
6363		if ($^V && $^V ge 5.10.0 &&
6364		    defined $stat &&
6365		    $line =~ /$mode_perms_search/) {
6366			foreach my $entry (@mode_permission_funcs) {
6367				my $func = $entry->[0];
6368				my $arg_pos = $entry->[1];
6369
6370				my $lc = $stat =~ tr@\n@@;
6371				$lc = $lc + $linenr;
6372				my $stat_real = raw_line($linenr, 0);
6373				for (my $count = $linenr + 1; $count <= $lc; $count++) {
6374					$stat_real = $stat_real . "\n" . raw_line($count, 0);
6375				}
6376
6377				my $skip_args = "";
6378				if ($arg_pos > 1) {
6379					$arg_pos--;
6380					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
6381				}
6382				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
6383				if ($stat =~ /$test/) {
6384					my $val = $1;
6385					$val = $6 if ($skip_args ne "");
6386					if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
6387					    (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
6388					     ($val =~ /^$Octal$/ && length($val) ne 4))) {
6389						ERROR("NON_OCTAL_PERMISSIONS",
6390						      "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
6391					}
6392					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
6393						ERROR("EXPORTED_WORLD_WRITABLE",
6394						      "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
6395					}
6396				}
6397			}
6398		}
6399
6400# check for uses of S_<PERMS> that could be octal for readability
6401		if ($line =~ /\b($multi_mode_perms_string_search)\b/) {
6402			my $oval = $1;
6403			my $octal = perms_to_octal($oval);
6404			if (WARN("SYMBOLIC_PERMS",
6405				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
6406			    $fix) {
6407				$fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
6408			}
6409		}
6410
6411# validate content of MODULE_LICENSE against list from include/linux/module.h
6412		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
6413			my $extracted_string = get_quoted_string($line, $rawline);
6414			my $valid_licenses = qr{
6415						GPL|
6416						GPL\ v2|
6417						GPL\ and\ additional\ rights|
6418						Dual\ BSD/GPL|
6419						Dual\ MIT/GPL|
6420						Dual\ MPL/GPL|
6421						Proprietary
6422					}x;
6423			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
6424				WARN("MODULE_LICENSE",
6425				     "unknown module license " . $extracted_string . "\n" . $herecurr);
6426			}
6427		}
6428	}
6429
6430	# If we have no input at all, then there is nothing to report on
6431	# so just keep quiet.
6432	if ($#rawlines == -1) {
6433		exit(0);
6434	}
6435
6436	# In mailback mode only produce a report in the negative, for
6437	# things that appear to be patches.
6438	if ($mailback && ($clean == 1 || !$is_patch)) {
6439		exit(0);
6440	}
6441
6442	# This is not a patch, and we are are in 'no-patch' mode so
6443	# just keep quiet.
6444	if (!$chk_patch && !$is_patch) {
6445		exit(0);
6446	}
6447
6448	if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
6449		ERROR("NOT_UNIFIED_DIFF",
6450		      "Does not appear to be a unified-diff format patch\n");
6451	}
6452	if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) {
6453		ERROR("MISSING_SIGN_OFF",
6454		      "Missing Signed-off-by: line(s)\n");
6455	}
6456
6457	print report_dump();
6458	if ($summary && !($clean == 1 && $quiet == 1)) {
6459		print "$filename " if ($summary_file);
6460		print "total: $cnt_error errors, $cnt_warn warnings, " .
6461			(($check)? "$cnt_chk checks, " : "") .
6462			"$cnt_lines lines checked\n";
6463	}
6464
6465	if ($quiet == 0) {
6466		# If there were any defects found and not already fixing them
6467		if (!$clean and !$fix) {
6468			print << "EOM"
6469
6470NOTE: For some of the reported defects, checkpatch may be able to
6471      mechanically convert to the typical style using --fix or --fix-inplace.
6472EOM
6473		}
6474		# If there were whitespace errors which cleanpatch can fix
6475		# then suggest that.
6476		if ($rpt_cleaners) {
6477			$rpt_cleaners = 0;
6478			print << "EOM"
6479
6480NOTE: Whitespace errors detected.
6481      You may wish to use scripts/cleanpatch or scripts/cleanfile
6482EOM
6483		}
6484	}
6485
6486	if ($clean == 0 && $fix &&
6487	    ("@rawlines" ne "@fixed" ||
6488	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
6489		my $newfile = $filename;
6490		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
6491		my $linecount = 0;
6492		my $f;
6493
6494		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
6495
6496		open($f, '>', $newfile)
6497		    or die "$P: Can't open $newfile for write\n";
6498		foreach my $fixed_line (@fixed) {
6499			$linecount++;
6500			if ($file) {
6501				if ($linecount > 3) {
6502					$fixed_line =~ s/^\+//;
6503					print $f $fixed_line . "\n";
6504				}
6505			} else {
6506				print $f $fixed_line . "\n";
6507			}
6508		}
6509		close($f);
6510
6511		if (!$quiet) {
6512			print << "EOM";
6513
6514Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
6515
6516Do _NOT_ trust the results written to this file.
6517Do _NOT_ submit these changes without inspecting them for correctness.
6518
6519This EXPERIMENTAL file is simply a convenience to help rewrite patches.
6520No warranties, expressed or implied...
6521EOM
6522		}
6523	}
6524
6525	if ($quiet == 0) {
6526		print "\n";
6527		if ($clean == 1) {
6528			print "$vname has no obvious style problems and is ready for submission.\n";
6529		} else {
6530			print "$vname has style problems, please review.\n";
6531		}
6532	}
6533	return $clean;
6534}
6535