blob: c10befa118a52a151b8274d521b1a50a81fde2ce [file] [log] [blame]
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001#!/usr/bin/perl -w
Dave Jonesdbf004d2010-01-12 16:59:52 -05002# (c) 2001, Dave Jones. (the file handling bit)
Andy Whitcroft00df3442007-06-08 13:47:06 -07003# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
Andy Whitcroft2a5a2c22009-01-06 14:41:23 -08004# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
Andy Whitcroft015830be2010-10-26 14:23:17 -07005# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07006# Licensed under the terms of the GNU GPL License version 2
7
8use strict;
Joe Perchesc707a812013-07-08 16:00:43 -07009use POSIX;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070010
11my $P = $0;
Andy Whitcroft00df3442007-06-08 13:47:06 -070012$P =~ s@.*/@@g;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070013
Joe Perches000d1cc12011-07-25 17:13:25 -070014my $V = '0.32';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -070015
16use Getopt::Long qw(:config no_auto_abbrev);
17
18my $quiet = 0;
19my $tree = 1;
20my $chk_signoff = 1;
21my $chk_patch = 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -070022my $tst_only;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070023my $emacs = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -080024my $terse = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070025my $file = 0;
26my $check = 0;
Joe Perches2ac73b42014-06-04 16:12:05 -070027my $check_orig = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -080028my $summary = 1;
29my $mailback = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -080030my $summary_file = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070031my $show_types = 0;
Joe Perches3705ce52013-07-03 15:05:31 -070032my $fix = 0;
Joe Perches9624b8d2014-01-23 15:54:44 -080033my $fix_inplace = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -070034my $root;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -080035my %debug;
Joe Perches34456862013-07-03 15:05:34 -070036my %camelcase = ();
Joe Perches91bfe482013-09-11 14:23:59 -070037my %use_type = ();
38my @use = ();
39my %ignore_type = ();
Joe Perches000d1cc12011-07-25 17:13:25 -070040my @ignore = ();
Hannes Eder77f5b102009-09-21 17:04:37 -070041my $help = 0;
Joe Perches000d1cc12011-07-25 17:13:25 -070042my $configuration_file = ".checkpatch.conf";
Joe Perches6cd7f382012-12-17 16:01:54 -080043my $max_line_length = 80;
Dave Hansend62a2012013-09-11 14:23:56 -070044my $ignore_perl_version = 0;
45my $minimum_perl_version = 5.10.0;
Hannes Eder77f5b102009-09-21 17:04:37 -070046
47sub help {
48 my ($exitcode) = @_;
49
50 print << "EOM";
51Usage: $P [OPTION]... [FILE]...
52Version: $V
53
54Options:
55 -q, --quiet quiet
56 --no-tree run without a kernel tree
57 --no-signoff do not check for 'Signed-off-by' line
58 --patch treat FILE as patchfile (default)
59 --emacs emacs compile window format
60 --terse one line per report
61 -f, --file treat FILE as regular source file
62 --subjective, --strict enable more subjective tests
Joe Perches91bfe482013-09-11 14:23:59 -070063 --types TYPE(,TYPE2...) show only these comma separated message types
Joe Perches000d1cc12011-07-25 17:13:25 -070064 --ignore TYPE(,TYPE2...) ignore various comma separated message types
Joe Perches6cd7f382012-12-17 16:01:54 -080065 --max-line-length=n set the maximum line length, if exceeded, warn
Joe Perches000d1cc12011-07-25 17:13:25 -070066 --show-types show the message "types" in the output
Hannes Eder77f5b102009-09-21 17:04:37 -070067 --root=PATH PATH to the kernel tree root
68 --no-summary suppress the per-file summary
69 --mailback only produce a report in case of warnings/errors
70 --summary-file include the filename in summary
71 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
72 'values', 'possible', 'type', and 'attr' (default
73 is all off)
74 --test-only=WORD report only warnings/errors containing WORD
75 literally
Joe Perches3705ce52013-07-03 15:05:31 -070076 --fix EXPERIMENTAL - may create horrible results
77 If correctable single-line errors exist, create
78 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
79 with potential errors corrected to the preferred
80 checkpatch style
Joe Perches9624b8d2014-01-23 15:54:44 -080081 --fix-inplace EXPERIMENTAL - may create horrible results
82 Is the same as --fix, but overwrites the input
83 file. It's your fault if there's no backup or git
Dave Hansend62a2012013-09-11 14:23:56 -070084 --ignore-perl-version override checking of perl version. expect
85 runtime errors.
Hannes Eder77f5b102009-09-21 17:04:37 -070086 -h, --help, --version display this help and exit
87
88When FILE is - read standard input.
89EOM
90
91 exit($exitcode);
92}
93
Joe Perches000d1cc12011-07-25 17:13:25 -070094my $conf = which_conf($configuration_file);
95if (-f $conf) {
96 my @conf_args;
97 open(my $conffile, '<', "$conf")
98 or warn "$P: Can't find a readable $configuration_file file $!\n";
99
100 while (<$conffile>) {
101 my $line = $_;
102
103 $line =~ s/\s*\n?$//g;
104 $line =~ s/^\s*//g;
105 $line =~ s/\s+/ /g;
106
107 next if ($line =~ m/^\s*#/);
108 next if ($line =~ m/^\s*$/);
109
110 my @words = split(" ", $line);
111 foreach my $word (@words) {
112 last if ($word =~ m/^#/);
113 push (@conf_args, $word);
114 }
115 }
116 close($conffile);
117 unshift(@ARGV, @conf_args) if @conf_args;
118}
119
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700120GetOptions(
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700121 'q|quiet+' => \$quiet,
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700122 'tree!' => \$tree,
123 'signoff!' => \$chk_signoff,
124 'patch!' => \$chk_patch,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700125 'emacs!' => \$emacs,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800126 'terse!' => \$terse,
Hannes Eder77f5b102009-09-21 17:04:37 -0700127 'f|file!' => \$file,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700128 'subjective!' => \$check,
129 'strict!' => \$check,
Joe Perches000d1cc12011-07-25 17:13:25 -0700130 'ignore=s' => \@ignore,
Joe Perches91bfe482013-09-11 14:23:59 -0700131 'types=s' => \@use,
Joe Perches000d1cc12011-07-25 17:13:25 -0700132 'show-types!' => \$show_types,
Joe Perches6cd7f382012-12-17 16:01:54 -0800133 'max-line-length=i' => \$max_line_length,
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700134 'root=s' => \$root,
Andy Whitcroft8905a672007-11-28 16:21:06 -0800135 'summary!' => \$summary,
136 'mailback!' => \$mailback,
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800137 'summary-file!' => \$summary_file,
Joe Perches3705ce52013-07-03 15:05:31 -0700138 'fix!' => \$fix,
Joe Perches9624b8d2014-01-23 15:54:44 -0800139 'fix-inplace!' => \$fix_inplace,
Dave Hansend62a2012013-09-11 14:23:56 -0700140 'ignore-perl-version!' => \$ignore_perl_version,
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800141 'debug=s' => \%debug,
Andy Whitcroft773647a2008-03-28 14:15:58 -0700142 'test-only=s' => \$tst_only,
Hannes Eder77f5b102009-09-21 17:04:37 -0700143 'h|help' => \$help,
144 'version' => \$help
145) or help(1);
146
147help(0) if ($help);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700148
Joe Perches9624b8d2014-01-23 15:54:44 -0800149$fix = 1 if ($fix_inplace);
Joe Perches2ac73b42014-06-04 16:12:05 -0700150$check_orig = $check;
Joe Perches9624b8d2014-01-23 15:54:44 -0800151
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700152my $exit = 0;
153
Dave Hansend62a2012013-09-11 14:23:56 -0700154if ($^V && $^V lt $minimum_perl_version) {
155 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
156 if (!$ignore_perl_version) {
157 exit(1);
158 }
159}
160
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700161if ($#ARGV < 0) {
Hannes Eder77f5b102009-09-21 17:04:37 -0700162 print "$P: no input files\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700163 exit(1);
164}
165
Joe Perches91bfe482013-09-11 14:23:59 -0700166sub hash_save_array_words {
167 my ($hashRef, $arrayRef) = @_;
Joe Perches000d1cc12011-07-25 17:13:25 -0700168
Joe Perches91bfe482013-09-11 14:23:59 -0700169 my @array = split(/,/, join(',', @$arrayRef));
170 foreach my $word (@array) {
171 $word =~ s/\s*\n?$//g;
172 $word =~ s/^\s*//g;
173 $word =~ s/\s+/ /g;
174 $word =~ tr/[a-z]/[A-Z]/;
Joe Perches000d1cc12011-07-25 17:13:25 -0700175
Joe Perches91bfe482013-09-11 14:23:59 -0700176 next if ($word =~ m/^\s*#/);
177 next if ($word =~ m/^\s*$/);
178
179 $hashRef->{$word}++;
180 }
Joe Perches000d1cc12011-07-25 17:13:25 -0700181}
182
Joe Perches91bfe482013-09-11 14:23:59 -0700183sub hash_show_words {
184 my ($hashRef, $prefix) = @_;
185
Joe Perches58cb3cf2013-09-11 14:24:04 -0700186 if ($quiet == 0 && keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700187 print "NOTE: $prefix message types:";
Joe Perches58cb3cf2013-09-11 14:24:04 -0700188 foreach my $word (sort keys %$hashRef) {
Joe Perches91bfe482013-09-11 14:23:59 -0700189 print " $word";
190 }
191 print "\n\n";
192 }
193}
194
195hash_save_array_words(\%ignore_type, \@ignore);
196hash_save_array_words(\%use_type, \@use);
197
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800198my $dbg_values = 0;
199my $dbg_possible = 0;
Andy Whitcroft7429c692008-07-23 21:29:06 -0700200my $dbg_type = 0;
Andy Whitcrofta1ef2772008-10-15 22:02:17 -0700201my $dbg_attr = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800202for my $key (keys %debug) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800203 ## no critic
204 eval "\${dbg_$key} = '$debug{$key}';";
205 die "$@" if ($@);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800206}
207
Andy Whitcroftd2c0a232010-10-26 14:23:12 -0700208my $rpt_cleaners = 0;
209
Andy Whitcroft8905a672007-11-28 16:21:06 -0800210if ($terse) {
211 $emacs = 1;
212 $quiet++;
213}
214
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700215if ($tree) {
216 if (defined $root) {
217 if (!top_of_kernel_tree($root)) {
218 die "$P: $root: --root does not point at a valid tree\n";
219 }
220 } else {
221 if (top_of_kernel_tree('.')) {
222 $root = '.';
223 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
224 top_of_kernel_tree($1)) {
225 $root = $1;
226 }
227 }
228
229 if (!defined $root) {
230 print "Must be run from the top-level dir. of a kernel tree\n";
231 exit(2);
232 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700233}
234
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700235my $emitted_corrupt = 0;
236
Andy Whitcroft2ceb5322009-10-26 16:50:14 -0700237our $Ident = qr{
238 [A-Za-z_][A-Za-z\d_]*
239 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
240 }x;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700241our $Storage = qr{extern|static|asmlinkage};
242our $Sparse = qr{
243 __user|
244 __kernel|
245 __force|
246 __iomem|
247 __must_check|
248 __init_refok|
Andy Whitcroft417495e2009-02-27 14:03:08 -0800249 __kprobes|
Sven Eckelmann165e72a2011-07-25 17:13:23 -0700250 __ref|
251 __rcu
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700252 }x;
Joe Perchese970b8842013-11-12 15:10:10 -0800253our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
254our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
255our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
256our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
257our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
Joe Perches8716de32013-09-11 14:24:05 -0700258
Wolfram Sang52131292010-03-05 13:43:51 -0800259# Notes to $Attribute:
260# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700261our $Attribute = qr{
262 const|
Joe Perches03f1df72010-10-26 14:23:16 -0700263 __percpu|
264 __nocast|
265 __safe|
266 __bitwise__|
267 __packed__|
268 __packed2__|
269 __naked|
270 __maybe_unused|
271 __always_unused|
272 __noreturn|
273 __used|
274 __cold|
275 __noclone|
276 __deprecated|
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700277 __read_mostly|
278 __kprobes|
Joe Perches8716de32013-09-11 14:24:05 -0700279 $InitAttribute|
Andy Whitcroft24e1d812008-10-15 22:02:18 -0700280 ____cacheline_aligned|
281 ____cacheline_aligned_in_smp|
Andy Whitcroft5fe3af12009-01-06 14:41:18 -0800282 ____cacheline_internodealigned_in_smp|
283 __weak
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700284 }x;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700285our $Modifier;
Joe Perches91cb5192014-04-03 14:49:32 -0700286our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700287our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
288our $Lval = qr{$Ident(?:$Member)*};
289
Joe Perches95e2c602013-07-03 15:05:20 -0700290our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
291our $Binary = qr{(?i)0b[01]+$Int_type?};
292our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
293our $Int = qr{[0-9]+$Int_type?};
Joe Perches24358802014-04-03 14:49:13 -0700294our $Octal = qr{0[0-7]+$Int_type?};
Joe Perches326b1ff2013-02-04 14:28:51 -0800295our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
296our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
297our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
Joe Perches74349bc2012-12-17 16:02:05 -0800298our $Float = qr{$Float_hex|$Float_dec|$Float_int};
Joe Perches24358802014-04-03 14:49:13 -0700299our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
Joe Perches326b1ff2013-02-04 14:28:51 -0800300our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
Joe Perches447432f2014-04-03 14:49:17 -0700301our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
Joe Perches23f780c2013-07-03 15:05:31 -0700302our $Arithmetic = qr{\+|-|\*|\/|%};
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700303our $Operators = qr{
304 <=|>=|==|!=|
305 =>|->|<<|>>|<|>|!|~|
Joe Perches23f780c2013-07-03 15:05:31 -0700306 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700307 }x;
308
Joe Perches91cb5192014-04-03 14:49:32 -0700309our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
310
Andy Whitcroft8905a672007-11-28 16:21:06 -0800311our $NonptrType;
Joe Perches8716de32013-09-11 14:24:05 -0700312our $NonptrTypeWithAttr;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800313our $Type;
314our $Declare;
315
Joe Perches15662b32011-10-31 17:13:12 -0700316our $NON_ASCII_UTF8 = qr{
317 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
Andy Whitcroft171ae1a2008-04-29 00:59:32 -0700318 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
319 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
320 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
321 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
322 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
323 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
324}x;
325
Joe Perches15662b32011-10-31 17:13:12 -0700326our $UTF8 = qr{
327 [\x09\x0A\x0D\x20-\x7E] # ASCII
328 | $NON_ASCII_UTF8
329}x;
330
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700331our $typeTypedefs = qr{(?x:
Andy Whitcroftfb9e9092009-09-21 17:04:38 -0700332 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700333 atomic_t
334)};
335
Joe Perches691e6692010-03-05 13:43:51 -0800336our $logFunctions = qr{(?x:
Joe Perches6e60c022011-07-25 17:13:27 -0700337 printk(?:_ratelimited|_once|)|
Jacob Keller7d0b6592013-07-03 15:05:35 -0700338 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
Joe Perches6e60c022011-07-25 17:13:27 -0700339 WARN(?:_RATELIMIT|_ONCE|)|
Joe Perchesb0531722011-05-24 17:13:40 -0700340 panic|
Joe Perches06668722013-11-12 15:10:07 -0800341 MODULE_[A-Z_]+|
342 seq_vprintf|seq_printf|seq_puts
Joe Perches691e6692010-03-05 13:43:51 -0800343)};
344
Joe Perches20112472011-07-25 17:13:23 -0700345our $signature_tags = qr{(?xi:
346 Signed-off-by:|
347 Acked-by:|
348 Tested-by:|
349 Reviewed-by:|
350 Reported-by:|
Mugunthan V N8543ae12013-04-29 16:18:17 -0700351 Suggested-by:|
Joe Perches20112472011-07-25 17:13:23 -0700352 To:|
353 Cc:
354)};
355
Andy Whitcroft8905a672007-11-28 16:21:06 -0800356our @typeList = (
357 qr{void},
Joe Perches0c773d92014-08-06 16:11:20 -0700358 qr{(?:(?:un)?signed\s+)?char},
359 qr{(?:(?:un)?signed\s+)?short\s+int},
360 qr{(?:(?:un)?signed\s+)?short},
361 qr{(?:(?:un)?signed\s+)?int},
362 qr{(?:(?:un)?signed\s+)?long\s+int},
363 qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
364 qr{(?:(?:un)?signed\s+)?long\s+long},
365 qr{(?:(?:un)?signed\s+)?long},
366 qr{(?:un)?signed},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800367 qr{float},
368 qr{double},
369 qr{bool},
Andy Whitcroft8905a672007-11-28 16:21:06 -0800370 qr{struct\s+$Ident},
371 qr{union\s+$Ident},
372 qr{enum\s+$Ident},
373 qr{${Ident}_t},
374 qr{${Ident}_handler},
375 qr{${Ident}_handler_fn},
376);
Joe Perches8716de32013-09-11 14:24:05 -0700377our @typeListWithAttr = (
378 @typeList,
379 qr{struct\s+$InitAttribute\s+$Ident},
380 qr{union\s+$InitAttribute\s+$Ident},
381);
382
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700383our @modifierList = (
384 qr{fastcall},
385);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800386
Joe Perches24358802014-04-03 14:49:13 -0700387our @mode_permission_funcs = (
388 ["module_param", 3],
389 ["module_param_(?:array|named|string)", 4],
390 ["module_param_array_named", 5],
391 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
392 ["proc_create(?:_data|)", 2],
393 ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
394);
395
Joe Perches515a2352014-04-03 14:49:24 -0700396#Create a search pattern for all these functions to speed up a loop below
397our $mode_perms_search = "";
398foreach my $entry (@mode_permission_funcs) {
399 $mode_perms_search .= '|' if ($mode_perms_search ne "");
400 $mode_perms_search .= $entry->[0];
401}
402
Joe Perches3f7bac02014-06-04 16:12:04 -0700403our $declaration_macros = qr{(?x:
404 (?:$Storage\s+)?(?:DECLARE|DEFINE)_[A-Z]+\s*\(|
405 (?:$Storage\s+)?LIST_HEAD\s*\(
406)};
407
Wolfram Sang7840a942010-08-09 17:20:57 -0700408our $allowed_asm_includes = qr{(?x:
409 irq|
410 memory
411)};
412# memory.h: ARM has a custom one
413
Andy Whitcroft8905a672007-11-28 16:21:06 -0800414sub build_types {
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700415 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)";
416 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)";
Joe Perches8716de32013-09-11 14:24:05 -0700417 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700418 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
Andy Whitcroft8905a672007-11-28 16:21:06 -0800419 $NonptrType = qr{
Andy Whitcroftd2172eb2008-07-23 21:29:07 -0700420 (?:$Modifier\s+|const\s+)*
Andy Whitcroftcf655042008-03-04 14:28:20 -0800421 (?:
Andy Whitcroft6b48db22012-01-10 15:10:13 -0800422 (?:typeof|__typeof__)\s*\([^\)]*\)|
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -0700423 (?:$typeTypedefs\b)|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700424 (?:${all}\b)
Andy Whitcroftcf655042008-03-04 14:28:20 -0800425 )
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700426 (?:\s+$Modifier|\s+const)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800427 }x;
Joe Perches8716de32013-09-11 14:24:05 -0700428 $NonptrTypeWithAttr = qr{
429 (?:$Modifier\s+|const\s+)*
430 (?:
431 (?:typeof|__typeof__)\s*\([^\)]*\)|
432 (?:$typeTypedefs\b)|
433 (?:${allWithAttr}\b)
434 )
435 (?:\s+$Modifier|\s+const)*
436 }x;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800437 $Type = qr{
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700438 $NonptrType
Joe Perches1574a292014-08-06 16:10:50 -0700439 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -0700440 (?:\s+$Inline|\s+$Modifier)*
Andy Whitcroft8905a672007-11-28 16:21:06 -0800441 }x;
Joe Perches91cb5192014-04-03 14:49:32 -0700442 $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
Andy Whitcroft8905a672007-11-28 16:21:06 -0800443}
444build_types();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700445
Joe Perches7d2367a2011-07-25 17:13:22 -0700446our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
Joe Perchesd1fe9c02012-03-23 15:02:16 -0700447
448# Using $balanced_parens, $LvalOrFunc, or $FuncArg
449# requires at least perl version v5.10.0
450# Any use must be runtime checked with $^V
451
452our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
Joe Perches24358802014-04-03 14:49:13 -0700453our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
Joe Perchesd7c76ba2012-01-10 15:09:58 -0800454our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
Joe Perches7d2367a2011-07-25 17:13:22 -0700455
456sub deparenthesize {
457 my ($string) = @_;
458 return "" if (!defined($string));
Joe Perches5b9553a2014-04-03 14:49:21 -0700459
460 while ($string =~ /^\s*\(.*\)\s*$/) {
461 $string =~ s@^\s*\(\s*@@;
462 $string =~ s@\s*\)\s*$@@;
463 }
464
Joe Perches7d2367a2011-07-25 17:13:22 -0700465 $string =~ s@\s+@ @g;
Joe Perches5b9553a2014-04-03 14:49:21 -0700466
Joe Perches7d2367a2011-07-25 17:13:22 -0700467 return $string;
468}
469
Joe Perches34456862013-07-03 15:05:34 -0700470sub seed_camelcase_file {
471 my ($file) = @_;
472
473 return if (!(-f $file));
474
475 local $/;
476
477 open(my $include_file, '<', "$file")
478 or warn "$P: Can't read '$file' $!\n";
479 my $text = <$include_file>;
480 close($include_file);
481
482 my @lines = split('\n', $text);
483
484 foreach my $line (@lines) {
485 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
486 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
487 $camelcase{$1} = 1;
Joe Perches11ea5162013-11-12 15:10:08 -0800488 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
489 $camelcase{$1} = 1;
490 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
Joe Perches34456862013-07-03 15:05:34 -0700491 $camelcase{$1} = 1;
492 }
493 }
494}
495
496my $camelcase_seeded = 0;
497sub seed_camelcase_includes {
498 return if ($camelcase_seeded);
499
500 my $files;
Joe Perchesc707a812013-07-08 16:00:43 -0700501 my $camelcase_cache = "";
502 my @include_files = ();
503
504 $camelcase_seeded = 1;
Joe Perches351b2a12013-07-03 15:05:36 -0700505
Richard Genoud3645e322014-02-10 14:25:32 -0800506 if (-e ".git") {
Joe Perches351b2a12013-07-03 15:05:36 -0700507 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
508 chomp $git_last_include_commit;
Joe Perchesc707a812013-07-08 16:00:43 -0700509 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
Joe Perches34456862013-07-03 15:05:34 -0700510 } else {
Joe Perchesc707a812013-07-08 16:00:43 -0700511 my $last_mod_date = 0;
Joe Perches34456862013-07-03 15:05:34 -0700512 $files = `find $root/include -name "*.h"`;
Joe Perchesc707a812013-07-08 16:00:43 -0700513 @include_files = split('\n', $files);
514 foreach my $file (@include_files) {
515 my $date = POSIX::strftime("%Y%m%d%H%M",
516 localtime((stat $file)[9]));
517 $last_mod_date = $date if ($last_mod_date < $date);
518 }
519 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
Joe Perches34456862013-07-03 15:05:34 -0700520 }
Joe Perchesc707a812013-07-08 16:00:43 -0700521
522 if ($camelcase_cache ne "" && -f $camelcase_cache) {
523 open(my $camelcase_file, '<', "$camelcase_cache")
524 or warn "$P: Can't read '$camelcase_cache' $!\n";
525 while (<$camelcase_file>) {
526 chomp;
527 $camelcase{$_} = 1;
528 }
529 close($camelcase_file);
530
531 return;
532 }
533
Richard Genoud3645e322014-02-10 14:25:32 -0800534 if (-e ".git") {
Joe Perchesc707a812013-07-08 16:00:43 -0700535 $files = `git ls-files "include/*.h"`;
536 @include_files = split('\n', $files);
537 }
538
Joe Perches34456862013-07-03 15:05:34 -0700539 foreach my $file (@include_files) {
540 seed_camelcase_file($file);
541 }
Joe Perches351b2a12013-07-03 15:05:36 -0700542
Joe Perchesc707a812013-07-08 16:00:43 -0700543 if ($camelcase_cache ne "") {
Joe Perches351b2a12013-07-03 15:05:36 -0700544 unlink glob ".checkpatch-camelcase.*";
Joe Perchesc707a812013-07-08 16:00:43 -0700545 open(my $camelcase_file, '>', "$camelcase_cache")
546 or warn "$P: Can't write '$camelcase_cache' $!\n";
Joe Perches351b2a12013-07-03 15:05:36 -0700547 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
548 print $camelcase_file ("$_\n");
549 }
550 close($camelcase_file);
551 }
Joe Perches34456862013-07-03 15:05:34 -0700552}
553
Joe Perchesd311cd42014-08-06 16:10:57 -0700554sub git_commit_info {
555 my ($commit, $id, $desc) = @_;
556
557 return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
558
559 my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
560 $output =~ s/^\s*//gm;
561 my @lines = split("\n", $output);
562
563 if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
564# Maybe one day convert this block of bash into something that returns
565# all matching commit ids, but it's very slow...
566#
567# echo "checking commits $1..."
568# git rev-list --remotes | grep -i "^$1" |
569# while read line ; do
570# git log --format='%H %s' -1 $line |
571# echo "commit $(cut -c 1-12,41-)"
572# done
573 } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
574 } else {
575 $id = substr($lines[0], 0, 12);
576 $desc = substr($lines[0], 41);
577 }
578
579 return ($id, $desc);
580}
581
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700582$chk_signoff = 0 if ($file);
583
Andy Whitcroft00df3442007-06-08 13:47:06 -0700584my @rawlines = ();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800585my @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700586my @fixed = ();
Joe Perchesd752fcc2014-08-06 16:11:05 -0700587my @fixed_inserted = ();
588my @fixed_deleted = ();
Joe Perches194f66f2014-08-06 16:11:03 -0700589my $fixlinenr = -1;
590
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800591my $vname;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700592for my $filename (@ARGV) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800593 my $FILE;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700594 if ($file) {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800595 open($FILE, '-|', "diff -u /dev/null $filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700596 die "$P: $filename: diff failed - $!\n";
Andy Whitcroft21caa132009-01-06 14:41:30 -0800597 } elsif ($filename eq '-') {
598 open($FILE, '<&STDIN');
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700599 } else {
Andy Whitcroft21caa132009-01-06 14:41:30 -0800600 open($FILE, '<', "$filename") ||
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700601 die "$P: $filename: open failed - $!\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700602 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800603 if ($filename eq '-') {
604 $vname = 'Your patch';
605 } else {
606 $vname = $filename;
607 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800608 while (<$FILE>) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700609 chomp;
610 push(@rawlines, $_);
611 }
Andy Whitcroft21caa132009-01-06 14:41:30 -0800612 close($FILE);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800613 if (!process($filename)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700614 $exit = 1;
615 }
616 @rawlines = ();
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800617 @lines = ();
Joe Perches3705ce52013-07-03 15:05:31 -0700618 @fixed = ();
Joe Perchesd752fcc2014-08-06 16:11:05 -0700619 @fixed_inserted = ();
620 @fixed_deleted = ();
Joe Perches194f66f2014-08-06 16:11:03 -0700621 $fixlinenr = -1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700622}
623
624exit($exit);
625
626sub top_of_kernel_tree {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700627 my ($root) = @_;
628
629 my @tree_check = (
630 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
631 "README", "Documentation", "arch", "include", "drivers",
632 "fs", "init", "ipc", "kernel", "lib", "scripts",
633 );
634
635 foreach my $check (@tree_check) {
636 if (! -e $root . '/' . $check) {
637 return 0;
638 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700639 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700640 return 1;
Joe Perches8f26b832012-10-04 17:13:32 -0700641}
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700642
Joe Perches20112472011-07-25 17:13:23 -0700643sub parse_email {
644 my ($formatted_email) = @_;
645
646 my $name = "";
647 my $address = "";
648 my $comment = "";
649
650 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
651 $name = $1;
652 $address = $2;
653 $comment = $3 if defined $3;
654 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
655 $address = $1;
656 $comment = $2 if defined $2;
657 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
658 $address = $1;
659 $comment = $2 if defined $2;
660 $formatted_email =~ s/$address.*$//;
661 $name = $formatted_email;
Joe Perches3705ce52013-07-03 15:05:31 -0700662 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700663 $name =~ s/^\"|\"$//g;
664 # If there's a name left after stripping spaces and
665 # leading quotes, and the address doesn't have both
666 # leading and trailing angle brackets, the address
667 # is invalid. ie:
668 # "joe smith joe@smith.com" bad
669 # "joe smith <joe@smith.com" bad
670 if ($name ne "" && $address !~ /^<[^>]+>$/) {
671 $name = "";
672 $address = "";
673 $comment = "";
674 }
675 }
676
Joe Perches3705ce52013-07-03 15:05:31 -0700677 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700678 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700679 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700680 $address =~ s/^\<|\>$//g;
681
682 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
683 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
684 $name = "\"$name\"";
685 }
686
687 return ($name, $address, $comment);
688}
689
690sub format_email {
691 my ($name, $address) = @_;
692
693 my $formatted_email;
694
Joe Perches3705ce52013-07-03 15:05:31 -0700695 $name = trim($name);
Joe Perches20112472011-07-25 17:13:23 -0700696 $name =~ s/^\"|\"$//g;
Joe Perches3705ce52013-07-03 15:05:31 -0700697 $address = trim($address);
Joe Perches20112472011-07-25 17:13:23 -0700698
699 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
700 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
701 $name = "\"$name\"";
702 }
703
704 if ("$name" eq "") {
705 $formatted_email = "$address";
706 } else {
707 $formatted_email = "$name <$address>";
708 }
709
710 return $formatted_email;
711}
712
Joe Perchesd311cd42014-08-06 16:10:57 -0700713sub which {
Joe Perchesbd474ca2014-08-06 16:11:10 -0700714 my ($bin) = @_;
Joe Perchesd311cd42014-08-06 16:10:57 -0700715
Joe Perchesbd474ca2014-08-06 16:11:10 -0700716 foreach my $path (split(/:/, $ENV{PATH})) {
717 if (-e "$path/$bin") {
718 return "$path/$bin";
719 }
Joe Perchesd311cd42014-08-06 16:10:57 -0700720 }
Joe Perchesd311cd42014-08-06 16:10:57 -0700721
Joe Perchesbd474ca2014-08-06 16:11:10 -0700722 return "";
Joe Perchesd311cd42014-08-06 16:10:57 -0700723}
724
Joe Perches000d1cc12011-07-25 17:13:25 -0700725sub which_conf {
726 my ($conf) = @_;
727
728 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
729 if (-e "$path/$conf") {
730 return "$path/$conf";
731 }
732 }
733
734 return "";
735}
736
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700737sub expand_tabs {
738 my ($str) = @_;
739
740 my $res = '';
741 my $n = 0;
742 for my $c (split(//, $str)) {
743 if ($c eq "\t") {
744 $res .= ' ';
745 $n++;
746 for (; ($n % 8) != 0; $n++) {
747 $res .= ' ';
748 }
749 next;
750 }
751 $res .= $c;
752 $n++;
753 }
754
755 return $res;
756}
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700757sub copy_spacing {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700758 (my $res = shift) =~ tr/\t/ /c;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -0700759 return $res;
760}
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -0700761
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -0700762sub line_stats {
763 my ($line) = @_;
764
765 # Drop the diff line leader and expand tabs
766 $line =~ s/^.//;
767 $line = expand_tabs($line);
768
769 # Pick the indent from the front of the line.
770 my ($white) = ($line =~ /^(\s*)/);
771
772 return (length($line), length($white));
773}
774
Andy Whitcroft773647a2008-03-28 14:15:58 -0700775my $sanitise_quote = '';
776
777sub sanitise_line_reset {
778 my ($in_comment) = @_;
779
780 if ($in_comment) {
781 $sanitise_quote = '*/';
782 } else {
783 $sanitise_quote = '';
784 }
785}
Andy Whitcroft00df3442007-06-08 13:47:06 -0700786sub sanitise_line {
787 my ($line) = @_;
788
789 my $res = '';
790 my $l = '';
791
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800792 my $qlen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700793 my $off = 0;
794 my $c;
Andy Whitcroft00df3442007-06-08 13:47:06 -0700795
Andy Whitcroft773647a2008-03-28 14:15:58 -0700796 # Always copy over the diff marker.
797 $res = substr($line, 0, 1);
798
799 for ($off = 1; $off < length($line); $off++) {
800 $c = substr($line, $off, 1);
801
802 # Comments we are wacking completly including the begin
803 # and end, all to $;.
804 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
805 $sanitise_quote = '*/';
806
807 substr($res, $off, 2, "$;$;");
808 $off++;
809 next;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800810 }
Andy Whitcroft81bc0e02008-10-15 22:02:26 -0700811 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700812 $sanitise_quote = '';
813 substr($res, $off, 2, "$;$;");
814 $off++;
815 next;
816 }
Daniel Walker113f04a2009-09-21 17:04:35 -0700817 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
818 $sanitise_quote = '//';
819
820 substr($res, $off, 2, $sanitise_quote);
821 $off++;
822 next;
823 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700824
825 # A \ in a string means ignore the next character.
826 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
827 $c eq "\\") {
828 substr($res, $off, 2, 'XX');
829 $off++;
830 next;
831 }
832 # Regular quotes.
833 if ($c eq "'" || $c eq '"') {
834 if ($sanitise_quote eq '') {
835 $sanitise_quote = $c;
836
837 substr($res, $off, 1, $c);
Andy Whitcroft00df3442007-06-08 13:47:06 -0700838 next;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700839 } elsif ($sanitise_quote eq $c) {
840 $sanitise_quote = '';
Andy Whitcroft00df3442007-06-08 13:47:06 -0700841 }
842 }
Andy Whitcroft773647a2008-03-28 14:15:58 -0700843
Andy Whitcroftfae17da2009-01-06 14:41:20 -0800844 #print "c<$c> SQ<$sanitise_quote>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -0700845 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
846 substr($res, $off, 1, $;);
Daniel Walker113f04a2009-09-21 17:04:35 -0700847 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
848 substr($res, $off, 1, $;);
Andy Whitcroft773647a2008-03-28 14:15:58 -0700849 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
850 substr($res, $off, 1, 'X');
Andy Whitcroft00df3442007-06-08 13:47:06 -0700851 } else {
Andy Whitcroft773647a2008-03-28 14:15:58 -0700852 substr($res, $off, 1, $c);
Andy Whitcroft00df3442007-06-08 13:47:06 -0700853 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800854 }
855
Daniel Walker113f04a2009-09-21 17:04:35 -0700856 if ($sanitise_quote eq '//') {
857 $sanitise_quote = '';
858 }
859
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800860 # The pathname on a #include may be surrounded by '<' and '>'.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700861 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800862 my $clean = 'X' x length($1);
863 $res =~ s@\<.*\>@<$clean>@;
864
865 # The whole of a #error is a string.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700866 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800867 my $clean = 'X' x length($1);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -0700868 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800869 }
870
Andy Whitcroft00df3442007-06-08 13:47:06 -0700871 return $res;
872}
873
Joe Perchesa6962d72013-04-29 16:18:13 -0700874sub get_quoted_string {
875 my ($line, $rawline) = @_;
876
877 return "" if ($line !~ m/(\"[X]+\")/g);
878 return substr($rawline, $-[0], $+[0] - $-[0]);
879}
880
Andy Whitcroft8905a672007-11-28 16:21:06 -0800881sub ctx_statement_block {
882 my ($linenr, $remain, $off) = @_;
883 my $line = $linenr - 1;
884 my $blk = '';
885 my $soff = $off;
886 my $coff = $off - 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700887 my $coff_set = 0;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800888
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800889 my $loff = 0;
890
Andy Whitcroft8905a672007-11-28 16:21:06 -0800891 my $type = '';
892 my $level = 0;
Andy Whitcrofta2750642009-01-15 13:51:04 -0800893 my @stack = ();
Andy Whitcroftcf655042008-03-04 14:28:20 -0800894 my $p;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800895 my $c;
896 my $len = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800897
898 my $remainder;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800899 while (1) {
Andy Whitcrofta2750642009-01-15 13:51:04 -0800900 @stack = (['', 0]) if ($#stack == -1);
901
Andy Whitcroft773647a2008-03-28 14:15:58 -0700902 #warn "CSB: blk<$blk> remain<$remain>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800903 # If we are about to drop off the end, pull in more
904 # context.
905 if ($off >= $len) {
906 for (; $remain > 0; $line++) {
Andy Whitcroftdea33492008-10-15 22:02:25 -0700907 last if (!defined $lines[$line]);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800908 next if ($lines[$line] =~ /^-/);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800909 $remain--;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800910 $loff = $len;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -0800911 $blk .= $lines[$line] . "\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800912 $len = length($blk);
913 $line++;
914 last;
915 }
916 # Bail if there is no further context.
917 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800918 if ($off >= $len) {
Andy Whitcroft8905a672007-11-28 16:21:06 -0800919 last;
920 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800921 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
922 $level++;
923 $type = '#';
924 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800925 }
Andy Whitcroftcf655042008-03-04 14:28:20 -0800926 $p = $c;
Andy Whitcroft8905a672007-11-28 16:21:06 -0800927 $c = substr($blk, $off, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800928 $remainder = substr($blk, $off);
Andy Whitcroft8905a672007-11-28 16:21:06 -0800929
Andy Whitcroft773647a2008-03-28 14:15:58 -0700930 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
Andy Whitcroft4635f4f2009-01-06 14:41:27 -0800931
932 # Handle nested #if/#else.
933 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
934 push(@stack, [ $type, $level ]);
935 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
936 ($type, $level) = @{$stack[$#stack - 1]};
937 } elsif ($remainder =~ /^#\s*endif\b/) {
938 ($type, $level) = @{pop(@stack)};
939 }
940
Andy Whitcroft8905a672007-11-28 16:21:06 -0800941 # Statement ends at the ';' or a close '}' at the
942 # outermost level.
943 if ($level == 0 && $c eq ';') {
944 last;
945 }
946
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800947 # An else is really a conditional as long as its not else if
Andy Whitcroft773647a2008-03-28 14:15:58 -0700948 if ($level == 0 && $coff_set == 0 &&
949 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
950 $remainder =~ /^(else)(?:\s|{)/ &&
951 $remainder !~ /^else\s+if\b/) {
952 $coff = $off + length($1) - 1;
953 $coff_set = 1;
954 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
955 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800956 }
957
Andy Whitcroft8905a672007-11-28 16:21:06 -0800958 if (($type eq '' || $type eq '(') && $c eq '(') {
959 $level++;
960 $type = '(';
961 }
962 if ($type eq '(' && $c eq ')') {
963 $level--;
964 $type = ($level != 0)? '(' : '';
965
966 if ($level == 0 && $coff < $soff) {
967 $coff = $off;
Andy Whitcroft773647a2008-03-28 14:15:58 -0700968 $coff_set = 1;
969 #warn "CSB: mark coff<$coff>\n";
Andy Whitcroft8905a672007-11-28 16:21:06 -0800970 }
971 }
972 if (($type eq '' || $type eq '{') && $c eq '{') {
973 $level++;
974 $type = '{';
975 }
976 if ($type eq '{' && $c eq '}') {
977 $level--;
978 $type = ($level != 0)? '{' : '';
979
980 if ($level == 0) {
Patrick Pannutob998e002010-08-09 17:21:03 -0700981 if (substr($blk, $off + 1, 1) eq ';') {
982 $off++;
983 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800984 last;
985 }
986 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -0800987 # Preprocessor commands end at the newline unless escaped.
988 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
989 $level--;
990 $type = '';
991 $off++;
992 last;
993 }
Andy Whitcroft8905a672007-11-28 16:21:06 -0800994 $off++;
995 }
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700996 # We are truly at the end, so shuffle to the next line.
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800997 if ($off == $len) {
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -0700998 $loff = $len + 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -0800999 $line++;
1000 $remain--;
1001 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001002
1003 my $statement = substr($blk, $soff, $off - $soff + 1);
1004 my $condition = substr($blk, $soff, $coff - $soff + 1);
1005
1006 #warn "STATEMENT<$statement>\n";
1007 #warn "CONDITION<$condition>\n";
1008
Andy Whitcroft773647a2008-03-28 14:15:58 -07001009 #print "coff<$coff> soff<$off> loff<$loff>\n";
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001010
1011 return ($statement, $condition,
1012 $line, $remain + 1, $off - $loff + 1, $level);
1013}
1014
Andy Whitcroftcf655042008-03-04 14:28:20 -08001015sub statement_lines {
1016 my ($stmt) = @_;
1017
1018 # Strip the diff line prefixes and rip blank lines at start and end.
1019 $stmt =~ s/(^|\n)./$1/g;
1020 $stmt =~ s/^\s*//;
1021 $stmt =~ s/\s*$//;
1022
1023 my @stmt_lines = ($stmt =~ /\n/g);
1024
1025 return $#stmt_lines + 2;
1026}
1027
1028sub statement_rawlines {
1029 my ($stmt) = @_;
1030
1031 my @stmt_lines = ($stmt =~ /\n/g);
1032
1033 return $#stmt_lines + 2;
1034}
1035
1036sub statement_block_size {
1037 my ($stmt) = @_;
1038
1039 $stmt =~ s/(^|\n)./$1/g;
1040 $stmt =~ s/^\s*{//;
1041 $stmt =~ s/}\s*$//;
1042 $stmt =~ s/^\s*//;
1043 $stmt =~ s/\s*$//;
1044
1045 my @stmt_lines = ($stmt =~ /\n/g);
1046 my @stmt_statements = ($stmt =~ /;/g);
1047
1048 my $stmt_lines = $#stmt_lines + 2;
1049 my $stmt_statements = $#stmt_statements + 1;
1050
1051 if ($stmt_lines > $stmt_statements) {
1052 return $stmt_lines;
1053 } else {
1054 return $stmt_statements;
1055 }
1056}
1057
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001058sub ctx_statement_full {
1059 my ($linenr, $remain, $off) = @_;
1060 my ($statement, $condition, $level);
1061
1062 my (@chunks);
1063
Andy Whitcroftcf655042008-03-04 14:28:20 -08001064 # Grab the first conditional/block pair.
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001065 ($statement, $condition, $linenr, $remain, $off, $level) =
1066 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001067 #print "F: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08001068 push(@chunks, [ $condition, $statement ]);
1069 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1070 return ($level, $linenr, @chunks);
1071 }
1072
1073 # Pull in the following conditional/block pairs and see if they
1074 # could continue the statement.
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001075 for (;;) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001076 ($statement, $condition, $linenr, $remain, $off, $level) =
1077 ctx_statement_block($linenr, $remain, $off);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001078 #print "C: c<$condition> s<$statement> remain<$remain>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07001079 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
Andy Whitcroftcf655042008-03-04 14:28:20 -08001080 #print "C: push\n";
1081 push(@chunks, [ $condition, $statement ]);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001082 }
1083
1084 return ($level, $linenr, @chunks);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001085}
1086
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001087sub ctx_block_get {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001088 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001089 my $line;
1090 my $start = $linenr - 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001091 my $blk = '';
1092 my @o;
1093 my @c;
1094 my @res = ();
1095
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001096 my $level = 0;
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001097 my @stack = ($level);
Andy Whitcroft00df3442007-06-08 13:47:06 -07001098 for ($line = $start; $remain > 0; $line++) {
1099 next if ($rawlines[$line] =~ /^-/);
1100 $remain--;
1101
1102 $blk .= $rawlines[$line];
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001103
1104 # Handle nested #if/#else.
Andy Whitcroft01464f32010-10-26 14:23:19 -07001105 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001106 push(@stack, $level);
Andy Whitcroft01464f32010-10-26 14:23:19 -07001107 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001108 $level = $stack[$#stack - 1];
Andy Whitcroft01464f32010-10-26 14:23:19 -07001109 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
Andy Whitcroft4635f4f2009-01-06 14:41:27 -08001110 $level = pop(@stack);
1111 }
1112
Andy Whitcroft01464f32010-10-26 14:23:19 -07001113 foreach my $c (split(//, $lines[$line])) {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001114 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1115 if ($off > 0) {
1116 $off--;
1117 next;
1118 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001119
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001120 if ($c eq $close && $level > 0) {
1121 $level--;
1122 last if ($level == 0);
1123 } elsif ($c eq $open) {
1124 $level++;
1125 }
1126 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001127
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001128 if (!$outer || $level <= 1) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07001129 push(@res, $rawlines[$line]);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001130 }
1131
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001132 last if ($level == 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001133 }
1134
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001135 return ($level, @res);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001136}
1137sub ctx_block_outer {
1138 my ($linenr, $remain) = @_;
1139
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001140 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1141 return @r;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001142}
1143sub ctx_block {
1144 my ($linenr, $remain) = @_;
1145
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001146 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1147 return @r;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001148}
1149sub ctx_statement {
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001150 my ($linenr, $remain, $off) = @_;
1151
1152 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1153 return @r;
1154}
1155sub ctx_block_level {
Andy Whitcroft653d4872007-06-23 17:16:34 -07001156 my ($linenr, $remain) = @_;
1157
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001158 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001159}
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001160sub ctx_statement_level {
1161 my ($linenr, $remain, $off) = @_;
1162
1163 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1164}
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001165
1166sub ctx_locate_comment {
1167 my ($first_line, $end_line) = @_;
1168
1169 # Catch a comment on the end of the line itself.
Andy Whitcroftbeae6332008-07-23 21:28:59 -07001170 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001171 return $current_comment if (defined $current_comment);
1172
1173 # Look through the context and try and figure out if there is a
1174 # comment.
1175 my $in_comment = 0;
1176 $current_comment = '';
1177 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07001178 my $line = $rawlines[$linenr - 1];
1179 #warn " $line\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001180 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1181 $in_comment = 1;
1182 }
1183 if ($line =~ m@/\*@) {
1184 $in_comment = 1;
1185 }
1186 if (!$in_comment && $current_comment ne '') {
1187 $current_comment = '';
1188 }
1189 $current_comment .= $line . "\n" if ($in_comment);
1190 if ($line =~ m@\*/@) {
1191 $in_comment = 0;
1192 }
1193 }
1194
1195 chomp($current_comment);
1196 return($current_comment);
1197}
1198sub ctx_has_comment {
1199 my ($first_line, $end_line) = @_;
1200 my $cmt = ctx_locate_comment($first_line, $end_line);
1201
Andy Whitcroft00df3442007-06-08 13:47:06 -07001202 ##print "LINE: $rawlines[$end_line - 1 ]\n";
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001203 ##print "CMMT: $cmt\n";
1204
1205 return ($cmt ne '');
1206}
1207
Andy Whitcroft4d001e42008-10-15 22:02:21 -07001208sub raw_line {
1209 my ($linenr, $cnt) = @_;
1210
1211 my $offset = $linenr - 1;
1212 $cnt++;
1213
1214 my $line;
1215 while ($cnt) {
1216 $line = $rawlines[$offset++];
1217 next if (defined($line) && $line =~ /^-/);
1218 $cnt--;
1219 }
1220
1221 return $line;
1222}
1223
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001224sub cat_vet {
1225 my ($vet) = @_;
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001226 my ($res, $coded);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001227
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001228 $res = '';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001229 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1230 $res .= $1;
1231 if ($2 ne '') {
1232 $coded = sprintf("^%c", unpack('C', $2) + 64);
1233 $res .= $coded;
1234 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001235 }
1236 $res =~ s/$/\$/;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001237
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07001238 return $res;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001239}
1240
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001241my $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001242my $av_pending;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001243my @av_paren_type;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001244my $av_pend_colon;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001245
1246sub annotate_reset {
1247 $av_preprocessor = 0;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001248 $av_pending = '_';
1249 @av_paren_type = ('E');
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001250 $av_pend_colon = 'O';
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001251}
1252
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001253sub annotate_values {
1254 my ($stream, $type) = @_;
1255
1256 my $res;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001257 my $var = '_' x length($stream);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001258 my $cur = $stream;
1259
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001260 print "$stream\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001261
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001262 while (length($cur)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001263 @av_paren_type = ('E') if ($#av_paren_type < 0);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001264 print " <" . join('', @av_paren_type) .
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001265 "> <$type> <$av_pending>" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001266 if ($cur =~ /^(\s+)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001267 print "WS($1)\n" if ($dbg_values > 1);
1268 if ($1 =~ /\n/ && $av_preprocessor) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001269 $type = pop(@av_paren_type);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001270 $av_preprocessor = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001271 }
1272
Florian Micklerc023e4732011-01-12 16:59:58 -08001273 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001274 print "CAST($1)\n" if ($dbg_values > 1);
1275 push(@av_paren_type, $type);
Andy Whitcroftaddcdce2012-01-10 15:10:11 -08001276 $type = 'c';
Andy Whitcroft9446ef52010-10-26 14:23:13 -07001277
Andy Whitcrofte91b6e22010-10-26 14:23:11 -07001278 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001279 print "DECLARE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001280 $type = 'T';
1281
Andy Whitcroft389a2fe2008-07-23 21:29:05 -07001282 } elsif ($cur =~ /^($Modifier)\s*/) {
1283 print "MODIFIER($1)\n" if ($dbg_values > 1);
1284 $type = 'T';
1285
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001286 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001287 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001288 $av_preprocessor = 1;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001289 push(@av_paren_type, $type);
1290 if ($2 ne '') {
1291 $av_pending = 'N';
1292 }
1293 $type = 'E';
1294
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001295 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001296 print "UNDEF($1)\n" if ($dbg_values > 1);
1297 $av_preprocessor = 1;
1298 push(@av_paren_type, $type);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001299
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001300 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001301 print "PRE_START($1)\n" if ($dbg_values > 1);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001302 $av_preprocessor = 1;
Andy Whitcroftcf655042008-03-04 14:28:20 -08001303
1304 push(@av_paren_type, $type);
1305 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001306 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001307
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001308 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001309 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1310 $av_preprocessor = 1;
1311
1312 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1313
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001314 $type = 'E';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001315
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001316 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001317 print "PRE_END($1)\n" if ($dbg_values > 1);
1318
1319 $av_preprocessor = 1;
1320
1321 # Assume all arms of the conditional end as this
1322 # one does, and continue as if the #endif was not here.
1323 pop(@av_paren_type);
1324 push(@av_paren_type, $type);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001325 $type = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001326
1327 } elsif ($cur =~ /^(\\\n)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001328 print "PRECONT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001329
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001330 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1331 print "ATTR($1)\n" if ($dbg_values > 1);
1332 $av_pending = $type;
1333 $type = 'N';
1334
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001335 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001336 print "SIZEOF($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001337 if (defined $2) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001338 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001339 }
1340 $type = 'N';
1341
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001342 } elsif ($cur =~ /^(if|while|for)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001343 print "COND($1)\n" if ($dbg_values > 1);
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001344 $av_pending = 'E';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001345 $type = 'N';
1346
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001347 } elsif ($cur =~/^(case)/o) {
1348 print "CASE($1)\n" if ($dbg_values > 1);
1349 $av_pend_colon = 'C';
1350 $type = 'N';
1351
Andy Whitcroft14b111c2008-10-15 22:02:16 -07001352 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001353 print "KEYWORD($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001354 $type = 'N';
1355
1356 } elsif ($cur =~ /^(\()/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001357 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroftcf655042008-03-04 14:28:20 -08001358 push(@av_paren_type, $av_pending);
1359 $av_pending = '_';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001360 $type = 'N';
1361
1362 } elsif ($cur =~ /^(\))/o) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08001363 my $new_type = pop(@av_paren_type);
1364 if ($new_type ne '_') {
1365 $type = $new_type;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001366 print "PAREN('$1') -> $type\n"
1367 if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001368 } else {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001369 print "PAREN('$1')\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001370 }
1371
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001372 } elsif ($cur =~ /^($Ident)\s*\(/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001373 print "FUNC($1)\n" if ($dbg_values > 1);
Andy Whitcroftc8cb2ca2008-07-23 21:28:57 -07001374 $type = 'V';
Andy Whitcroftcf655042008-03-04 14:28:20 -08001375 $av_pending = 'V';
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001376
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001377 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1378 if (defined $2 && $type eq 'C' || $type eq 'T') {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001379 $av_pend_colon = 'B';
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001380 } elsif ($type eq 'E') {
1381 $av_pend_colon = 'L';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001382 }
1383 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1384 $type = 'V';
1385
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001386 } elsif ($cur =~ /^($Ident|$Constant)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001387 print "IDENT($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001388 $type = 'V';
1389
1390 } elsif ($cur =~ /^($Assignment)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001391 print "ASSIGN($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001392 $type = 'N';
1393
Andy Whitcroftcf655042008-03-04 14:28:20 -08001394 } elsif ($cur =~/^(;|{|})/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001395 print "END($1)\n" if ($dbg_values > 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001396 $type = 'E';
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001397 $av_pend_colon = 'O';
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001398
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001399 } elsif ($cur =~/^(,)/) {
1400 print "COMMA($1)\n" if ($dbg_values > 1);
1401 $type = 'C';
1402
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001403 } elsif ($cur =~ /^(\?)/o) {
1404 print "QUESTION($1)\n" if ($dbg_values > 1);
1405 $type = 'N';
1406
1407 } elsif ($cur =~ /^(:)/o) {
1408 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1409
1410 substr($var, length($res), 1, $av_pend_colon);
1411 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1412 $type = 'E';
1413 } else {
1414 $type = 'N';
1415 }
1416 $av_pend_colon = 'O';
1417
Andy Whitcroft8e761b02009-01-06 14:41:19 -08001418 } elsif ($cur =~ /^(\[)/o) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001419 print "CLOSE($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001420 $type = 'N';
1421
Andy Whitcroft0d413862008-10-15 22:02:16 -07001422 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
Andy Whitcroft74048ed2008-07-23 21:29:10 -07001423 my $variant;
1424
1425 print "OPV($1)\n" if ($dbg_values > 1);
1426 if ($type eq 'V') {
1427 $variant = 'B';
1428 } else {
1429 $variant = 'U';
1430 }
1431
1432 substr($var, length($res), 1, $variant);
1433 $type = 'N';
1434
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001435 } elsif ($cur =~ /^($Operators)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001436 print "OP($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001437 if ($1 ne '++' && $1 ne '--') {
1438 $type = 'N';
1439 }
1440
1441 } elsif ($cur =~ /(^.)/o) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001442 print "C($1)\n" if ($dbg_values > 1);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001443 }
1444 if (defined $1) {
1445 $cur = substr($cur, length($1));
1446 $res .= $type x length($1);
1447 }
1448 }
1449
Andy Whitcroft1f65f942008-07-23 21:29:10 -07001450 return ($res, $var);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001451}
1452
Andy Whitcroft8905a672007-11-28 16:21:06 -08001453sub possible {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001454 my ($possible, $line) = @_;
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001455 my $notPermitted = qr{(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001456 ^(?:
1457 $Modifier|
1458 $Storage|
1459 $Type|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001460 DEFINE_\S+
1461 )$|
1462 ^(?:
Andy Whitcroft0776e592008-10-15 22:02:29 -07001463 goto|
1464 return|
1465 case|
1466 else|
1467 asm|__asm__|
Andy Whitcroft89a88352012-01-10 15:10:00 -08001468 do|
1469 \#|
1470 \#\#|
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001471 )(?:\s|$)|
Andy Whitcroft0776e592008-10-15 22:02:29 -07001472 ^(?:typedef|struct|enum)\b
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001473 )}x;
1474 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1475 if ($possible !~ $notPermitted) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001476 # Check for modifiers.
1477 $possible =~ s/\s*$Storage\s*//g;
1478 $possible =~ s/\s*$Sparse\s*//g;
1479 if ($possible =~ /^\s*$/) {
1480
1481 } elsif ($possible =~ /\s/) {
1482 $possible =~ s/\s*$Type\s*//g;
Andy Whitcroftd2506582008-07-23 21:29:09 -07001483 for my $modifier (split(' ', $possible)) {
Andy Whitcroft9a974fd2009-10-26 16:50:12 -07001484 if ($modifier !~ $notPermitted) {
1485 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1486 push(@modifierList, $modifier);
1487 }
Andy Whitcroftd2506582008-07-23 21:29:09 -07001488 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001489
1490 } else {
1491 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1492 push(@typeList, $possible);
1493 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001494 build_types();
Andy Whitcroft0776e592008-10-15 22:02:29 -07001495 } else {
1496 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08001497 }
1498}
1499
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001500my $prefix = '';
1501
Joe Perches000d1cc12011-07-25 17:13:25 -07001502sub show_type {
Joe Perchescbec18a2014-04-03 14:49:19 -07001503 my ($type) = @_;
Joe Perches91bfe482013-09-11 14:23:59 -07001504
Joe Perchescbec18a2014-04-03 14:49:19 -07001505 return defined $use_type{$type} if (scalar keys %use_type > 0);
1506
1507 return !defined $ignore_type{$type};
Joe Perches000d1cc12011-07-25 17:13:25 -07001508}
1509
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001510sub report {
Joe Perchescbec18a2014-04-03 14:49:19 -07001511 my ($level, $type, $msg) = @_;
1512
1513 if (!show_type($type) ||
1514 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001515 return 0;
1516 }
Joe Perches000d1cc12011-07-25 17:13:25 -07001517 my $line;
1518 if ($show_types) {
Joe Perchescbec18a2014-04-03 14:49:19 -07001519 $line = "$prefix$level:$type: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001520 } else {
Joe Perchescbec18a2014-04-03 14:49:19 -07001521 $line = "$prefix$level: $msg\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07001522 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08001523 $line = (split('\n', $line))[0] . "\n" if ($terse);
1524
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001525 push(our @report, $line);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001526
1527 return 1;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001528}
Joe Perchescbec18a2014-04-03 14:49:19 -07001529
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001530sub report_dump {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001531 our @report;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07001532}
Joe Perches000d1cc12011-07-25 17:13:25 -07001533
Joe Perchesd752fcc2014-08-06 16:11:05 -07001534sub fixup_current_range {
1535 my ($lineRef, $offset, $length) = @_;
1536
1537 if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
1538 my $o = $1;
1539 my $l = $2;
1540 my $no = $o + $offset;
1541 my $nl = $l + $length;
1542 $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
1543 }
1544}
1545
1546sub fix_inserted_deleted_lines {
1547 my ($linesRef, $insertedRef, $deletedRef) = @_;
1548
1549 my $range_last_linenr = 0;
1550 my $delta_offset = 0;
1551
1552 my $old_linenr = 0;
1553 my $new_linenr = 0;
1554
1555 my $next_insert = 0;
1556 my $next_delete = 0;
1557
1558 my @lines = ();
1559
1560 my $inserted = @{$insertedRef}[$next_insert++];
1561 my $deleted = @{$deletedRef}[$next_delete++];
1562
1563 foreach my $old_line (@{$linesRef}) {
1564 my $save_line = 1;
1565 my $line = $old_line; #don't modify the array
1566 if ($line =~ /^(?:\+\+\+\|\-\-\-)\s+\S+/) { #new filename
1567 $delta_offset = 0;
1568 } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk
1569 $range_last_linenr = $new_linenr;
1570 fixup_current_range(\$line, $delta_offset, 0);
1571 }
1572
1573 while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
1574 $deleted = @{$deletedRef}[$next_delete++];
1575 $save_line = 0;
1576 fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
1577 }
1578
1579 while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
1580 push(@lines, ${$inserted}{'LINE'});
1581 $inserted = @{$insertedRef}[$next_insert++];
1582 $new_linenr++;
1583 fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
1584 }
1585
1586 if ($save_line) {
1587 push(@lines, $line);
1588 $new_linenr++;
1589 }
1590
1591 $old_linenr++;
1592 }
1593
1594 return @lines;
1595}
1596
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07001597sub fix_insert_line {
1598 my ($linenr, $line) = @_;
1599
1600 my $inserted = {
1601 LINENR => $linenr,
1602 LINE => $line,
1603 };
1604 push(@fixed_inserted, $inserted);
1605}
1606
1607sub fix_delete_line {
1608 my ($linenr, $line) = @_;
1609
1610 my $deleted = {
1611 LINENR => $linenr,
1612 LINE => $line,
1613 };
1614
1615 push(@fixed_deleted, $deleted);
1616}
1617
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001618sub ERROR {
Joe Perchescbec18a2014-04-03 14:49:19 -07001619 my ($type, $msg) = @_;
1620
1621 if (report("ERROR", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001622 our $clean = 0;
1623 our $cnt_error++;
Joe Perches3705ce52013-07-03 15:05:31 -07001624 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001625 }
Joe Perches3705ce52013-07-03 15:05:31 -07001626 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001627}
1628sub WARN {
Joe Perchescbec18a2014-04-03 14:49:19 -07001629 my ($type, $msg) = @_;
1630
1631 if (report("WARNING", $type, $msg)) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001632 our $clean = 0;
1633 our $cnt_warn++;
Joe Perches3705ce52013-07-03 15:05:31 -07001634 return 1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001635 }
Joe Perches3705ce52013-07-03 15:05:31 -07001636 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001637}
1638sub CHK {
Joe Perchescbec18a2014-04-03 14:49:19 -07001639 my ($type, $msg) = @_;
1640
1641 if ($check && report("CHECK", $type, $msg)) {
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001642 our $clean = 0;
1643 our $cnt_chk++;
Joe Perches3705ce52013-07-03 15:05:31 -07001644 return 1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001645 }
Joe Perches3705ce52013-07-03 15:05:31 -07001646 return 0;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001647}
1648
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001649sub check_absolute_file {
1650 my ($absolute, $herecurr) = @_;
1651 my $file = $absolute;
1652
1653 ##print "absolute<$absolute>\n";
1654
1655 # See if any suffix of this path is a path within the tree.
1656 while ($file =~ s@^[^/]*/@@) {
1657 if (-f "$root/$file") {
1658 ##print "file<$file>\n";
1659 last;
1660 }
1661 }
1662 if (! -f _) {
1663 return 0;
1664 }
1665
1666 # It is, so see if the prefix is acceptable.
1667 my $prefix = $absolute;
1668 substr($prefix, -length($file)) = '';
1669
1670 ##print "prefix<$prefix>\n";
1671 if ($prefix ne ".../") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001672 WARN("USE_RELATIVE_PATH",
1673 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07001674 }
1675}
1676
Joe Perches3705ce52013-07-03 15:05:31 -07001677sub trim {
1678 my ($string) = @_;
1679
Joe Perchesb34c6482013-09-11 14:24:01 -07001680 $string =~ s/^\s+|\s+$//g;
1681
1682 return $string;
1683}
1684
1685sub ltrim {
1686 my ($string) = @_;
1687
1688 $string =~ s/^\s+//;
1689
1690 return $string;
1691}
1692
1693sub rtrim {
1694 my ($string) = @_;
1695
1696 $string =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07001697
1698 return $string;
1699}
1700
Joe Perches52ea8502013-11-12 15:10:09 -08001701sub string_find_replace {
1702 my ($string, $find, $replace) = @_;
1703
1704 $string =~ s/$find/$replace/g;
1705
1706 return $string;
1707}
1708
Joe Perches3705ce52013-07-03 15:05:31 -07001709sub tabify {
1710 my ($leading) = @_;
1711
1712 my $source_indent = 8;
1713 my $max_spaces_before_tab = $source_indent - 1;
1714 my $spaces_to_tab = " " x $source_indent;
1715
1716 #convert leading spaces to tabs
1717 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
1718 #Remove spaces before a tab
1719 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
1720
1721 return "$leading";
1722}
1723
Joe Perchesd1fe9c02012-03-23 15:02:16 -07001724sub pos_last_openparen {
1725 my ($line) = @_;
1726
1727 my $pos = 0;
1728
1729 my $opens = $line =~ tr/\(/\(/;
1730 my $closes = $line =~ tr/\)/\)/;
1731
1732 my $last_openparen = 0;
1733
1734 if (($opens == 0) || ($closes >= $opens)) {
1735 return -1;
1736 }
1737
1738 my $len = length($line);
1739
1740 for ($pos = 0; $pos < $len; $pos++) {
1741 my $string = substr($line, $pos);
1742 if ($string =~ /^($FuncArg|$balanced_parens)/) {
1743 $pos += length($1) - 1;
1744 } elsif (substr($line, $pos, 1) eq '(') {
1745 $last_openparen = $pos;
1746 } elsif (index($string, '(') == -1) {
1747 last;
1748 }
1749 }
1750
Joe Perches91cb5192014-04-03 14:49:32 -07001751 return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07001752}
1753
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001754sub process {
1755 my $filename = shift;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001756
1757 my $linenr=0;
1758 my $prevline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001759 my $prevrawline="";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001760 my $stashline="";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001761 my $stashrawline="";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001762
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001763 my $length;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001764 my $indent;
1765 my $previndent=0;
1766 my $stashindent=0;
1767
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001768 our $clean = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001769 my $signoff = 0;
1770 my $is_patch = 0;
1771
Joe Perches29ee1b02014-08-06 16:10:35 -07001772 my $in_header_lines = $file ? 0 : 1;
Joe Perches15662b32011-10-31 17:13:12 -07001773 my $in_commit_log = 0; #Scanning lines before patch
Joe Perches13f19372014-08-06 16:10:59 -07001774 my $reported_maintainer_file = 0;
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07001775 my $non_utf8_charset = 0;
1776
Joe Perches365dd4e2014-08-06 16:10:42 -07001777 my $last_blank_line = 0;
1778
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001779 our @report = ();
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001780 our $cnt_lines = 0;
1781 our $cnt_error = 0;
1782 our $cnt_warn = 0;
1783 our $cnt_chk = 0;
1784
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001785 # Trace the real file/line as we go.
1786 my $realfile = '';
1787 my $realline = 0;
1788 my $realcnt = 0;
1789 my $here = '';
1790 my $in_comment = 0;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001791 my $comment_edge = 0;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001792 my $first_line = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001793 my $p1_prefix = '';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001794
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001795 my $prev_values = 'E';
1796
1797 # suppression flags
Andy Whitcroft773647a2008-03-28 14:15:58 -07001798 my %suppress_ifbraces;
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001799 my %suppress_whiletrailers;
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001800 my %suppress_export;
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001801 my $suppress_statement = 0;
Andy Whitcroft653d4872007-06-23 17:16:34 -07001802
Joe Perches7e51f192013-09-11 14:23:57 -07001803 my %signatures = ();
Joe Perches323c1262012-12-17 16:02:07 -08001804
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001805 # Pre-scan the patch sanitizing the lines.
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001806 # Pre-scan the patch looking for any __setup documentation.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001807 #
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001808 my @setup_docs = ();
1809 my $setup_docs = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001810
Joe Perchesd8b07712013-11-12 15:10:06 -08001811 my $camelcase_file_seeded = 0;
1812
Andy Whitcroft773647a2008-03-28 14:15:58 -07001813 sanitise_line_reset();
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001814 my $line;
1815 foreach my $rawline (@rawlines) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001816 $linenr++;
1817 $line = $rawline;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001818
Joe Perches3705ce52013-07-03 15:05:31 -07001819 push(@fixed, $rawline) if ($fix);
1820
Andy Whitcroft773647a2008-03-28 14:15:58 -07001821 if ($rawline=~/^\+\+\+\s+(\S+)/) {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001822 $setup_docs = 0;
1823 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1824 $setup_docs = 1;
1825 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001826 #next;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001827 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001828 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1829 $realline=$1-1;
1830 if (defined $2) {
1831 $realcnt=$3+1;
1832 } else {
1833 $realcnt=1+1;
1834 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07001835 $in_comment = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001836
1837 # Guestimate if this is a continuing comment. Run
1838 # the context looking for a comment "edge". If this
1839 # edge is a close comment then we must be in a comment
1840 # at context start.
1841 my $edge;
Andy Whitcroft01fa9142008-10-15 22:02:19 -07001842 my $cnt = $realcnt;
1843 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1844 next if (defined $rawlines[$ln - 1] &&
1845 $rawlines[$ln - 1] =~ /^-/);
1846 $cnt--;
1847 #print "RAW<$rawlines[$ln - 1]>\n";
Andy Whitcroft721c1cb2009-01-06 14:41:16 -08001848 last if (!defined $rawlines[$ln - 1]);
Andy Whitcroftfae17da2009-01-06 14:41:20 -08001849 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1850 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1851 ($edge) = $1;
1852 last;
1853 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001854 }
1855 if (defined $edge && $edge eq '*/') {
1856 $in_comment = 1;
1857 }
1858
1859 # Guestimate if this is a continuing comment. If this
1860 # is the start of a diff block and this line starts
1861 # ' *' then it is very likely a comment.
1862 if (!defined $edge &&
Andy Whitcroft83242e02009-01-06 14:41:17 -08001863 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
Andy Whitcroft773647a2008-03-28 14:15:58 -07001864 {
1865 $in_comment = 1;
1866 }
1867
1868 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1869 sanitise_line_reset($in_comment);
1870
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001871 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001872 # Standardise the strings and chars within the input to
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07001873 # simplify matching -- only bother with positive lines.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001874 $line = sanitise_line($rawline);
1875 }
1876 push(@lines, $line);
1877
1878 if ($realcnt > 1) {
1879 $realcnt-- if ($line =~ /^(?:\+| |$)/);
1880 } else {
1881 $realcnt = 0;
1882 }
1883
1884 #print "==>$rawline\n";
1885 #print "-->$line\n";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07001886
1887 if ($setup_docs && $line =~ /^\+/) {
1888 push(@setup_docs, $line);
1889 }
1890 }
1891
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001892 $prefix = '';
1893
Andy Whitcroft773647a2008-03-28 14:15:58 -07001894 $realcnt = 0;
1895 $linenr = 0;
Joe Perches194f66f2014-08-06 16:11:03 -07001896 $fixlinenr = -1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001897 foreach my $line (@lines) {
1898 $linenr++;
Joe Perches194f66f2014-08-06 16:11:03 -07001899 $fixlinenr++;
Joe Perches1b5539b2013-09-11 14:24:03 -07001900 my $sline = $line; #copy of $line
1901 $sline =~ s/$;/ /g; #with comments as spaces
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001902
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001903 my $rawline = $rawlines[$linenr - 1];
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001904
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001905#extract the line range in the file after the patch is applied
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001906 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001907 $is_patch = 1;
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001908 $first_line = $linenr + 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001909 $realline=$1-1;
1910 if (defined $2) {
1911 $realcnt=$3+1;
1912 } else {
1913 $realcnt=1+1;
1914 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001915 annotate_reset();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08001916 $prev_values = 'E';
1917
Andy Whitcroft773647a2008-03-28 14:15:58 -07001918 %suppress_ifbraces = ();
Andy Whitcroft170d3a22008-10-15 22:02:30 -07001919 %suppress_whiletrailers = ();
Andy Whitcroft2b474a12009-10-26 16:50:16 -07001920 %suppress_export = ();
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08001921 $suppress_statement = 0;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001922 next;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001923
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001924# track the line number as we move through the hunk, note that
1925# new versions of GNU diff omit the leading space on completely
1926# blank context lines so we need to count that too.
Andy Whitcroft773647a2008-03-28 14:15:58 -07001927 } elsif ($line =~ /^( |\+|$)/) {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001928 $realline++;
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001929 $realcnt-- if ($realcnt != 0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001930
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07001931 # Measure the line length and indent.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001932 ($length, $indent) = line_stats($rawline);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001933
1934 # Track the previous line.
1935 ($prevline, $stashline) = ($stashline, $line);
1936 ($previndent, $stashindent) = ($stashindent, $indent);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001937 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1938
Andy Whitcroft773647a2008-03-28 14:15:58 -07001939 #warn "line<$line>\n";
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001940
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07001941 } elsif ($realcnt == 1) {
1942 $realcnt--;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001943 }
1944
Andy Whitcroftcc77cdc2009-10-26 16:50:13 -07001945 my $hunk_line = ($realcnt != 0);
1946
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001947#make up the handle for any error we report on this line
Andy Whitcroft773647a2008-03-28 14:15:58 -07001948 $prefix = "$filename:$realline: " if ($emacs && $file);
1949 $prefix = "$filename:$linenr: " if ($emacs && !$file);
1950
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001951 $here = "#$linenr: " if (!$file);
1952 $here = "#$realline: " if ($file);
Andy Whitcroft773647a2008-03-28 14:15:58 -07001953
Joe Perches2ac73b42014-06-04 16:12:05 -07001954 my $found_file = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07001955 # extract the filename as it passes
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001956 if ($line =~ /^diff --git.*?(\S+)$/) {
1957 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001958 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001959 $in_commit_log = 0;
Joe Perches2ac73b42014-06-04 16:12:05 -07001960 $found_file = 1;
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001961 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07001962 $realfile = $1;
Joe Perches2b7ab452013-11-12 15:10:14 -08001963 $realfile =~ s@^([^/]*)/@@ if (!$file);
Joe Perches270c49a2012-01-10 15:09:50 -08001964 $in_commit_log = 0;
Wolfram Sang1e855722009-01-06 14:41:24 -08001965
1966 $p1_prefix = $1;
Andy Whitcrofte2f7aa42009-02-27 14:03:06 -08001967 if (!$file && $tree && $p1_prefix ne '' &&
1968 -e "$root/$p1_prefix") {
Joe Perches000d1cc12011-07-25 17:13:25 -07001969 WARN("PATCH_PREFIX",
1970 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
Wolfram Sang1e855722009-01-06 14:41:24 -08001971 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001972
Andy Whitcroftc1ab3322008-10-15 22:02:20 -07001973 if ($realfile =~ m@^include/asm/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07001974 ERROR("MODIFIED_INCLUDE_ASM",
1975 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
Andy Whitcroft773647a2008-03-28 14:15:58 -07001976 }
Joe Perches2ac73b42014-06-04 16:12:05 -07001977 $found_file = 1;
1978 }
1979
1980 if ($found_file) {
1981 if ($realfile =~ m@^(drivers/net/|net/)@) {
1982 $check = 1;
1983 } else {
1984 $check = $check_orig;
1985 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07001986 next;
1987 }
1988
Randy Dunlap389834b2007-06-08 13:47:03 -07001989 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001990
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08001991 my $hereline = "$here\n$rawline\n";
1992 my $herecurr = "$here\n$rawline\n";
1993 my $hereprev = "$here\n$prevrawline\n$rawline\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07001994
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07001995 $cnt_lines++ if ($realcnt != 0);
1996
Rabin Vincent3bf9a002010-10-26 14:23:16 -07001997# Check for incorrect file permissions
1998 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1999 my $permhere = $here . "FILE: $realfile\n";
Joe Perches04db4d22013-04-29 16:18:14 -07002000 if ($realfile !~ m@scripts/@ &&
2001 $realfile !~ /\.(py|pl|awk|sh)$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002002 ERROR("EXECUTE_PERMISSIONS",
2003 "do not set execute permissions for source files\n" . $permhere);
Rabin Vincent3bf9a002010-10-26 14:23:16 -07002004 }
2005 }
2006
Joe Perches20112472011-07-25 17:13:23 -07002007# Check the patch for a signoff:
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07002008 if ($line =~ /^\s*signed-off-by:/i) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07002009 $signoff++;
Joe Perches15662b32011-10-31 17:13:12 -07002010 $in_commit_log = 0;
Joe Perches20112472011-07-25 17:13:23 -07002011 }
2012
2013# Check signature styles
Joe Perches270c49a2012-01-10 15:09:50 -08002014 if (!$in_header_lines &&
Joe Perchesce0338df3c2012-07-30 14:41:18 -07002015 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
Joe Perches20112472011-07-25 17:13:23 -07002016 my $space_before = $1;
2017 my $sign_off = $2;
2018 my $space_after = $3;
2019 my $email = $4;
2020 my $ucfirst_sign_off = ucfirst(lc($sign_off));
2021
Joe Perchesce0338df3c2012-07-30 14:41:18 -07002022 if ($sign_off !~ /$signature_tags/) {
2023 WARN("BAD_SIGN_OFF",
2024 "Non-standard signature: $sign_off\n" . $herecurr);
2025 }
Joe Perches20112472011-07-25 17:13:23 -07002026 if (defined $space_before && $space_before ne "") {
Joe Perches3705ce52013-07-03 15:05:31 -07002027 if (WARN("BAD_SIGN_OFF",
2028 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
2029 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002030 $fixed[$fixlinenr] =
Joe Perches3705ce52013-07-03 15:05:31 -07002031 "$ucfirst_sign_off $email";
2032 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002033 }
Joe Perches20112472011-07-25 17:13:23 -07002034 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
Joe Perches3705ce52013-07-03 15:05:31 -07002035 if (WARN("BAD_SIGN_OFF",
2036 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
2037 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002038 $fixed[$fixlinenr] =
Joe Perches3705ce52013-07-03 15:05:31 -07002039 "$ucfirst_sign_off $email";
2040 }
2041
Joe Perches20112472011-07-25 17:13:23 -07002042 }
2043 if (!defined $space_after || $space_after ne " ") {
Joe Perches3705ce52013-07-03 15:05:31 -07002044 if (WARN("BAD_SIGN_OFF",
2045 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
2046 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002047 $fixed[$fixlinenr] =
Joe Perches3705ce52013-07-03 15:05:31 -07002048 "$ucfirst_sign_off $email";
2049 }
Joe Perches20112472011-07-25 17:13:23 -07002050 }
2051
2052 my ($email_name, $email_address, $comment) = parse_email($email);
2053 my $suggested_email = format_email(($email_name, $email_address));
2054 if ($suggested_email eq "") {
Joe Perches000d1cc12011-07-25 17:13:25 -07002055 ERROR("BAD_SIGN_OFF",
2056 "Unrecognized email address: '$email'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07002057 } else {
2058 my $dequoted = $suggested_email;
2059 $dequoted =~ s/^"//;
2060 $dequoted =~ s/" </ </;
2061 # Don't force email to have quotes
2062 # Allow just an angle bracketed address
2063 if ("$dequoted$comment" ne $email &&
2064 "<$email_address>$comment" ne $email &&
2065 "$suggested_email$comment" ne $email) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002066 WARN("BAD_SIGN_OFF",
2067 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
Joe Perches20112472011-07-25 17:13:23 -07002068 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002069 }
Joe Perches7e51f192013-09-11 14:23:57 -07002070
2071# Check for duplicate signatures
2072 my $sig_nospace = $line;
2073 $sig_nospace =~ s/\s//g;
2074 $sig_nospace = lc($sig_nospace);
2075 if (defined $signatures{$sig_nospace}) {
2076 WARN("BAD_SIGN_OFF",
2077 "Duplicate signature\n" . $herecurr);
2078 } else {
2079 $signatures{$sig_nospace} = 1;
2080 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002081 }
2082
Joe Perches9b3189e2014-06-04 16:12:10 -07002083# Check for old stable address
2084 if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
2085 ERROR("STABLE_ADDRESS",
2086 "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
2087 }
2088
Christopher Covington7ebd05e2014-04-03 14:49:31 -07002089# Check for unwanted Gerrit info
2090 if ($in_commit_log && $line =~ /^\s*change-id:/i) {
2091 ERROR("GERRIT_CHANGE_ID",
2092 "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
2093 }
2094
Joe Perchesd311cd42014-08-06 16:10:57 -07002095# Check for improperly formed commit descriptions
2096 if ($in_commit_log &&
2097 $line =~ /\bcommit\s+[0-9a-f]{5,}/i &&
2098 $line !~ /\b[Cc]ommit [0-9a-f]{12,16} \("/) {
2099 $line =~ /\b(c)ommit\s+([0-9a-f]{5,})/i;
2100 my $init_char = $1;
2101 my $orig_commit = lc($2);
2102 my $id = '01234567890ab';
2103 my $desc = 'commit description';
2104 ($id, $desc) = git_commit_info($orig_commit, $id, $desc);
2105 ERROR("GIT_COMMIT_ID",
2106 "Please use 12 to 16 chars for the git commit ID like: '${init_char}ommit $id (\"$desc\")'\n" . $herecurr);
2107 }
2108
Joe Perches13f19372014-08-06 16:10:59 -07002109# Check for added, moved or deleted files
2110 if (!$reported_maintainer_file && !$in_commit_log &&
2111 ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
2112 $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
2113 ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
2114 (defined($1) || defined($2))))) {
2115 $reported_maintainer_file = 1;
2116 WARN("FILE_PATH_CHANGES",
2117 "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
2118 }
2119
Andy Whitcroft00df3442007-06-08 13:47:06 -07002120# Check for wrappage within a valid hunk of the file
Andy Whitcroft8905a672007-11-28 16:21:06 -08002121 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002122 ERROR("CORRUPTED_PATCH",
2123 "patch seems to be corrupt (line wrapped?)\n" .
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002124 $herecurr) if (!$emitted_corrupt++);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002125 }
2126
Andy Whitcroft6ecd9672008-10-15 22:02:21 -07002127# Check for absolute kernel paths.
2128 if ($tree) {
2129 while ($line =~ m{(?:^|\s)(/\S*)}g) {
2130 my $file = $1;
2131
2132 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
2133 check_absolute_file($1, $herecurr)) {
2134 #
2135 } else {
2136 check_absolute_file($file, $herecurr);
2137 }
2138 }
2139 }
2140
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002141# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2142 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002143 $rawline !~ m/^$UTF8*$/) {
2144 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2145
2146 my $blank = copy_spacing($rawline);
2147 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2148 my $hereptr = "$hereline$ptr\n";
2149
Joe Perches34d99212011-07-25 17:13:26 -07002150 CHK("INVALID_UTF8",
2151 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
Andy Whitcroft00df3442007-06-08 13:47:06 -07002152 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002153
Joe Perches15662b32011-10-31 17:13:12 -07002154# Check if it's the start of a commit log
2155# (not a header line and we haven't seen the patch filename)
2156 if ($in_header_lines && $realfile =~ /^$/ &&
Joe Perches29ee1b02014-08-06 16:10:35 -07002157 !($rawline =~ /^\s+\S/ ||
2158 $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
Joe Perches15662b32011-10-31 17:13:12 -07002159 $in_header_lines = 0;
2160 $in_commit_log = 1;
2161 }
2162
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07002163# Check if there is UTF-8 in a commit log when a mail header has explicitly
2164# declined it, i.e defined some charset where it is missing.
2165 if ($in_header_lines &&
2166 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2167 $1 !~ /utf-8/i) {
2168 $non_utf8_charset = 1;
2169 }
2170
2171 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
Joe Perches15662b32011-10-31 17:13:12 -07002172 $rawline =~ /$NON_ASCII_UTF8/) {
Pasi Savanainenfa64205d2012-10-04 17:13:29 -07002173 WARN("UTF8_BEFORE_PATCH",
Joe Perches15662b32011-10-31 17:13:12 -07002174 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2175 }
2176
Andy Whitcroft306708542008-10-15 22:02:28 -07002177# ignore non-hunk lines and lines being removed
2178 next if (!$hunk_line || $line =~ /^-/);
Andy Whitcroft00df3442007-06-08 13:47:06 -07002179
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002180#trailing whitespace
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002181 if ($line =~ /^\+.*\015/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002182 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perchesd5e616f2013-09-11 14:23:54 -07002183 if (ERROR("DOS_LINE_ENDINGS",
2184 "DOS line endings\n" . $herevet) &&
2185 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002186 $fixed[$fixlinenr] =~ s/[\s\015]+$//;
Joe Perchesd5e616f2013-09-11 14:23:54 -07002187 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002188 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2189 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002190 if (ERROR("TRAILING_WHITESPACE",
2191 "trailing whitespace\n" . $herevet) &&
2192 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002193 $fixed[$fixlinenr] =~ s/\s+$//;
Joe Perches3705ce52013-07-03 15:05:31 -07002194 }
2195
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07002196 $rpt_cleaners = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002197 }
Andy Whitcroft5368df202008-10-15 22:02:27 -07002198
Josh Triplett4783f892013-11-12 15:10:12 -08002199# Check for FSF mailing addresses.
Alexander Duyck109d8cb2014-01-23 15:54:50 -08002200 if ($rawline =~ /\bwrite to the Free/i ||
Joe Perches3e2232f2014-01-23 15:54:48 -08002201 $rawline =~ /\b59\s+Temple\s+Pl/i ||
2202 $rawline =~ /\b51\s+Franklin\s+St/i) {
Josh Triplett4783f892013-11-12 15:10:12 -08002203 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2204 my $msg_type = \&ERROR;
2205 $msg_type = \&CHK if ($file);
2206 &{$msg_type}("FSF_MAILING_ADDRESS",
Joe Perches3e2232f2014-01-23 15:54:48 -08002207 "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)
Josh Triplett4783f892013-11-12 15:10:12 -08002208 }
2209
Andi Kleen33549572010-05-24 14:33:29 -07002210# check for Kconfig help text having a real description
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002211# Only applies when adding the entry originally, after that we do not have
2212# sufficient context to determine whether it is indeed long enough.
Andi Kleen33549572010-05-24 14:33:29 -07002213 if ($realfile =~ /Kconfig/ &&
Joe Perches8d73e0e2014-08-06 16:10:46 -07002214 $line =~ /^\+\s*config\s+/) {
Andi Kleen33549572010-05-24 14:33:29 -07002215 my $length = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002216 my $cnt = $realcnt;
2217 my $ln = $linenr + 1;
2218 my $f;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002219 my $is_start = 0;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002220 my $is_end = 0;
Andy Whitcrofta1385802012-01-10 15:10:03 -08002221 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002222 $f = $lines[$ln - 1];
2223 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2224 $is_end = $lines[$ln - 1] =~ /^\+/;
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002225
2226 next if ($f =~ /^-/);
Joe Perches8d73e0e2014-08-06 16:10:46 -07002227 last if (!$file && $f =~ /^\@\@/);
Andy Whitcrofta1385802012-01-10 15:10:03 -08002228
Joe Perches8d73e0e2014-08-06 16:10:46 -07002229 if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
Andy Whitcrofta1385802012-01-10 15:10:03 -08002230 $is_start = 1;
Joe Perches8d73e0e2014-08-06 16:10:46 -07002231 } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
Andy Whitcrofta1385802012-01-10 15:10:03 -08002232 $length = -1;
2233 }
2234
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002235 $f =~ s/^.//;
Andi Kleen33549572010-05-24 14:33:29 -07002236 $f =~ s/#.*//;
2237 $f =~ s/^\s+//;
2238 next if ($f =~ /^$/);
Andy Whitcroft9fe287d72010-10-26 14:23:15 -07002239 if ($f =~ /^\s*config\s/) {
2240 $is_end = 1;
2241 last;
2242 }
Andi Kleen33549572010-05-24 14:33:29 -07002243 $length++;
2244 }
Joe Perches000d1cc12011-07-25 17:13:25 -07002245 WARN("CONFIG_DESCRIPTION",
Andy Whitcrofta1385802012-01-10 15:10:03 -08002246 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2247 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
Andi Kleen33549572010-05-24 14:33:29 -07002248 }
2249
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002250# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2251 if ($realfile =~ /Kconfig/ &&
2252 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2253 WARN("CONFIG_EXPERIMENTAL",
2254 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2255 }
2256
Arnaud Lacombec68e5872011-08-15 01:07:14 -04002257 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2258 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2259 my $flag = $1;
2260 my $replacement = {
2261 'EXTRA_AFLAGS' => 'asflags-y',
2262 'EXTRA_CFLAGS' => 'ccflags-y',
2263 'EXTRA_CPPFLAGS' => 'cppflags-y',
2264 'EXTRA_LDFLAGS' => 'ldflags-y',
2265 };
2266
2267 WARN("DEPRECATED_VARIABLE",
2268 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2269 }
2270
Rob Herringbff5da42014-01-23 15:54:51 -08002271# check for DT compatible documentation
Florian Vaussard7dd05b32014-04-03 14:49:26 -07002272 if (defined $root &&
2273 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2274 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2275
Rob Herringbff5da42014-01-23 15:54:51 -08002276 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2277
Florian Vaussardcc933192014-04-03 14:49:27 -07002278 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2279 my $vp_file = $dt_path . "vendor-prefixes.txt";
2280
Rob Herringbff5da42014-01-23 15:54:51 -08002281 foreach my $compat (@compats) {
2282 my $compat2 = $compat;
Rob Herring185d5662014-06-04 16:12:03 -07002283 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2284 my $compat3 = $compat;
2285 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2286 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
Rob Herringbff5da42014-01-23 15:54:51 -08002287 if ( $? >> 8 ) {
2288 WARN("UNDOCUMENTED_DT_STRING",
2289 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2290 }
2291
Florian Vaussard4fbf32a2014-04-03 14:49:25 -07002292 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2293 my $vendor = $1;
Florian Vaussardcc933192014-04-03 14:49:27 -07002294 `grep -Eq "^$vendor\\b" $vp_file`;
Rob Herringbff5da42014-01-23 15:54:51 -08002295 if ( $? >> 8 ) {
2296 WARN("UNDOCUMENTED_DT_STRING",
Florian Vaussardcc933192014-04-03 14:49:27 -07002297 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
Rob Herringbff5da42014-01-23 15:54:51 -08002298 }
2299 }
2300 }
2301
Andy Whitcroft5368df202008-10-15 22:02:27 -07002302# check we are in a valid source file if not then ignore this hunk
2303 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2304
Joe Perches6cd7f382012-12-17 16:01:54 -08002305#line length limit
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002306 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
Andy Whitcroftf4c014c2008-07-23 21:29:01 -07002307 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
Joe Perches0fccc622011-05-24 17:13:41 -07002308 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
Joe Perches8bbea962010-08-09 17:21:01 -07002309 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
Joe Perches6cd7f382012-12-17 16:01:54 -08002310 $length > $max_line_length)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002311 {
Joe Perches000d1cc12011-07-25 17:13:25 -07002312 WARN("LONG_LINE",
Joe Perches6cd7f382012-12-17 16:01:54 -08002313 "line over $max_line_length characters\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002314 }
2315
Josh Triplettca56dc02012-03-23 15:02:21 -07002316# Check for user-visible strings broken across lines, which breaks the ability
Joe Perches8c5fcd22014-01-23 15:54:40 -08002317# to grep for the string. Make exceptions when the previous string ends in a
2318# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
2319# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
Josh Triplettca56dc02012-03-23 15:02:21 -07002320 if ($line =~ /^\+\s*"/ &&
2321 $prevline =~ /"\s*$/ &&
Joe Perches8c5fcd22014-01-23 15:54:40 -08002322 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
Josh Triplettca56dc02012-03-23 15:02:21 -07002323 WARN("SPLIT_STRING",
2324 "quoted string split across lines\n" . $hereprev);
2325 }
2326
Joe Perches5e79d962010-03-05 13:43:55 -08002327# check for spaces before a quoted newline
2328 if ($rawline =~ /^.*\".*\s\\n/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002329 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
2330 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
2331 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002332 $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
Joe Perches3705ce52013-07-03 15:05:31 -07002333 }
2334
Joe Perches5e79d962010-03-05 13:43:55 -08002335 }
2336
Andy Whitcroft8905a672007-11-28 16:21:06 -08002337# check for adding lines without a newline.
2338 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002339 WARN("MISSING_EOF_NEWLINE",
2340 "adding a line without newline at end of file\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002341 }
2342
Mike Frysinger42e41c52009-09-21 17:04:40 -07002343# Blackfin: use hi/lo macros
2344 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2345 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2346 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002347 ERROR("LO_MACRO",
2348 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002349 }
2350 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2351 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002352 ERROR("HI_MACRO",
2353 "use the HI() macro, not (... >> 16)\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002354 }
2355 }
2356
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002357# check we are in a valid source file C or perl if not then ignore this hunk
2358 next if ($realfile !~ /\.(h|c|pl)$/);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002359
2360# at the beginning of a line any tabs must come first and anything
2361# more than 8 must use tabs.
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002362 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2363 $rawline =~ /^\+\s* \s*/) {
2364 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07002365 $rpt_cleaners = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07002366 if (ERROR("CODE_INDENT",
2367 "code indent should use tabs where possible\n" . $herevet) &&
2368 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002369 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
Joe Perches3705ce52013-07-03 15:05:31 -07002370 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002371 }
2372
Alberto Panizzo08e44362010-03-05 13:43:54 -08002373# check for space before tabs.
2374 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2375 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002376 if (WARN("SPACE_BEFORE_TAB",
2377 "please, no space before tabs\n" . $herevet) &&
2378 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002379 while ($fixed[$fixlinenr] =~
Joe Perchesc76f4cb2014-01-23 15:54:46 -08002380 s/(^\+.*) {8,8}+\t/$1\t\t/) {}
Joe Perches194f66f2014-08-06 16:11:03 -07002381 while ($fixed[$fixlinenr] =~
Joe Perchesc76f4cb2014-01-23 15:54:46 -08002382 s/(^\+.*) +\t/$1\t/) {}
Joe Perches3705ce52013-07-03 15:05:31 -07002383 }
Alberto Panizzo08e44362010-03-05 13:43:54 -08002384 }
2385
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002386# check for && or || at the start of a line
2387 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2388 CHK("LOGICAL_CONTINUATIONS",
2389 "Logical continuations should be on the previous line\n" . $hereprev);
2390 }
2391
2392# check multi-line statement indentation matches previous line
2393 if ($^V && $^V ge 5.10.0 &&
Joe Perches91cb5192014-04-03 14:49:32 -07002394 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002395 $prevline =~ /^\+(\t*)(.*)$/;
2396 my $oldindent = $1;
2397 my $rest = $2;
2398
2399 my $pos = pos_last_openparen($rest);
2400 if ($pos >= 0) {
Joe Perchesb34a26f2012-07-30 14:41:16 -07002401 $line =~ /^(\+| )([ \t]*)/;
2402 my $newindent = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002403
2404 my $goodtabindent = $oldindent .
2405 "\t" x ($pos / 8) .
2406 " " x ($pos % 8);
2407 my $goodspaceindent = $oldindent . " " x $pos;
2408
2409 if ($newindent ne $goodtabindent &&
2410 $newindent ne $goodspaceindent) {
Joe Perches3705ce52013-07-03 15:05:31 -07002411
2412 if (CHK("PARENTHESIS_ALIGNMENT",
2413 "Alignment should match open parenthesis\n" . $hereprev) &&
2414 $fix && $line =~ /^\+/) {
Joe Perches194f66f2014-08-06 16:11:03 -07002415 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07002416 s/^\+[ \t]*/\+$goodtabindent/;
2417 }
Joe Perchesd1fe9c02012-03-23 15:02:16 -07002418 }
2419 }
2420 }
2421
Joe Perchesf27c95d2014-08-06 16:10:52 -07002422 if ($line =~ /^\+.*\(\s*$Type\s*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07002423 if (CHK("SPACING",
Joe Perchesf27c95d2014-08-06 16:10:52 -07002424 "No space is necessary after a cast\n" . $herecurr) &&
Joe Perches3705ce52013-07-03 15:05:31 -07002425 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002426 $fixed[$fixlinenr] =~
Joe Perchesf27c95d2014-08-06 16:10:52 -07002427 s/(\(\s*$Type\s*\))[ \t]+/$1/;
Joe Perches3705ce52013-07-03 15:05:31 -07002428 }
Joe Perchesaad4f612012-03-23 15:02:19 -07002429 }
2430
Joe Perches05880602012-10-04 17:13:35 -07002431 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesfdb4bcd2013-07-03 15:05:23 -07002432 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
Joe Perches85ad9782014-04-03 14:49:20 -07002433 $rawline =~ /^\+[ \t]*\*/ &&
2434 $realline > 2) {
Joe Perches05880602012-10-04 17:13:35 -07002435 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2436 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2437 }
2438
2439 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesa605e322013-07-03 15:05:24 -07002440 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /*
2441 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
Joe Perches61135e92013-09-11 14:23:59 -07002442 $rawline =~ /^\+/ && #line is new
Joe Perchesa605e322013-07-03 15:05:24 -07002443 $rawline !~ /^\+[ \t]*\*/) { #no leading *
2444 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2445 "networking block comments start with * on subsequent lines\n" . $hereprev);
2446 }
2447
2448 if ($realfile =~ m@^(drivers/net/|net/)@ &&
Joe Perchesc24f9f12012-11-08 15:53:29 -08002449 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
2450 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2451 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2452 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
Joe Perches05880602012-10-04 17:13:35 -07002453 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2454 "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2455 }
2456
Joe Perches7f619192014-08-06 16:10:39 -07002457# check for missing blank lines after struct/union declarations
2458# with exceptions for various attributes and macros
2459 if ($prevline =~ /^[\+ ]};?\s*$/ &&
2460 $line =~ /^\+/ &&
2461 !($line =~ /^\+\s*$/ ||
2462 $line =~ /^\+\s*EXPORT_SYMBOL/ ||
2463 $line =~ /^\+\s*MODULE_/i ||
2464 $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
2465 $line =~ /^\+[a-z_]*init/ ||
2466 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
2467 $line =~ /^\+\s*DECLARE/ ||
2468 $line =~ /^\+\s*__setup/)) {
Joe Perchesd752fcc2014-08-06 16:11:05 -07002469 if (CHK("LINE_SPACING",
2470 "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
2471 $fix) {
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002472 fix_insert_line($fixlinenr, "\+");
Joe Perchesd752fcc2014-08-06 16:11:05 -07002473 }
Joe Perches7f619192014-08-06 16:10:39 -07002474 }
2475
Joe Perches365dd4e2014-08-06 16:10:42 -07002476# check for multiple consecutive blank lines
2477 if ($prevline =~ /^[\+ ]\s*$/ &&
2478 $line =~ /^\+\s*$/ &&
2479 $last_blank_line != ($linenr - 1)) {
Joe Perchesd752fcc2014-08-06 16:11:05 -07002480 if (CHK("LINE_SPACING",
2481 "Please don't use multiple blank lines\n" . $hereprev) &&
2482 $fix) {
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002483 fix_delete_line($fixlinenr, $rawline);
Joe Perchesd752fcc2014-08-06 16:11:05 -07002484 }
2485
Joe Perches365dd4e2014-08-06 16:10:42 -07002486 $last_blank_line = $linenr;
2487 }
2488
Joe Perches3b617e32014-04-03 14:49:28 -07002489# check for missing blank lines after declarations
Joe Perches3f7bac02014-06-04 16:12:04 -07002490 if ($sline =~ /^\+\s+\S/ && #Not at char 1
2491 # actual declarations
2492 ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
Joe Perches5a4e1fd2014-08-06 16:10:33 -07002493 # function pointer declarations
2494 $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002495 # foo bar; where foo is some local typedef or #define
2496 $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2497 # known declaration macros
2498 $prevline =~ /^\+\s+$declaration_macros/) &&
2499 # for "else if" which can look like "$Ident $Ident"
2500 !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
2501 # other possible extensions of declaration lines
2502 $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
2503 # not starting a section or a macro "\" extended line
2504 $prevline =~ /(?:\{\s*|\\)$/) &&
2505 # looks like a declaration
2506 !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
Joe Perches5a4e1fd2014-08-06 16:10:33 -07002507 # function pointer declarations
2508 $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002509 # foo bar; where foo is some local typedef or #define
2510 $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2511 # known declaration macros
2512 $sline =~ /^\+\s+$declaration_macros/ ||
2513 # start of struct or union or enum
Joe Perches3b617e32014-04-03 14:49:28 -07002514 $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
Joe Perches3f7bac02014-06-04 16:12:04 -07002515 # start or end of block or continuation of declaration
2516 $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
2517 # bitfield continuation
2518 $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
2519 # other possible extensions of declaration lines
2520 $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
2521 # indentation of previous and current line are the same
2522 (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
Joe Perchesd752fcc2014-08-06 16:11:05 -07002523 if (WARN("LINE_SPACING",
2524 "Missing a blank line after declarations\n" . $hereprev) &&
2525 $fix) {
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002526 fix_insert_line($fixlinenr, "\+");
Joe Perchesd752fcc2014-08-06 16:11:05 -07002527 }
Joe Perches3b617e32014-04-03 14:49:28 -07002528 }
2529
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002530# check for spaces at the beginning of a line.
Andy Whitcroft6b4c5be2010-10-26 14:23:11 -07002531# Exceptions:
2532# 1) within comments
2533# 2) indented preprocessor commands
2534# 3) hanging labels
Joe Perches3705ce52013-07-03 15:05:31 -07002535 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002536 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07002537 if (WARN("LEADING_SPACE",
2538 "please, no spaces at the start of a line\n" . $herevet) &&
2539 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002540 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
Joe Perches3705ce52013-07-03 15:05:31 -07002541 }
Raffaele Recalcati5f7ddae2010-08-09 17:20:59 -07002542 }
2543
Andy Whitcroftb9ea10d2008-10-15 22:02:24 -07002544# check we are in a valid C source file if not then ignore this hunk
2545 next if ($realfile !~ /\.(h|c)$/);
2546
Joe Perches032a4c02014-08-06 16:10:29 -07002547# check indentation of any line with a bare else
2548# if the previous line is a break or return and is indented 1 tab more...
2549 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
2550 my $tabs = length($1) + 1;
2551 if ($prevline =~ /^\+\t{$tabs,$tabs}(?:break|return)\b/) {
2552 WARN("UNNECESSARY_ELSE",
2553 "else is not generally useful after a break or return\n" . $hereprev);
2554 }
2555 }
2556
Joe Perchesc00df192014-08-06 16:11:01 -07002557# check indentation of a line with a break;
2558# if the previous line is a goto or return and is indented the same # of tabs
2559 if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
2560 my $tabs = $1;
2561 if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
2562 WARN("UNNECESSARY_BREAK",
2563 "break is not useful after a goto or return\n" . $hereprev);
2564 }
2565 }
2566
Kees Cook1ba8dfd2012-12-17 16:01:48 -08002567# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2568 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2569 WARN("CONFIG_EXPERIMENTAL",
2570 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2571 }
2572
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002573# check for RCS/CVS revision markers
Andy Whitcroftcf655042008-03-04 14:28:20 -08002574 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002575 WARN("CVS_KEYWORD",
2576 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002577 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07002578
Mike Frysinger42e41c52009-09-21 17:04:40 -07002579# Blackfin: don't use __builtin_bfin_[cs]sync
2580 if ($line =~ /__builtin_bfin_csync/) {
2581 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002582 ERROR("CSYNC",
2583 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002584 }
2585 if ($line =~ /__builtin_bfin_ssync/) {
2586 my $herevet = "$here\n" . cat_vet($line) . "\n";
Joe Perches000d1cc12011-07-25 17:13:25 -07002587 ERROR("SSYNC",
2588 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
Mike Frysinger42e41c52009-09-21 17:04:40 -07002589 }
2590
Joe Perches56e77d72013-02-21 16:44:14 -08002591# check for old HOTPLUG __dev<foo> section markings
2592 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2593 WARN("HOTPLUG_SECTION",
2594 "Using $1 is unnecessary\n" . $herecurr);
2595 }
2596
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002597# Check for potential 'bare' types
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002598 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2599 $realline_next);
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002600#print "LINE<$line>\n";
2601 if ($linenr >= $suppress_statement &&
Joe Perches1b5539b2013-09-11 14:24:03 -07002602 $realcnt && $sline =~ /.\s*\S/) {
Andy Whitcroft170d3a22008-10-15 22:02:30 -07002603 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07002604 ctx_statement_block($linenr, $realcnt, 0);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002605 $stat =~ s/\n./\n /g;
2606 $cond =~ s/\n./\n /g;
2607
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002608#print "linenr<$linenr> <$stat>\n";
2609 # If this statement has no statement boundaries within
2610 # it there is no point in retrying a statement scan
2611 # until we hit end of it.
2612 my $frag = $stat; $frag =~ s/;+\s*$//;
2613 if ($frag !~ /(?:{|;)/) {
2614#print "skip<$line_nr_next>\n";
2615 $suppress_statement = $line_nr_next;
2616 }
Andy Whitcroftf74bd192012-01-10 15:09:54 -08002617
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002618 # Find the real next line.
2619 $realline_next = $line_nr_next;
2620 if (defined $realline_next &&
2621 (!defined $lines[$realline_next - 1] ||
2622 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2623 $realline_next++;
2624 }
2625
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002626 my $s = $stat;
2627 $s =~ s/{.*$//s;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002628
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002629 # Ignore goto labels.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002630 if ($s =~ /$Ident:\*$/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002631
2632 # Ignore functions being called
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002633 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002634
Andy Whitcroft463f2862009-09-21 17:04:34 -07002635 } elsif ($s =~ /^.\s*else\b/s) {
2636
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002637 # declarations always start with types
Andy Whitcroftd2506582008-07-23 21:29:09 -07002638 } 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) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002639 my $type = $1;
2640 $type =~ s/\s+/ /g;
2641 possible($type, "A:" . $s);
2642
Andy Whitcroft8905a672007-11-28 16:21:06 -08002643 # definitions in global scope can only start with types
Andy Whitcrofta6a840622008-10-15 22:02:30 -07002644 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002645 possible($1, "B:" . $s);
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002646 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002647
2648 # any (foo ... *) is a pointer cast, and foo is a type
Andy Whitcroft65863862009-01-06 14:41:21 -08002649 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002650 possible($1, "C:" . $s);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002651 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08002652
2653 # Check for any sort of function declaration.
2654 # int foo(something bar, other baz);
2655 # void (*store_gdt)(x86_descr_ptr *);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07002656 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
Andy Whitcroft8905a672007-11-28 16:21:06 -08002657 my ($name_len) = length($1);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002658
Andy Whitcroftcf655042008-03-04 14:28:20 -08002659 my $ctx = $s;
Andy Whitcroft773647a2008-03-28 14:15:58 -07002660 substr($ctx, 0, $name_len + 1, '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08002661 $ctx =~ s/\)[^\)]*$//;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002662
Andy Whitcroft8905a672007-11-28 16:21:06 -08002663 for my $arg (split(/\s*,\s*/, $ctx)) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002664 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
Andy Whitcroft8905a672007-11-28 16:21:06 -08002665
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002666 possible($1, "D:" . $s);
Andy Whitcroft8905a672007-11-28 16:21:06 -08002667 }
2668 }
2669 }
2670
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002671 }
2672
Andy Whitcroft653d4872007-06-23 17:16:34 -07002673#
2674# Checks which may be anchored in the context.
2675#
2676
2677# Check for switch () and associated case and default
2678# statements should be at the same indent.
Andy Whitcroft00df3442007-06-08 13:47:06 -07002679 if ($line=~/\bswitch\s*\(.*\)/) {
2680 my $err = '';
2681 my $sep = '';
2682 my @ctx = ctx_block_outer($linenr, $realcnt);
2683 shift(@ctx);
2684 for my $ctx (@ctx) {
2685 my ($clen, $cindent) = line_stats($ctx);
2686 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2687 $indent != $cindent) {
2688 $err .= "$sep$ctx\n";
2689 $sep = '';
2690 } else {
2691 $sep = "[...]\n";
2692 }
2693 }
2694 if ($err ne '') {
Joe Perches000d1cc12011-07-25 17:13:25 -07002695 ERROR("SWITCH_CASE_INDENT_LEVEL",
2696 "switch and case should be at the same indent\n$hereline$err");
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002697 }
2698 }
2699
2700# if/while/etc brace do not go on next line, unless defining a do while loop,
2701# or if that brace on the next line is for something else
Joe Perches0fe3dc22014-08-06 16:11:16 -07002702 if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07002703 my $pre_ctx = "$1$2";
2704
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002705 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
Joe Perches8eef05d2012-02-03 15:20:39 -08002706
2707 if ($line =~ /^\+\t{6,}/) {
2708 WARN("DEEP_INDENTATION",
2709 "Too many leading tabs - consider code refactoring\n" . $herecurr);
2710 }
2711
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002712 my $ctx_cnt = $realcnt - $#ctx - 1;
2713 my $ctx = join("\n", @ctx);
2714
Andy Whitcroft548596d2008-07-23 21:29:01 -07002715 my $ctx_ln = $linenr;
2716 my $ctx_skip = $realcnt;
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07002717
Andy Whitcroft548596d2008-07-23 21:29:01 -07002718 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2719 defined $lines[$ctx_ln - 1] &&
2720 $lines[$ctx_ln - 1] =~ /^-/)) {
2721 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2722 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
Andy Whitcroft773647a2008-03-28 14:15:58 -07002723 $ctx_ln++;
2724 }
Andy Whitcroft548596d2008-07-23 21:29:01 -07002725
Andy Whitcroft53210162008-07-23 21:29:03 -07002726 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2727 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
Andy Whitcroft773647a2008-03-28 14:15:58 -07002728
Joe Perchesd752fcc2014-08-06 16:11:05 -07002729 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002730 ERROR("OPEN_BRACE",
2731 "that open brace { should be on the previous line\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002732 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft00df3442007-06-08 13:47:06 -07002733 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07002734 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2735 $ctx =~ /\)\s*\;\s*$/ &&
2736 defined $lines[$ctx_ln - 1])
2737 {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002738 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2739 if ($nindent > $indent) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002740 WARN("TRAILING_SEMICOLON",
2741 "trailing semicolon indicates no statements, indent implies otherwise\n" .
Andy Whitcroft01464f32010-10-26 14:23:19 -07002742 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07002743 }
2744 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002745 }
2746
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002747# Check relative indent for conditionals and blocks.
Joe Perches0fe3dc22014-08-06 16:11:16 -07002748 if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08002749 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2750 ctx_statement_block($linenr, $realcnt, 0)
2751 if (!defined $stat);
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002752 my ($s, $c) = ($stat, $cond);
2753
2754 substr($s, 0, length($c), '');
2755
2756 # Make sure we remove the line prefixes as we have
2757 # none on the first line, and are going to readd them
2758 # where necessary.
2759 $s =~ s/\n./\n/gs;
2760
2761 # Find out how long the conditional actually is.
Andy Whitcroft6f779c12008-10-15 22:02:27 -07002762 my @newlines = ($c =~ /\n/gs);
2763 my $cond_lines = 1 + $#newlines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002764
2765 # We want to check the first line inside the block
2766 # starting at the end of the conditional, so remove:
2767 # 1) any blank line termination
2768 # 2) any opening brace { on end of the line
2769 # 3) any do (...) {
2770 my $continuation = 0;
2771 my $check = 0;
2772 $s =~ s/^.*\bdo\b//;
2773 $s =~ s/^\s*{//;
2774 if ($s =~ s/^\s*\\//) {
2775 $continuation = 1;
2776 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002777 if ($s =~ s/^\s*?\n//) {
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002778 $check = 1;
2779 $cond_lines++;
2780 }
2781
2782 # Also ignore a loop construct at the end of a
2783 # preprocessor statement.
2784 if (($prevline =~ /^.\s*#\s*define\s/ ||
2785 $prevline =~ /\\\s*$/) && $continuation == 0) {
2786 $check = 0;
2787 }
2788
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002789 my $cond_ptr = -1;
Andy Whitcroft740504c2008-10-15 22:02:35 -07002790 $continuation = 0;
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002791 while ($cond_ptr != $cond_lines) {
2792 $cond_ptr = $cond_lines;
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002793
Andy Whitcroftf16fa282008-10-15 22:02:32 -07002794 # If we see an #else/#elif then the code
2795 # is not linear.
2796 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2797 $check = 0;
2798 }
2799
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002800 # Ignore:
2801 # 1) blank lines, they should be at 0,
2802 # 2) preprocessor lines, and
2803 # 3) labels.
Andy Whitcroft740504c2008-10-15 22:02:35 -07002804 if ($continuation ||
2805 $s =~ /^\s*?\n/ ||
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002806 $s =~ /^\s*#\s*?/ ||
2807 $s =~ /^\s*$Ident\s*:/) {
Andy Whitcroft740504c2008-10-15 22:02:35 -07002808 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
Andy Whitcroft30dad6e2009-09-21 17:04:36 -07002809 if ($s =~ s/^.*?\n//) {
2810 $cond_lines++;
2811 }
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002812 }
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002813 }
2814
2815 my (undef, $sindent) = line_stats("+" . $s);
2816 my $stat_real = raw_line($linenr, $cond_lines);
2817
2818 # Check if either of these lines are modified, else
2819 # this is not this patch's fault.
2820 if (!defined($stat_real) ||
2821 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2822 $check = 0;
2823 }
2824 if (defined($stat_real) && $cond_lines > 1) {
2825 $stat_real = "[...]\n$stat_real";
2826 }
2827
Andy Whitcroft9bd49ef2008-10-15 22:02:22 -07002828 #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";
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002829
2830 if ($check && (($sindent % 8) != 0 ||
2831 ($sindent <= $indent && $s ne ''))) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002832 WARN("SUSPECT_CODE_INDENT",
2833 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
Andy Whitcroft4d001e42008-10-15 22:02:21 -07002834 }
2835 }
2836
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002837 # Track the 'values' across context and added lines.
2838 my $opline = $line; $opline =~ s/^./ /;
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002839 my ($curr_values, $curr_vars) =
2840 annotate_values($opline . "\n", $prev_values);
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002841 $curr_values = $prev_values . $curr_values;
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002842 if ($dbg_values) {
2843 my $outline = $opline; $outline =~ s/\t/ /g;
Andy Whitcroftcf655042008-03-04 14:28:20 -08002844 print "$linenr > .$outline\n";
2845 print "$linenr > $curr_values\n";
Andy Whitcroft1f65f942008-07-23 21:29:10 -07002846 print "$linenr > $curr_vars\n";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08002847 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002848 $prev_values = substr($curr_values, -1);
2849
Andy Whitcroft00df3442007-06-08 13:47:06 -07002850#ignore lines not being added
Joe Perches3705ce52013-07-03 15:05:31 -07002851 next if ($line =~ /^[^\+]/);
Andy Whitcroft00df3442007-06-08 13:47:06 -07002852
Andy Whitcroft653d4872007-06-23 17:16:34 -07002853# TEST: allow direct testing of the type matcher.
Andy Whitcroft7429c692008-07-23 21:29:06 -07002854 if ($dbg_type) {
2855 if ($line =~ /^.\s*$Declare\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002856 ERROR("TEST_TYPE",
2857 "TEST: is type\n" . $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002858 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002859 ERROR("TEST_NOT_TYPE",
2860 "TEST: is not type ($1 is)\n". $herecurr);
Andy Whitcroft7429c692008-07-23 21:29:06 -07002861 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002862 next;
2863 }
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002864# TEST: allow direct testing of the attribute matcher.
2865 if ($dbg_attr) {
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002866 if ($line =~ /^.\s*$Modifier\s*$/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002867 ERROR("TEST_ATTR",
2868 "TEST: is attr\n" . $herecurr);
Andy Whitcroft9360b0e2009-02-27 14:03:08 -08002869 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002870 ERROR("TEST_NOT_ATTR",
2871 "TEST: is not attr ($1 is)\n". $herecurr);
Andy Whitcrofta1ef2772008-10-15 22:02:17 -07002872 }
2873 next;
2874 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002875
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002876# check for initialisation to aggregates open brace on the next line
Andy Whitcroft99423c22009-10-26 16:50:15 -07002877 if ($line =~ /^.\s*{/ &&
2878 $prevline =~ /(?:^|[^=])=\s*$/) {
Joe Perchesd752fcc2014-08-06 16:11:05 -07002879 if (ERROR("OPEN_BRACE",
2880 "that open brace { should be on the previous line\n" . $hereprev) &&
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002881 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
2882 fix_delete_line($fixlinenr - 1, $prevrawline);
2883 fix_delete_line($fixlinenr, $rawline);
Joe Perchesd752fcc2014-08-06 16:11:05 -07002884 my $fixedline = $prevrawline;
2885 $fixedline =~ s/\s*=\s*$/ = {/;
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002886 fix_insert_line($fixlinenr, $fixedline);
Joe Perchesd752fcc2014-08-06 16:11:05 -07002887 $fixedline = $line;
2888 $fixedline =~ s/^(.\s*){\s*/$1/;
Joe Perchesf2d7e4d2014-08-06 16:11:07 -07002889 fix_insert_line($fixlinenr, $fixedline);
Joe Perchesd752fcc2014-08-06 16:11:05 -07002890 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002891 }
2892
Andy Whitcroft653d4872007-06-23 17:16:34 -07002893#
2894# Checks which are anchored on the added line.
2895#
2896
2897# check for malformed paths in #include statements (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07002898 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
Andy Whitcroft653d4872007-06-23 17:16:34 -07002899 my $path = $1;
2900 if ($path =~ m{//}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002901 ERROR("MALFORMED_INCLUDE",
Joe Perches495e9d82012-12-20 15:05:37 -08002902 "malformed #include filename\n" . $herecurr);
2903 }
2904 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2905 ERROR("UAPI_INCLUDE",
2906 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002907 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002908 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002909
2910# no C99 // comments
2911 if ($line =~ m{//}) {
Joe Perches3705ce52013-07-03 15:05:31 -07002912 if (ERROR("C99_COMMENTS",
2913 "do not use C99 // comments\n" . $herecurr) &&
2914 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002915 my $line = $fixed[$fixlinenr];
Joe Perches3705ce52013-07-03 15:05:31 -07002916 if ($line =~ /\/\/(.*)$/) {
2917 my $comment = trim($1);
Joe Perches194f66f2014-08-06 16:11:03 -07002918 $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
Joe Perches3705ce52013-07-03 15:05:31 -07002919 }
2920 }
Andy Whitcroft00df3442007-06-08 13:47:06 -07002921 }
2922 # Remove C99 comments.
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002923 $line =~ s@//.*@@;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07002924 $opline =~ s@//.*@@;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002925
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002926# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2927# the whole statement.
2928#print "APW <$lines[$realline_next - 1]>\n";
2929 if (defined $realline_next &&
2930 exists $lines[$realline_next - 1] &&
2931 !defined $suppress_export{$realline_next} &&
2932 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2933 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002934 # Handle definitions which produce identifiers with
2935 # a prefix:
2936 # XXX(foo);
2937 # EXPORT_SYMBOL(something_foo);
Andy Whitcroft653d4872007-06-23 17:16:34 -07002938 my $name = $1;
Andy Whitcroft87a53872012-01-10 15:10:04 -08002939 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
Andy Whitcroft3cbf62d2010-10-26 14:23:18 -07002940 $name =~ /^${Ident}_$2/) {
2941#print "FOO C name<$name>\n";
2942 $suppress_export{$realline_next} = 1;
2943
2944 } elsif ($stat !~ /(?:
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002945 \n.}\s*$|
Andy Whitcroft48012052008-10-15 22:02:34 -07002946 ^.DEFINE_$Ident\(\Q$name\E\)|
2947 ^.DECLARE_$Ident\(\Q$name\E\)|
2948 ^.LIST_HEAD\(\Q$name\E\)|
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002949 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2950 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
Andy Whitcroft48012052008-10-15 22:02:34 -07002951 )/x) {
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002952#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2953 $suppress_export{$realline_next} = 2;
2954 } else {
2955 $suppress_export{$realline_next} = 1;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002956 }
2957 }
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002958 if (!defined $suppress_export{$linenr} &&
2959 $prevline =~ /^.\s*$/ &&
2960 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2961 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2962#print "FOO B <$lines[$linenr - 1]>\n";
2963 $suppress_export{$linenr} = 2;
2964 }
2965 if (defined $suppress_export{$linenr} &&
2966 $suppress_export{$linenr} == 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002967 WARN("EXPORT_SYMBOL",
2968 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
Andy Whitcroft2b474a12009-10-26 16:50:16 -07002969 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002970
Joe Eloff5150bda2010-08-09 17:21:00 -07002971# check for global initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002972 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
2973 if (ERROR("GLOBAL_INITIALISERS",
2974 "do not initialise globals to 0 or NULL\n" .
2975 $herecurr) &&
2976 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002977 $fixed[$fixlinenr] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
Joe Perchesd5e616f2013-09-11 14:23:54 -07002978 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07002979 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07002980# check for static initialisers.
Joe Perchesd5e616f2013-09-11 14:23:54 -07002981 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2982 if (ERROR("INITIALISED_STATIC",
2983 "do not initialise statics to 0 or NULL\n" .
2984 $herecurr) &&
2985 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07002986 $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
Joe Perchesd5e616f2013-09-11 14:23:54 -07002987 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07002988 }
2989
Joe Perchescb710ec2010-10-26 14:23:20 -07002990# check for static const char * arrays.
2991 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002992 WARN("STATIC_CONST_CHAR_ARRAY",
2993 "static const char * array should probably be static const char * const\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07002994 $herecurr);
2995 }
2996
2997# check for static char foo[] = "bar" declarations.
2998 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07002999 WARN("STATIC_CONST_CHAR_ARRAY",
3000 "static char array declaration should probably be static const char\n" .
Joe Perchescb710ec2010-10-26 14:23:20 -07003001 $herecurr);
3002 }
3003
Joe Perches9b0fa602014-04-03 14:49:18 -07003004# check for non-global char *foo[] = {"bar", ...} declarations.
3005 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
3006 WARN("STATIC_CONST_CHAR_ARRAY",
3007 "char * array declaration might be better as static const\n" .
3008 $herecurr);
3009 }
3010
Joe Perchesb36190c2014-01-27 17:07:18 -08003011# check for function declarations without arguments like "int foo()"
3012 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
3013 if (ERROR("FUNCTION_WITHOUT_ARGS",
3014 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
3015 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003016 $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
Joe Perchesb36190c2014-01-27 17:07:18 -08003017 }
3018 }
3019
Joe Perches92e112f2013-12-13 11:36:22 -07003020# check for uses of DEFINE_PCI_DEVICE_TABLE
3021 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
3022 if (WARN("DEFINE_PCI_DEVICE_TABLE",
3023 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
3024 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003025 $fixed[$fixlinenr] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
Joe Perches92e112f2013-12-13 11:36:22 -07003026 }
Joe Perches93ed0e22010-10-26 14:23:21 -07003027 }
3028
Andy Whitcroft653d4872007-06-23 17:16:34 -07003029# check for new typedefs, only function parameters and sparse annotations
3030# make sense.
3031 if ($line =~ /\btypedef\s/ &&
Andy Whitcroft80545762009-01-06 14:41:26 -08003032 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003033 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
Andy Whitcroft8ed22ca2008-10-15 22:02:32 -07003034 $line !~ /\b$typeTypedefs\b/ &&
Andy Whitcroft653d4872007-06-23 17:16:34 -07003035 $line !~ /\b__bitwise(?:__|)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003036 WARN("NEW_TYPEDEFS",
3037 "do not add new typedefs\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003038 }
3039
3040# * goes on variable not on type
Andy Whitcroft65863862009-01-06 14:41:21 -08003041 # (char*[ const])
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08003042 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
3043 #print "AA<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07003044 my ($ident, $from, $to) = ($1, $2, $2);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003045
Andy Whitcroft65863862009-01-06 14:41:21 -08003046 # Should start with a space.
3047 $to =~ s/^(\S)/ $1/;
3048 # Should not end with a space.
3049 $to =~ s/\s+$//;
3050 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08003051 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08003052 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003053
Joe Perches3705ce52013-07-03 15:05:31 -07003054## print "1: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft65863862009-01-06 14:41:21 -08003055 if ($from ne $to) {
Joe Perches3705ce52013-07-03 15:05:31 -07003056 if (ERROR("POINTER_LOCATION",
3057 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
3058 $fix) {
3059 my $sub_from = $ident;
3060 my $sub_to = $ident;
3061 $sub_to =~ s/\Q$from\E/$to/;
Joe Perches194f66f2014-08-06 16:11:03 -07003062 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003063 s@\Q$sub_from\E@$sub_to@;
3064 }
Andy Whitcroft65863862009-01-06 14:41:21 -08003065 }
Andy Whitcroftbfcb2cc2012-01-10 15:10:15 -08003066 }
3067 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
3068 #print "BB<$1>\n";
Joe Perches3705ce52013-07-03 15:05:31 -07003069 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003070
Andy Whitcroft65863862009-01-06 14:41:21 -08003071 # Should start with a space.
3072 $to =~ s/^(\S)/ $1/;
3073 # Should not end with a space.
3074 $to =~ s/\s+$//;
3075 # '*'s should not have spaces between.
Andy Whitcroftf9a0b3d2009-01-15 13:51:05 -08003076 while ($to =~ s/\*\s+\*/\*\*/) {
Andy Whitcroft65863862009-01-06 14:41:21 -08003077 }
3078 # Modifiers should have spaces.
3079 $to =~ s/(\b$Modifier$)/$1 /;
3080
Joe Perches3705ce52013-07-03 15:05:31 -07003081## print "2: from<$from> to<$to> ident<$ident>\n";
Andy Whitcroft667026e2009-02-27 14:03:08 -08003082 if ($from ne $to && $ident !~ /^$Modifier$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003083 if (ERROR("POINTER_LOCATION",
3084 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
3085 $fix) {
3086
3087 my $sub_from = $match;
3088 my $sub_to = $match;
3089 $sub_to =~ s/\Q$from\E/$to/;
Joe Perches194f66f2014-08-06 16:11:03 -07003090 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003091 s@\Q$sub_from\E@$sub_to@;
3092 }
Andy Whitcroft65863862009-01-06 14:41:21 -08003093 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003094 }
3095
3096# # no BUG() or BUG_ON()
3097# if ($line =~ /\b(BUG|BUG_ON)\b/) {
3098# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
3099# print "$herecurr";
3100# $clean = 0;
3101# }
3102
Andy Whitcroft8905a672007-11-28 16:21:06 -08003103 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003104 WARN("LINUX_VERSION_CODE",
3105 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003106 }
3107
Joe Perches17441222011-06-15 15:08:17 -07003108# check for uses of printk_ratelimit
3109 if ($line =~ /\bprintk_ratelimit\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003110 WARN("PRINTK_RATELIMITED",
3111"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
Joe Perches17441222011-06-15 15:08:17 -07003112 }
3113
Andy Whitcroft00df3442007-06-08 13:47:06 -07003114# printk should use KERN_* levels. Note that follow on printk's on the
3115# same line do not need a level, so we use the current block context
3116# to try and find and validate the current printk. In summary the current
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003117# printk includes all preceding printk's which have no newline on the end.
Andy Whitcroft00df3442007-06-08 13:47:06 -07003118# we assume the first bad printk is the one to report.
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003119 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07003120 my $ok = 0;
3121 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
3122 #print "CHECK<$lines[$ln - 1]\n";
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003123 # we have a preceding printk if it ends
Andy Whitcroft00df3442007-06-08 13:47:06 -07003124 # with "\n" ignore it, else it is to blame
3125 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
3126 if ($rawlines[$ln - 1] !~ m{\\n"}) {
3127 $ok = 1;
3128 }
3129 last;
3130 }
3131 }
3132 if ($ok == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003133 WARN("PRINTK_WITHOUT_KERN_LEVEL",
3134 "printk() should include KERN_ facility level\n" . $herecurr);
Andy Whitcroft00df3442007-06-08 13:47:06 -07003135 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003136 }
3137
Joe Perches243f3802012-05-31 16:26:09 -07003138 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3139 my $orig = $1;
3140 my $level = lc($orig);
3141 $level = "warn" if ($level eq "warning");
Joe Perches8f26b832012-10-04 17:13:32 -07003142 my $level2 = $level;
3143 $level2 = "dbg" if ($level eq "debug");
Joe Perches243f3802012-05-31 16:26:09 -07003144 WARN("PREFER_PR_LEVEL",
Yogesh Chaudharidaa8b052014-04-03 14:49:23 -07003145 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
Joe Perches243f3802012-05-31 16:26:09 -07003146 }
3147
3148 if ($line =~ /\bpr_warning\s*\(/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003149 if (WARN("PREFER_PR_LEVEL",
3150 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
3151 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003152 $fixed[$fixlinenr] =~
Joe Perchesd5e616f2013-09-11 14:23:54 -07003153 s/\bpr_warning\b/pr_warn/;
3154 }
Joe Perches243f3802012-05-31 16:26:09 -07003155 }
3156
Joe Perchesdc139312013-02-21 16:44:13 -08003157 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3158 my $orig = $1;
3159 my $level = lc($orig);
3160 $level = "warn" if ($level eq "warning");
3161 $level = "dbg" if ($level eq "debug");
3162 WARN("PREFER_DEV_LEVEL",
3163 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3164 }
3165
Andy Whitcroft653d4872007-06-23 17:16:34 -07003166# function brace can't be on same line, except for #defines of do while,
3167# or if closed on same line
Joe Perches8d182472014-08-06 16:11:12 -07003168 if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003169 !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
Joe Perches8d182472014-08-06 16:11:12 -07003170 if (ERROR("OPEN_BRACE",
3171 "open brace '{' following function declarations go on the next line\n" . $herecurr) &&
3172 $fix) {
3173 fix_delete_line($fixlinenr, $rawline);
3174 my $fixed_line = $rawline;
3175 $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
3176 my $line1 = $1;
3177 my $line2 = $2;
3178 fix_insert_line($fixlinenr, ltrim($line1));
3179 fix_insert_line($fixlinenr, "\+{");
3180 if ($line2 !~ /^\s*$/) {
3181 fix_insert_line($fixlinenr, "\+\t" . trim($line2));
3182 }
3183 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003184 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003185
Andy Whitcroft8905a672007-11-28 16:21:06 -08003186# open braces for enum, union and struct go on the same line.
3187 if ($line =~ /^.\s*{/ &&
3188 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
Joe Perches8d182472014-08-06 16:11:12 -07003189 if (ERROR("OPEN_BRACE",
3190 "open brace '{' following $1 go on the same line\n" . $hereprev) &&
3191 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3192 fix_delete_line($fixlinenr - 1, $prevrawline);
3193 fix_delete_line($fixlinenr, $rawline);
3194 my $fixedline = rtrim($prevrawline) . " {";
3195 fix_insert_line($fixlinenr, $fixedline);
3196 $fixedline = $rawline;
3197 $fixedline =~ s/^(.\s*){\s*/$1\t/;
3198 if ($fixedline !~ /^\+\s*$/) {
3199 fix_insert_line($fixlinenr, $fixedline);
3200 }
3201 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08003202 }
3203
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07003204# missing space after union, struct or enum definition
Joe Perches3705ce52013-07-03 15:05:31 -07003205 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
3206 if (WARN("SPACING",
3207 "missing space after $1 definition\n" . $herecurr) &&
3208 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003209 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003210 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
3211 }
Andy Whitcroft0c73b4e2010-10-26 14:23:15 -07003212 }
3213
Joe Perches31070b52014-01-23 15:54:49 -08003214# Function pointer declarations
3215# check spacing between type, funcptr, and args
3216# canonical declaration is "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07003217 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
Joe Perches31070b52014-01-23 15:54:49 -08003218 my $declare = $1;
3219 my $pre_pointer_space = $2;
3220 my $post_pointer_space = $3;
3221 my $funcname = $4;
3222 my $post_funcname_space = $5;
3223 my $pre_args_space = $6;
3224
Joe Perches91f72e92014-04-03 14:49:12 -07003225# the $Declare variable will capture all spaces after the type
3226# so check it for a missing trailing missing space but pointer return types
3227# don't need a space so don't warn for those.
3228 my $post_declare_space = "";
3229 if ($declare =~ /(\s+)$/) {
3230 $post_declare_space = $1;
3231 $declare = rtrim($declare);
3232 }
3233 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
Joe Perches31070b52014-01-23 15:54:49 -08003234 WARN("SPACING",
3235 "missing space after return type\n" . $herecurr);
Joe Perches91f72e92014-04-03 14:49:12 -07003236 $post_declare_space = " ";
Joe Perches31070b52014-01-23 15:54:49 -08003237 }
3238
3239# unnecessary space "type (*funcptr)(args...)"
Joe Perches91f72e92014-04-03 14:49:12 -07003240# This test is not currently implemented because these declarations are
3241# equivalent to
3242# int foo(int bar, ...)
3243# and this is form shouldn't/doesn't generate a checkpatch warning.
3244#
3245# elsif ($declare =~ /\s{2,}$/) {
3246# WARN("SPACING",
3247# "Multiple spaces after return type\n" . $herecurr);
3248# }
Joe Perches31070b52014-01-23 15:54:49 -08003249
3250# unnecessary space "type ( *funcptr)(args...)"
3251 if (defined $pre_pointer_space &&
3252 $pre_pointer_space =~ /^\s/) {
3253 WARN("SPACING",
3254 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3255 }
3256
3257# unnecessary space "type (* funcptr)(args...)"
3258 if (defined $post_pointer_space &&
3259 $post_pointer_space =~ /^\s/) {
3260 WARN("SPACING",
3261 "Unnecessary space before function pointer name\n" . $herecurr);
3262 }
3263
3264# unnecessary space "type (*funcptr )(args...)"
3265 if (defined $post_funcname_space &&
3266 $post_funcname_space =~ /^\s/) {
3267 WARN("SPACING",
3268 "Unnecessary space after function pointer name\n" . $herecurr);
3269 }
3270
3271# unnecessary space "type (*funcptr) (args...)"
3272 if (defined $pre_args_space &&
3273 $pre_args_space =~ /^\s/) {
3274 WARN("SPACING",
3275 "Unnecessary space before function pointer arguments\n" . $herecurr);
3276 }
3277
3278 if (show_type("SPACING") && $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003279 $fixed[$fixlinenr] =~
Joe Perches91f72e92014-04-03 14:49:12 -07003280 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
Joe Perches31070b52014-01-23 15:54:49 -08003281 }
3282 }
3283
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003284# check for spacing round square brackets; allowed:
3285# 1. with a type on the left -- int [] a;
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07003286# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
3287# 3. inside a curly brace -- = { [0...10] = 5 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003288 while ($line =~ /(.*?\s)\[/g) {
3289 my ($where, $prefix) = ($-[1], $1);
3290 if ($prefix !~ /$Type\s+$/ &&
Andy Whitcroftfe2a7db2008-10-15 22:02:15 -07003291 ($where != 0 || $prefix !~ /^.\s+$/) &&
Andy Whitcroftdaebc532012-03-23 15:02:17 -07003292 $prefix !~ /[{,]\s+$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003293 if (ERROR("BRACKET_SPACE",
3294 "space prohibited before open square bracket '['\n" . $herecurr) &&
3295 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003296 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003297 s/^(\+.*?)\s+\[/$1\[/;
3298 }
Andy Whitcroft8d31cfc2008-07-23 21:29:02 -07003299 }
3300 }
3301
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003302# check for spaces between functions and their parentheses.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003303 while ($line =~ /($Ident)\s+\(/g) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003304 my $name = $1;
Andy Whitcroft773647a2008-03-28 14:15:58 -07003305 my $ctx_before = substr($line, 0, $-[1]);
3306 my $ctx = "$ctx_before$name";
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003307
3308 # Ignore those directives where spaces _are_ permitted.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003309 if ($name =~ /^(?:
3310 if|for|while|switch|return|case|
3311 volatile|__volatile__|
3312 __attribute__|format|__extension__|
3313 asm|__asm__)$/x)
3314 {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003315 # cpp #define statements have non-optional spaces, ie
3316 # if there is a space between the name and the open
3317 # parenthesis it is simply not a parameter group.
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003318 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003319
3320 # cpp #elif statement condition may start with a (
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003321 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003322
3323 # If this whole things ends with a type its most
3324 # likely a typedef for a function.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003325 } elsif ($ctx =~ /$Type$/) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003326
3327 } else {
Joe Perches3705ce52013-07-03 15:05:31 -07003328 if (WARN("SPACING",
3329 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
3330 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003331 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003332 s/\b$name\s+\(/$name\(/;
3333 }
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003334 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003335 }
Eric Nelson9a4cad42012-05-31 16:26:09 -07003336
Andy Whitcroft653d4872007-06-23 17:16:34 -07003337# Check operator spacing.
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003338 if (!($line=~/\#\s*include/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003339 my $fixed_line = "";
3340 my $line_fixed = 0;
3341
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003342 my $ops = qr{
3343 <<=|>>=|<=|>=|==|!=|
3344 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3345 =>|->|<<|>>|<|>|=|!|~|
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003346 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
Joe Perches84731622013-11-12 15:10:05 -08003347 \?:|\?|:
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003348 }x;
Andy Whitcroftcf655042008-03-04 14:28:20 -08003349 my @elements = split(/($ops|;)/, $opline);
Joe Perches3705ce52013-07-03 15:05:31 -07003350
3351## print("element count: <" . $#elements . ">\n");
3352## foreach my $el (@elements) {
3353## print("el: <$el>\n");
3354## }
3355
3356 my @fix_elements = ();
Andy Whitcroft00df3442007-06-08 13:47:06 -07003357 my $off = 0;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003358
Joe Perches3705ce52013-07-03 15:05:31 -07003359 foreach my $el (@elements) {
3360 push(@fix_elements, substr($rawline, $off, length($el)));
3361 $off += length($el);
3362 }
3363
3364 $off = 0;
3365
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003366 my $blank = copy_spacing($opline);
Joe Perchesb34c6482013-09-11 14:24:01 -07003367 my $last_after = -1;
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003368
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003369 for (my $n = 0; $n < $#elements; $n += 2) {
Joe Perches3705ce52013-07-03 15:05:31 -07003370
3371 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
3372
3373## print("n: <$n> good: <$good>\n");
3374
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003375 $off += length($elements[$n]);
3376
Lucas De Marchi25985ed2011-03-30 22:57:33 -03003377 # Pick up the preceding and succeeding characters.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003378 my $ca = substr($opline, 0, $off);
3379 my $cc = '';
3380 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3381 $cc = substr($opline, $off + length($elements[$n + 1]));
3382 }
3383 my $cb = "$ca$;$cc";
3384
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003385 my $a = '';
3386 $a = 'V' if ($elements[$n] ne '');
3387 $a = 'W' if ($elements[$n] =~ /\s$/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003388 $a = 'C' if ($elements[$n] =~ /$;$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003389 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3390 $a = 'O' if ($elements[$n] eq '');
Andy Whitcroft773647a2008-03-28 14:15:58 -07003391 $a = 'E' if ($ca =~ /^\s*$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003392
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003393 my $op = $elements[$n + 1];
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003394
3395 my $c = '';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003396 if (defined $elements[$n + 2]) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003397 $c = 'V' if ($elements[$n + 2] ne '');
3398 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
Andy Whitcroftcf655042008-03-04 14:28:20 -08003399 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003400 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3401 $c = 'O' if ($elements[$n + 2] eq '');
Andy Whitcroft8b1b3372009-01-06 14:41:27 -08003402 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003403 } else {
3404 $c = 'E';
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003405 }
3406
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003407 my $ctx = "${a}x${c}";
3408
3409 my $at = "(ctx:$ctx)";
3410
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003411 my $ptr = substr($blank, 0, $off) . "^";
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003412 my $hereptr = "$hereline$ptr\n";
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003413
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003414 # Pull out the value of this operator.
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07003415 my $op_type = substr($curr_values, $off + 1, 1);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003416
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003417 # Get the full operator variant.
3418 my $opv = $op . substr($curr_vars, $off, 1);
3419
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003420 # Ignore operators passed as parameters.
3421 if ($op_type ne 'V' &&
3422 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3423
Andy Whitcroftcf655042008-03-04 14:28:20 -08003424# # Ignore comments
3425# } elsif ($op =~ /^$;+$/) {
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003426
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003427 # ; should have either the end of line or a space or \ after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003428 } elsif ($op eq ';') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003429 if ($ctx !~ /.x[WEBC]/ &&
3430 $cc !~ /^\\/ && $cc !~ /^;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003431 if (ERROR("SPACING",
3432 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003433 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003434 $line_fixed = 1;
3435 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07003436 }
3437
3438 # // is a comment
3439 } elsif ($op eq '//') {
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003440
Joe Perchesb00e4812014-04-03 14:49:33 -07003441 # : when part of a bitfield
3442 } elsif ($opv eq ':B') {
3443 # skip the bitfield test for now
3444
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003445 # No spaces for:
3446 # ->
Joe Perchesb00e4812014-04-03 14:49:33 -07003447 } elsif ($op eq '->') {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003448 if ($ctx =~ /Wx.|.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003449 if (ERROR("SPACING",
3450 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003451 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003452 if (defined $fix_elements[$n + 2]) {
3453 $fix_elements[$n + 2] =~ s/^\s+//;
3454 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003455 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003456 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003457 }
3458
3459 # , must have a space on the right.
3460 } elsif ($op eq ',') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003461 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003462 if (ERROR("SPACING",
3463 "space required after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003464 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003465 $line_fixed = 1;
Joe Perchesb34c6482013-09-11 14:24:01 -07003466 $last_after = $n;
Joe Perches3705ce52013-07-03 15:05:31 -07003467 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003468 }
3469
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003470 # '*' as part of a type definition -- reported already.
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003471 } elsif ($opv eq '*_') {
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003472 #warn "'*' is part of type\n";
3473
3474 # unary operators should have a space before and
3475 # none after. May be left adjacent to another
3476 # unary operator, or a cast
3477 } elsif ($op eq '!' || $op eq '~' ||
Andy Whitcroft74048ed2008-07-23 21:29:10 -07003478 $opv eq '*U' || $opv eq '-U' ||
Andy Whitcroft0d413862008-10-15 22:02:16 -07003479 $opv eq '&U' || $opv eq '&&U') {
Andy Whitcroftcf655042008-03-04 14:28:20 -08003480 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003481 if (ERROR("SPACING",
3482 "space required before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003483 if ($n != $last_after + 2) {
3484 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
3485 $line_fixed = 1;
3486 }
Joe Perches3705ce52013-07-03 15:05:31 -07003487 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003488 }
Andy Whitcrofta3340b32009-02-27 14:03:07 -08003489 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003490 # A unary '*' may be const
3491
3492 } elsif ($ctx =~ /.xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003493 if (ERROR("SPACING",
3494 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003495 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003496 if (defined $fix_elements[$n + 2]) {
3497 $fix_elements[$n + 2] =~ s/^\s+//;
3498 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003499 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003500 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003501 }
3502
3503 # unary ++ and unary -- are allowed no space on one side.
3504 } elsif ($op eq '++' or $op eq '--') {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003505 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003506 if (ERROR("SPACING",
3507 "space required one side of that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003508 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
Joe Perches3705ce52013-07-03 15:05:31 -07003509 $line_fixed = 1;
3510 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003511 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003512 if ($ctx =~ /Wx[BE]/ ||
3513 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003514 if (ERROR("SPACING",
3515 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003516 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003517 $line_fixed = 1;
3518 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07003519 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003520 if ($ctx =~ /ExW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003521 if (ERROR("SPACING",
3522 "space prohibited after that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003523 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003524 if (defined $fix_elements[$n + 2]) {
3525 $fix_elements[$n + 2] =~ s/^\s+//;
3526 }
Joe Perchesb34c6482013-09-11 14:24:01 -07003527 $line_fixed = 1;
Joe Perches3705ce52013-07-03 15:05:31 -07003528 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07003529 }
3530
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003531 # << and >> may either have or not have spaces both sides
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003532 } elsif ($op eq '<<' or $op eq '>>' or
3533 $op eq '&' or $op eq '^' or $op eq '|' or
3534 $op eq '+' or $op eq '-' or
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003535 $op eq '*' or $op eq '/' or
3536 $op eq '%')
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003537 {
Andy Whitcroft773647a2008-03-28 14:15:58 -07003538 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003539 if (ERROR("SPACING",
3540 "need consistent spacing around '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003541 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3542 if (defined $fix_elements[$n + 2]) {
3543 $fix_elements[$n + 2] =~ s/^\s+//;
3544 }
Joe Perches3705ce52013-07-03 15:05:31 -07003545 $line_fixed = 1;
3546 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003547 }
3548
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003549 # A colon needs no spaces before when it is
3550 # terminating a case value or a label.
3551 } elsif ($opv eq ':C' || $opv eq ':L') {
3552 if ($ctx =~ /Wx./) {
Joe Perches3705ce52013-07-03 15:05:31 -07003553 if (ERROR("SPACING",
3554 "space prohibited before that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003555 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003556 $line_fixed = 1;
3557 }
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003558 }
3559
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003560 # All the others need spaces both sides.
Andy Whitcroftcf655042008-03-04 14:28:20 -08003561 } elsif ($ctx !~ /[EWC]x[CWE]/) {
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003562 my $ok = 0;
3563
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003564 # Ignore email addresses <foo@bar>
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003565 if (($op eq '<' &&
3566 $cc =~ /^\S+\@\S+>/) ||
3567 ($op eq '>' &&
3568 $ca =~ /<\S+\@\S+$/))
3569 {
3570 $ok = 1;
3571 }
3572
Joe Perches84731622013-11-12 15:10:05 -08003573 # messages are ERROR, but ?: are CHK
Andy Whitcroft1f65f942008-07-23 21:29:10 -07003574 if ($ok == 0) {
Joe Perches84731622013-11-12 15:10:05 -08003575 my $msg_type = \&ERROR;
3576 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
3577
3578 if (&{$msg_type}("SPACING",
3579 "spaces required around that '$op' $at\n" . $hereptr)) {
Joe Perchesb34c6482013-09-11 14:24:01 -07003580 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3581 if (defined $fix_elements[$n + 2]) {
3582 $fix_elements[$n + 2] =~ s/^\s+//;
3583 }
Joe Perches3705ce52013-07-03 15:05:31 -07003584 $line_fixed = 1;
3585 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003586 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003587 }
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003588 $off += length($elements[$n + 1]);
Joe Perches3705ce52013-07-03 15:05:31 -07003589
3590## print("n: <$n> GOOD: <$good>\n");
3591
3592 $fixed_line = $fixed_line . $good;
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003593 }
Joe Perches3705ce52013-07-03 15:05:31 -07003594
3595 if (($#elements % 2) == 0) {
3596 $fixed_line = $fixed_line . $fix_elements[$#elements];
3597 }
3598
Joe Perches194f66f2014-08-06 16:11:03 -07003599 if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
3600 $fixed[$fixlinenr] = $fixed_line;
Joe Perches3705ce52013-07-03 15:05:31 -07003601 }
3602
3603
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003604 }
3605
Joe Perches786b6322013-07-03 15:05:32 -07003606# check for whitespace before a non-naked semicolon
Joe Perchesd2e248e2014-01-23 15:54:41 -08003607 if ($line =~ /^\+.*\S\s+;\s*$/) {
Joe Perches786b6322013-07-03 15:05:32 -07003608 if (WARN("SPACING",
3609 "space prohibited before semicolon\n" . $herecurr) &&
3610 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003611 1 while $fixed[$fixlinenr] =~
Joe Perches786b6322013-07-03 15:05:32 -07003612 s/^(\+.*\S)\s+;/$1;/;
3613 }
3614 }
3615
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003616# check for multiple assignments
3617 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003618 CHK("MULTIPLE_ASSIGNMENTS",
3619 "multiple assignments should be avoided\n" . $herecurr);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003620 }
3621
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003622## # check for multiple declarations, allowing for a function declaration
3623## # continuation.
3624## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3625## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3626##
3627## # Remove any bracketed sections to ensure we do not
3628## # falsly report the parameters of functions.
3629## my $ln = $line;
3630## while ($ln =~ s/\([^\(\)]*\)//g) {
3631## }
3632## if ($ln =~ /,/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003633## WARN("MULTIPLE_DECLARATION",
3634## "declaring multiple variables together should be avoided\n" . $herecurr);
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003635## }
3636## }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07003637
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003638#need space before brace following if, while, etc
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003639 if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
3640 $line =~ /do{/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003641 if (ERROR("SPACING",
3642 "space required before the open brace '{'\n" . $herecurr) &&
3643 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003644 $fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
Joe Perches3705ce52013-07-03 15:05:31 -07003645 }
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003646 }
3647
Joe Perchesc4a62ef2013-07-03 15:05:28 -07003648## # check for blank lines before declarations
3649## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
3650## $prevrawline =~ /^.\s*$/) {
3651## WARN("SPACING",
3652## "No blank lines before declarations\n" . $hereprev);
3653## }
3654##
3655
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07003656# closing brace should have a space following it when it has anything
3657# on the line
3658 if ($line =~ /}(?!(?:,|;|\)))\S/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003659 if (ERROR("SPACING",
3660 "space required after that close brace '}'\n" . $herecurr) &&
3661 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003662 $fixed[$fixlinenr] =~
Joe Perchesd5e616f2013-09-11 14:23:54 -07003663 s/}((?!(?:,|;|\)))\S)/} $1/;
3664 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003665 }
3666
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003667# check spacing on square brackets
3668 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003669 if (ERROR("SPACING",
3670 "space prohibited after that open square bracket '['\n" . $herecurr) &&
3671 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003672 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003673 s/\[\s+/\[/;
3674 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003675 }
3676 if ($line =~ /\s\]/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003677 if (ERROR("SPACING",
3678 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
3679 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003680 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003681 s/\s+\]/\]/;
3682 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003683 }
3684
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003685# check spacing on parentheses
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07003686 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3687 $line !~ /for\s*\(\s+;/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003688 if (ERROR("SPACING",
3689 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
3690 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003691 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003692 s/\(\s+/\(/;
3693 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003694 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003695 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003696 $line !~ /for\s*\(.*;\s+\)/ &&
3697 $line !~ /:\s+\)/) {
Joe Perches3705ce52013-07-03 15:05:31 -07003698 if (ERROR("SPACING",
3699 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
3700 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003701 print("fixlinenr: <$fixlinenr> fixed[fixlinenr]: <$fixed[$fixlinenr]>\n");
3702 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003703 s/\s+\)/\)/;
3704 }
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07003705 }
3706
Joe Perchese2826fd2014-08-06 16:10:48 -07003707# check unnecessary parentheses around addressof/dereference single $Lvals
3708# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
3709
3710 while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
3711 CHK("UNNECESSARY_PARENTHESES",
3712 "Unnecessary parentheses around $1\n" . $herecurr);
3713 }
3714
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003715#goto labels aren't indented, allow a single space however
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07003716 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003717 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
Joe Perches3705ce52013-07-03 15:05:31 -07003718 if (WARN("INDENTED_LABEL",
3719 "labels should not be indented\n" . $herecurr) &&
3720 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003721 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003722 s/^(.)\s+/$1/;
3723 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003724 }
3725
Joe Perches5b9553a2014-04-03 14:49:21 -07003726# return is not a function
Joe Perches507e5142013-11-12 15:10:13 -08003727 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003728 my $spacing = $1;
Joe Perches507e5142013-11-12 15:10:13 -08003729 if ($^V && $^V ge 5.10.0 &&
Joe Perches5b9553a2014-04-03 14:49:21 -07003730 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
3731 my $value = $1;
3732 $value = deparenthesize($value);
3733 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
3734 ERROR("RETURN_PARENTHESES",
3735 "return is not a function, parentheses are not required\n" . $herecurr);
3736 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003737 } elsif ($spacing !~ /\s+/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003738 ERROR("SPACING",
3739 "space required before the open parenthesis '('\n" . $herecurr);
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003740 }
3741 }
Joe Perches507e5142013-11-12 15:10:13 -08003742
Joe Perchesb43ae212014-06-23 13:22:07 -07003743# unnecessary return in a void function
3744# at end-of-function, with the previous line a single leading tab, then return;
3745# and the line before that not a goto label target like "out:"
3746 if ($sline =~ /^[ \+]}\s*$/ &&
3747 $prevline =~ /^\+\treturn\s*;\s*$/ &&
3748 $linenr >= 3 &&
3749 $lines[$linenr - 3] =~ /^[ +]/ &&
3750 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
Joe Perches9819cf22014-06-04 16:12:09 -07003751 WARN("RETURN_VOID",
Joe Perchesb43ae212014-06-23 13:22:07 -07003752 "void function return statements are not generally useful\n" . $hereprev);
3753 }
Joe Perches9819cf22014-06-04 16:12:09 -07003754
Joe Perches189248d2014-01-23 15:54:47 -08003755# if statements using unnecessary parentheses - ie: if ((foo == bar))
3756 if ($^V && $^V ge 5.10.0 &&
3757 $line =~ /\bif\s*((?:\(\s*){2,})/) {
3758 my $openparens = $1;
3759 my $count = $openparens =~ tr@\(@\(@;
3760 my $msg = "";
3761 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
3762 my $comp = $4; #Not $1 because of $LvalOrFunc
3763 $msg = " - maybe == should be = ?" if ($comp eq "==");
3764 WARN("UNNECESSARY_PARENTHESES",
3765 "Unnecessary parentheses$msg\n" . $herecurr);
3766 }
3767 }
3768
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003769# Return of what appears to be an errno should normally be -'ve
3770 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3771 my $name = $1;
3772 if ($name ne 'EOF' && $name ne 'ERROR') {
Joe Perches000d1cc12011-07-25 17:13:25 -07003773 WARN("USE_NEGATIVE_ERRNO",
3774 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
Andy Whitcroft53a3c442010-10-26 14:23:14 -07003775 }
3776 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003777
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003778# Need a space before open parenthesis after if, while etc
Joe Perches3705ce52013-07-03 15:05:31 -07003779 if ($line =~ /\b(if|while|for|switch)\(/) {
3780 if (ERROR("SPACING",
3781 "space required before the open parenthesis '('\n" . $herecurr) &&
3782 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003783 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07003784 s/\b(if|while|for|switch)\(/$1 \(/;
3785 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003786 }
3787
Andy Whitcroftf5fe35d2008-07-23 21:29:03 -07003788# Check for illegal assignment in if conditional -- and check for trailing
3789# statements after the conditional.
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003790 if ($line =~ /do\s*(?!{)/) {
Andy Whitcroft3e469cd2012-01-10 15:10:01 -08003791 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3792 ctx_statement_block($linenr, $realcnt, 0)
3793 if (!defined $stat);
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003794 my ($stat_next) = ctx_statement_block($line_nr_next,
3795 $remain_next, $off_next);
3796 $stat_next =~ s/\n./\n /g;
3797 ##print "stat<$stat> stat_next<$stat_next>\n";
3798
3799 if ($stat_next =~ /^\s*while\b/) {
3800 # If the statement carries leading newlines,
3801 # then count those as offsets.
3802 my ($whitespace) =
3803 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3804 my $offset =
3805 statement_rawlines($whitespace) - 1;
3806
3807 $suppress_whiletrailers{$line_nr_next +
3808 $offset} = 1;
3809 }
3810 }
3811 if (!defined $suppress_whiletrailers{$linenr} &&
Joe Perchesc11230f2013-11-21 14:31:57 -08003812 defined($stat) && defined($cond) &&
Andy Whitcroft170d3a22008-10-15 22:02:30 -07003813 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07003814 my ($s, $c) = ($stat, $cond);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003815
Andy Whitcroftb53c8e12009-01-06 14:41:29 -08003816 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003817 ERROR("ASSIGN_IN_IF",
3818 "do not use assignment in if condition\n" . $herecurr);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003819 }
3820
3821 # Find out what is on the end of the line after the
3822 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003823 substr($s, 0, length($c), '');
Andy Whitcroft8905a672007-11-28 16:21:06 -08003824 $s =~ s/\n.*//g;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003825 $s =~ s/$;//g; # Remove any comments
Andy Whitcroft53210162008-07-23 21:29:03 -07003826 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3827 $c !~ /}\s*while\s*/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07003828 {
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003829 # Find out how long the conditional actually is.
3830 my @newlines = ($c =~ /\n/gs);
3831 my $cond_lines = 1 + $#newlines;
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003832 my $stat_real = '';
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003833
Hidetoshi Seto42bdf742010-03-05 13:43:50 -08003834 $stat_real = raw_line($linenr, $cond_lines)
3835 . "\n" if ($cond_lines);
Andy Whitcroftbb44ad32008-10-15 22:02:34 -07003836 if (defined($stat_real) && $cond_lines > 1) {
3837 $stat_real = "[...]\n$stat_real";
3838 }
3839
Joe Perches000d1cc12011-07-25 17:13:25 -07003840 ERROR("TRAILING_STATEMENTS",
3841 "trailing statements should be on next line\n" . $herecurr . $stat_real);
Andy Whitcroft8905a672007-11-28 16:21:06 -08003842 }
3843 }
3844
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003845# Check for bitwise tests written as boolean
3846 if ($line =~ /
3847 (?:
3848 (?:\[|\(|\&\&|\|\|)
3849 \s*0[xX][0-9]+\s*
3850 (?:\&\&|\|\|)
3851 |
3852 (?:\&\&|\|\|)
3853 \s*0[xX][0-9]+\s*
3854 (?:\&\&|\|\||\)|\])
3855 )/x)
3856 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003857 WARN("HEXADECIMAL_BOOLEAN_TEST",
3858 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003859 }
3860
Andy Whitcroft8905a672007-11-28 16:21:06 -08003861# if and else should not have general statements after it
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003862 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3863 my $s = $1;
3864 $s =~ s/$;//g; # Remove any comments
3865 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003866 ERROR("TRAILING_STATEMENTS",
3867 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08003868 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003869 }
Andy Whitcroft39667782009-01-15 13:51:06 -08003870# if should not continue a brace
3871 if ($line =~ /}\s*if\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003872 ERROR("TRAILING_STATEMENTS",
Rasmus Villemoes048b1232014-08-06 16:10:37 -07003873 "trailing statements should be on next line (or did you mean 'else if'?)\n" .
Andy Whitcroft39667782009-01-15 13:51:06 -08003874 $herecurr);
3875 }
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003876# case and default should not have general statements after them
3877 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3878 $line !~ /\G(?:
Andy Whitcroft3fef12d2008-10-15 22:02:36 -07003879 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003880 \s*return\s+
3881 )/xg)
3882 {
Joe Perches000d1cc12011-07-25 17:13:25 -07003883 ERROR("TRAILING_STATEMENTS",
3884 "trailing statements should be on next line\n" . $herecurr);
Andy Whitcrofta1080bf2008-10-15 22:02:25 -07003885 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003886
3887 # Check for }<nl>else {, these must be at the same
3888 # indent level to be relevant to each other.
Joe Perches8b8856f2014-08-06 16:11:14 -07003889 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
3890 $previndent == $indent) {
3891 if (ERROR("ELSE_AFTER_BRACE",
3892 "else should follow close brace '}'\n" . $hereprev) &&
3893 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3894 fix_delete_line($fixlinenr - 1, $prevrawline);
3895 fix_delete_line($fixlinenr, $rawline);
3896 my $fixedline = $prevrawline;
3897 $fixedline =~ s/}\s*$//;
3898 if ($fixedline !~ /^\+\s*$/) {
3899 fix_insert_line($fixlinenr, $fixedline);
3900 }
3901 $fixedline = $rawline;
3902 $fixedline =~ s/^(.\s*)else/$1} else/;
3903 fix_insert_line($fixlinenr, $fixedline);
3904 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003905 }
3906
Joe Perches8b8856f2014-08-06 16:11:14 -07003907 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
3908 $previndent == $indent) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003909 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3910
3911 # Find out what is on the end of the line after the
3912 # conditional.
Andy Whitcroft773647a2008-03-28 14:15:58 -07003913 substr($s, 0, length($c), '');
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003914 $s =~ s/\n.*//g;
3915
3916 if ($s =~ /^\s*;/) {
Joe Perches8b8856f2014-08-06 16:11:14 -07003917 if (ERROR("WHILE_AFTER_BRACE",
3918 "while should follow close brace '}'\n" . $hereprev) &&
3919 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3920 fix_delete_line($fixlinenr - 1, $prevrawline);
3921 fix_delete_line($fixlinenr, $rawline);
3922 my $fixedline = $prevrawline;
3923 my $trailing = $rawline;
3924 $trailing =~ s/^\+//;
3925 $trailing = trim($trailing);
3926 $fixedline =~ s/}\s*$/} $trailing/;
3927 fix_insert_line($fixlinenr, $fixedline);
3928 }
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08003929 }
3930 }
3931
Joe Perches95e2c602013-07-03 15:05:20 -07003932#Specific variable tests
Joe Perches323c1262012-12-17 16:02:07 -08003933 while ($line =~ m{($Constant|$Lval)}g) {
3934 my $var = $1;
Joe Perches95e2c602013-07-03 15:05:20 -07003935
3936#gcc binary extension
3937 if ($var =~ /^$Binary$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07003938 if (WARN("GCC_BINARY_CONSTANT",
3939 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
3940 $fix) {
3941 my $hexval = sprintf("0x%x", oct($var));
Joe Perches194f66f2014-08-06 16:11:03 -07003942 $fixed[$fixlinenr] =~
Joe Perchesd5e616f2013-09-11 14:23:54 -07003943 s/\b$var\b/$hexval/;
3944 }
Joe Perches95e2c602013-07-03 15:05:20 -07003945 }
3946
3947#CamelCase
Joe Perches807bd262013-07-03 15:05:22 -07003948 if ($var !~ /^$Constant$/ &&
Joe Perchesbe797942013-07-03 15:05:20 -07003949 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003950#Ignore Page<foo> variants
Joe Perches807bd262013-07-03 15:05:22 -07003951 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
Joe Perches22735ce2013-07-03 15:05:33 -07003952#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
Joe Perches34456862013-07-03 15:05:34 -07003953 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
Joe Perches7e781f62013-09-11 14:23:55 -07003954 while ($var =~ m{($Ident)}g) {
3955 my $word = $1;
3956 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
Joe Perchesd8b07712013-11-12 15:10:06 -08003957 if ($check) {
3958 seed_camelcase_includes();
3959 if (!$file && !$camelcase_file_seeded) {
3960 seed_camelcase_file($realfile);
3961 $camelcase_file_seeded = 1;
3962 }
3963 }
Joe Perches7e781f62013-09-11 14:23:55 -07003964 if (!defined $camelcase{$word}) {
3965 $camelcase{$word} = 1;
3966 CHK("CAMELCASE",
3967 "Avoid CamelCase: <$word>\n" . $herecurr);
3968 }
Joe Perches34456862013-07-03 15:05:34 -07003969 }
Joe Perches323c1262012-12-17 16:02:07 -08003970 }
3971 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003972
3973#no spaces allowed after \ in define
Joe Perchesd5e616f2013-09-11 14:23:54 -07003974 if ($line =~ /\#\s*define.*\\\s+$/) {
3975 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
3976 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
3977 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07003978 $fixed[$fixlinenr] =~ s/\s+$//;
Joe Perchesd5e616f2013-09-11 14:23:54 -07003979 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003980 }
3981
Andy Whitcroft653d4872007-06-23 17:16:34 -07003982#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003983 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003984 my $file = "$1.h";
3985 my $checkfile = "include/linux/$file";
3986 if (-f "$root/$checkfile" &&
3987 $realfile ne $checkfile &&
Wolfram Sang7840a942010-08-09 17:20:57 -07003988 $1 !~ /$allowed_asm_includes/)
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07003989 {
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003990 if ($realfile =~ m{^arch/}) {
Joe Perches000d1cc12011-07-25 17:13:25 -07003991 CHK("ARCH_INCLUDE_LINUX",
3992 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003993 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07003994 WARN("INCLUDE_LINUX",
3995 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
Andy Whitcrofte09dec42008-10-15 22:02:20 -07003996 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07003997 }
3998 }
3999
Andy Whitcroft653d4872007-06-23 17:16:34 -07004000# multi-statement macros should be enclosed in a do while loop, grab the
4001# first statement and ensure its the whole macro if its not enclosed
Andy Whitcroftcf655042008-03-04 14:28:20 -08004002# in a known good container
Andy Whitcroftb8f96a312008-07-23 21:29:07 -07004003 if ($realfile !~ m@/vmlinux.lds.h$@ &&
4004 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07004005 my $ln = $linenr;
4006 my $cnt = $realcnt;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004007 my ($off, $dstat, $dcond, $rest);
4008 my $ctx = '';
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004009 ($dstat, $dcond, $ln, $cnt, $off) =
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004010 ctx_statement_block($linenr, $realcnt, 0);
4011 $ctx = $dstat;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004012 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
Andy Whitcrofta3bb97a2008-07-23 21:29:00 -07004013 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004014
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004015 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
Andy Whitcroft292f1a92008-07-23 21:29:11 -07004016 $dstat =~ s/$;//g;
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004017 $dstat =~ s/\\\n.//g;
4018 $dstat =~ s/^\s*//s;
4019 $dstat =~ s/\s*$//s;
4020
4021 # Flatten any parentheses and braces
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07004022 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
4023 $dstat =~ s/\{[^\{\}]*\}/1/ ||
Andy Whitcroftc81769f2012-01-10 15:10:10 -08004024 $dstat =~ s/\[[^\[\]]*\]/1/)
Andy Whitcroftbf30d6e2008-10-15 22:02:33 -07004025 {
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004026 }
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07004027
Andy Whitcrofte45bab82012-03-23 15:02:18 -07004028 # Flatten any obvious string concatentation.
4029 while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
4030 $dstat =~ s/$Ident\s*("X*")/$1/)
4031 {
4032 }
4033
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004034 my $exceptions = qr{
4035 $Declare|
4036 module_param_named|
Kees Cooka0a0a7a2012-10-04 17:13:38 -07004037 MODULE_PARM_DESC|
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004038 DECLARE_PER_CPU|
4039 DEFINE_PER_CPU|
Andy Whitcroft383099f2009-01-06 14:41:18 -08004040 __typeof__\(|
Stefani Seibold22fd2d32010-03-05 13:43:52 -08004041 union|
4042 struct|
Andy Whitcroftea71a0a2009-09-21 17:04:38 -07004043 \.$Ident\s*=\s*|
4044 ^\"|\"$
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004045 }x;
Andy Whitcroft5eaa20b2010-10-26 14:23:18 -07004046 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004047 if ($dstat ne '' &&
4048 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
4049 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
Joe Perches3cc4b1c2013-07-03 15:05:27 -07004050 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
Joe Perches356fd392014-08-06 16:10:31 -07004051 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004052 $dstat !~ /$exceptions/ &&
4053 $dstat !~ /^\.$Ident\s*=/ && # .foo =
Joe Perchese942e2c2013-04-17 15:58:26 -07004054 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
Andy Whitcroft72f115f2012-01-10 15:10:06 -08004055 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004056 $dstat !~ /^for\s*$Constant$/ && # for (...)
4057 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
4058 $dstat !~ /^do\s*{/ && # do {...
Joe Perchesf95a7e62013-09-11 14:24:00 -07004059 $dstat !~ /^\({/ && # ({...
4060 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004061 {
4062 $ctx =~ s/\n*$//;
4063 my $herectx = $here . "\n";
4064 my $cnt = statement_rawlines($ctx);
4065
4066 for (my $n = 0; $n < $cnt; $n++) {
4067 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004068 }
4069
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004070 if ($dstat =~ /;/) {
4071 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4072 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
4073 } else {
Joe Perches000d1cc12011-07-25 17:13:25 -07004074 ERROR("COMPLEX_MACRO",
Andy Whitcroftf74bd192012-01-10 15:09:54 -08004075 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
Andy Whitcroftd8aaf122007-06-23 17:16:44 -07004076 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004077 }
Joe Perches5023d342012-12-17 16:01:47 -08004078
Joe Perches481eb482012-12-17 16:01:56 -08004079# check for line continuations outside of #defines, preprocessor #, and asm
Joe Perches5023d342012-12-17 16:01:47 -08004080
4081 } else {
4082 if ($prevline !~ /^..*\\$/ &&
Joe Perches481eb482012-12-17 16:01:56 -08004083 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
4084 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
Joe Perches5023d342012-12-17 16:01:47 -08004085 $line =~ /^\+.*\\$/) {
4086 WARN("LINE_CONTINUATIONS",
4087 "Avoid unnecessary line continuations\n" . $herecurr);
4088 }
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004089 }
4090
Joe Perchesb13edf72012-07-30 14:41:24 -07004091# do {} while (0) macro tests:
4092# single-statement macros do not need to be enclosed in do while (0) loop,
4093# macro should not end with a semicolon
4094 if ($^V && $^V ge 5.10.0 &&
4095 $realfile !~ m@/vmlinux.lds.h$@ &&
4096 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
4097 my $ln = $linenr;
4098 my $cnt = $realcnt;
4099 my ($off, $dstat, $dcond, $rest);
4100 my $ctx = '';
4101 ($dstat, $dcond, $ln, $cnt, $off) =
4102 ctx_statement_block($linenr, $realcnt, 0);
4103 $ctx = $dstat;
4104
4105 $dstat =~ s/\\\n.//g;
4106
4107 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
4108 my $stmts = $2;
4109 my $semis = $3;
4110
4111 $ctx =~ s/\n*$//;
4112 my $cnt = statement_rawlines($ctx);
4113 my $herectx = $here . "\n";
4114
4115 for (my $n = 0; $n < $cnt; $n++) {
4116 $herectx .= raw_line($linenr, $n) . "\n";
4117 }
4118
Joe Perchesac8e97f2012-08-21 16:15:53 -07004119 if (($stmts =~ tr/;/;/) == 1 &&
4120 $stmts !~ /^\s*(if|while|for|switch)\b/) {
Joe Perchesb13edf72012-07-30 14:41:24 -07004121 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
4122 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
4123 }
4124 if (defined $semis && $semis ne "") {
4125 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
4126 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
4127 }
Joe Perchesf5ef95b2014-06-04 16:12:06 -07004128 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
4129 $ctx =~ s/\n*$//;
4130 my $cnt = statement_rawlines($ctx);
4131 my $herectx = $here . "\n";
4132
4133 for (my $n = 0; $n < $cnt; $n++) {
4134 $herectx .= raw_line($linenr, $n) . "\n";
4135 }
4136
4137 WARN("TRAILING_SEMICOLON",
4138 "macros should not use a trailing semicolon\n" . "$herectx");
Joe Perchesb13edf72012-07-30 14:41:24 -07004139 }
4140 }
4141
Mike Frysinger080ba922009-01-06 14:41:25 -08004142# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
4143# all assignments may have only one of the following with an assignment:
4144# .
4145# ALIGN(...)
4146# VMLINUX_SYMBOL(...)
4147 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004148 WARN("MISSING_VMLINUX_SYMBOL",
4149 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
Mike Frysinger080ba922009-01-06 14:41:25 -08004150 }
4151
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004152# check for redundant bracing round if etc
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004153 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
4154 my ($level, $endln, @chunks) =
Andy Whitcroftcf655042008-03-04 14:28:20 -08004155 ctx_statement_full($linenr, $realcnt, 1);
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004156 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004157 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
4158 if ($#chunks > 0 && $level == 0) {
Joe Perchesaad4f612012-03-23 15:02:19 -07004159 my @allowed = ();
4160 my $allow = 0;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004161 my $seen = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07004162 my $herectx = $here . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004163 my $ln = $linenr - 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004164 for my $chunk (@chunks) {
4165 my ($cond, $block) = @{$chunk};
4166
Andy Whitcroft773647a2008-03-28 14:15:58 -07004167 # If the condition carries leading newlines, then count those as offsets.
4168 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
4169 my $offset = statement_rawlines($whitespace) - 1;
4170
Joe Perchesaad4f612012-03-23 15:02:19 -07004171 $allowed[$allow] = 0;
Andy Whitcroft773647a2008-03-28 14:15:58 -07004172 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
4173
4174 # We have looked at and allowed this specific line.
4175 $suppress_ifbraces{$ln + $offset} = 1;
4176
4177 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004178 $ln += statement_rawlines($block) - 1;
4179
Andy Whitcroft773647a2008-03-28 14:15:58 -07004180 substr($block, 0, length($cond), '');
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004181
4182 $seen++ if ($block =~ /^\s*{/);
4183
Joe Perchesaad4f612012-03-23 15:02:19 -07004184 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004185 if (statement_lines($cond) > 1) {
4186 #print "APW: ALLOWED: cond<$cond>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004187 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004188 }
4189 if ($block =~/\b(?:if|for|while)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08004190 #print "APW: ALLOWED: block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004191 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004192 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08004193 if (statement_block_size($block) > 1) {
4194 #print "APW: ALLOWED: lines block<$block>\n";
Joe Perchesaad4f612012-03-23 15:02:19 -07004195 $allowed[$allow] = 1;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004196 }
Joe Perchesaad4f612012-03-23 15:02:19 -07004197 $allow++;
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004198 }
Joe Perchesaad4f612012-03-23 15:02:19 -07004199 if ($seen) {
4200 my $sum_allowed = 0;
4201 foreach (@allowed) {
4202 $sum_allowed += $_;
4203 }
4204 if ($sum_allowed == 0) {
4205 WARN("BRACES",
4206 "braces {} are not necessary for any arm of this statement\n" . $herectx);
4207 } elsif ($sum_allowed != $allow &&
4208 $seen != $allow) {
4209 CHK("BRACES",
4210 "braces {} should be used on all arms of this statement\n" . $herectx);
4211 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004212 }
4213 }
4214 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004215 if (!defined $suppress_ifbraces{$linenr - 1} &&
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004216 $line =~ /\b(if|while|for|else)\b/) {
Andy Whitcroftcf655042008-03-04 14:28:20 -08004217 my $allowed = 0;
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004218
Andy Whitcroftcf655042008-03-04 14:28:20 -08004219 # Check the pre-context.
4220 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
4221 #print "APW: ALLOWED: pre<$1>\n";
4222 $allowed = 1;
4223 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004224
4225 my ($level, $endln, @chunks) =
4226 ctx_statement_full($linenr, $realcnt, $-[0]);
4227
Andy Whitcroftcf655042008-03-04 14:28:20 -08004228 # Check the condition.
4229 my ($cond, $block) = @{$chunks[0]};
Andy Whitcroft773647a2008-03-28 14:15:58 -07004230 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004231 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07004232 substr($block, 0, length($cond), '');
Andy Whitcroftcf655042008-03-04 14:28:20 -08004233 }
4234 if (statement_lines($cond) > 1) {
4235 #print "APW: ALLOWED: cond<$cond>\n";
4236 $allowed = 1;
4237 }
4238 if ($block =~/\b(?:if|for|while)\b/) {
4239 #print "APW: ALLOWED: block<$block>\n";
4240 $allowed = 1;
4241 }
4242 if (statement_block_size($block) > 1) {
4243 #print "APW: ALLOWED: lines block<$block>\n";
4244 $allowed = 1;
4245 }
4246 # Check the post-context.
4247 if (defined $chunks[1]) {
4248 my ($cond, $block) = @{$chunks[1]};
4249 if (defined $cond) {
Andy Whitcroft773647a2008-03-28 14:15:58 -07004250 substr($block, 0, length($cond), '');
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004251 }
Andy Whitcroftcf655042008-03-04 14:28:20 -08004252 if ($block =~ /^\s*\{/) {
4253 #print "APW: ALLOWED: chunk-1 block<$block>\n";
4254 $allowed = 1;
4255 }
4256 }
4257 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
Justin P. Mattock69932482011-07-26 23:06:29 -07004258 my $herectx = $here . "\n";
Andy Whitcroftf0556632008-10-15 22:02:23 -07004259 my $cnt = statement_rawlines($block);
Andy Whitcroftcf655042008-03-04 14:28:20 -08004260
Andy Whitcroftf0556632008-10-15 22:02:23 -07004261 for (my $n = 0; $n < $cnt; $n++) {
Justin P. Mattock69932482011-07-26 23:06:29 -07004262 $herectx .= raw_line($linenr, $n) . "\n";
Andy Whitcroftcf655042008-03-04 14:28:20 -08004263 }
4264
Joe Perches000d1cc12011-07-25 17:13:25 -07004265 WARN("BRACES",
4266 "braces {} are not necessary for single statement blocks\n" . $herectx);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004267 }
4268 }
4269
Joe Perches0979ae62012-12-17 16:01:59 -08004270# check for unnecessary blank lines around braces
Joe Perches77b9a532013-07-03 15:05:29 -07004271 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08004272 CHK("BRACES",
4273 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
4274 }
Joe Perches77b9a532013-07-03 15:05:29 -07004275 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
Joe Perches0979ae62012-12-17 16:01:59 -08004276 CHK("BRACES",
4277 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
4278 }
4279
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004280# no volatiles please
Andy Whitcroft6c72ffa2007-10-18 03:05:08 -07004281 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
4282 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004283 WARN("VOLATILE",
4284 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004285 }
4286
Andy Whitcroft00df3442007-06-08 13:47:06 -07004287# warn about #if 0
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004288 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004289 CHK("REDUNDANT_CODE",
4290 "if this code is redundant consider removing it\n" .
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004291 $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004292 }
4293
Andy Whitcroft03df4b52012-12-17 16:01:52 -08004294# check for needless "if (<foo>) fn(<foo>)" uses
4295 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
4296 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
4297 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
4298 WARN('NEEDLESS_IF',
4299 "$1(NULL) is safe this check is probably not required\n" . $hereprev);
Greg Kroah-Hartman4c432a82008-07-23 21:29:04 -07004300 }
4301 }
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07004302
Joe Perchesebfdc402014-08-06 16:10:27 -07004303# check for unnecessary "Out of Memory" messages
4304 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
4305 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
4306 (defined $1 || defined $3) &&
4307 $linenr > 3) {
4308 my $testval = $2;
4309 my $testline = $lines[$linenr - 3];
4310
4311 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
4312# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
4313
4314 if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
4315 WARN("OOM_MESSAGE",
4316 "Possible unnecessary 'out of memory' message\n" . $hereprev);
4317 }
4318 }
4319
Joe Perches8716de32013-09-11 14:24:05 -07004320# check for bad placement of section $InitAttribute (e.g.: __initdata)
4321 if ($line =~ /(\b$InitAttribute\b)/) {
4322 my $attr = $1;
4323 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
4324 my $ptr = $1;
4325 my $var = $2;
4326 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
4327 ERROR("MISPLACED_INIT",
4328 "$attr should be placed after $var\n" . $herecurr)) ||
4329 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
4330 WARN("MISPLACED_INIT",
4331 "$attr should be placed after $var\n" . $herecurr))) &&
4332 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004333 $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;
Joe Perches8716de32013-09-11 14:24:05 -07004334 }
4335 }
4336 }
4337
Joe Perchese970b8842013-11-12 15:10:10 -08004338# check for $InitAttributeData (ie: __initdata) with const
4339 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
4340 my $attr = $1;
4341 $attr =~ /($InitAttributePrefix)(.*)/;
4342 my $attr_prefix = $1;
4343 my $attr_type = $2;
4344 if (ERROR("INIT_ATTRIBUTE",
4345 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
4346 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004347 $fixed[$fixlinenr] =~
Joe Perchese970b8842013-11-12 15:10:10 -08004348 s/$InitAttributeData/${attr_prefix}initconst/;
4349 }
4350 }
4351
4352# check for $InitAttributeConst (ie: __initconst) without const
4353 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
4354 my $attr = $1;
4355 if (ERROR("INIT_ATTRIBUTE",
4356 "Use of $attr requires a separate use of const\n" . $herecurr) &&
4357 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004358 my $lead = $fixed[$fixlinenr] =~
Joe Perchese970b8842013-11-12 15:10:10 -08004359 /(^\+\s*(?:static\s+))/;
4360 $lead = rtrim($1);
4361 $lead = "$lead " if ($lead !~ /^\+$/);
4362 $lead = "${lead}const ";
Joe Perches194f66f2014-08-06 16:11:03 -07004363 $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
Joe Perchese970b8842013-11-12 15:10:10 -08004364 }
4365 }
4366
Joe Perchesfbdb8132014-04-03 14:49:14 -07004367# don't use __constant_<foo> functions outside of include/uapi/
4368 if ($realfile !~ m@^include/uapi/@ &&
4369 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
4370 my $constant_func = $1;
4371 my $func = $constant_func;
4372 $func =~ s/^__constant_//;
4373 if (WARN("CONSTANT_CONVERSION",
4374 "$constant_func should be $func\n" . $herecurr) &&
4375 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004376 $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
Joe Perchesfbdb8132014-04-03 14:49:14 -07004377 }
4378 }
4379
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004380# prefer usleep_range over udelay
Bruce Allan37581c22013-02-21 16:44:19 -08004381 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
Joe Perches43c1d772014-04-03 14:49:11 -07004382 my $delay = $1;
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004383 # ignore udelay's < 10, however
Joe Perches43c1d772014-04-03 14:49:11 -07004384 if (! ($delay < 10) ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004385 CHK("USLEEP_RANGE",
Joe Perches43c1d772014-04-03 14:49:11 -07004386 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
4387 }
4388 if ($delay > 2000) {
4389 WARN("LONG_UDELAY",
4390 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
Patrick Pannuto1a15a252010-08-09 17:21:01 -07004391 }
4392 }
4393
Patrick Pannuto09ef8722010-08-09 17:21:02 -07004394# warn about unexpectedly long msleep's
4395 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
4396 if ($1 < 20) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004397 WARN("MSLEEP",
Joe Perches43c1d772014-04-03 14:49:11 -07004398 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
Patrick Pannuto09ef8722010-08-09 17:21:02 -07004399 }
4400 }
4401
Joe Perches36ec1932013-07-03 15:05:25 -07004402# check for comparisons of jiffies
4403 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
4404 WARN("JIFFIES_COMPARISON",
4405 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
4406 }
4407
Joe Perches9d7a34a2013-07-03 15:05:26 -07004408# check for comparisons of get_jiffies_64()
4409 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
4410 WARN("JIFFIES_COMPARISON",
4411 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
4412 }
4413
Andy Whitcroft00df3442007-06-08 13:47:06 -07004414# warn about #ifdefs in C files
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004415# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
Andy Whitcroft00df3442007-06-08 13:47:06 -07004416# print "#ifdef in C files should be avoided\n";
4417# print "$herecurr";
4418# $clean = 0;
4419# }
4420
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004421# warn about spacing in #ifdefs
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004422 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
Joe Perches3705ce52013-07-03 15:05:31 -07004423 if (ERROR("SPACING",
4424 "exactly one space required after that #$1\n" . $herecurr) &&
4425 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004426 $fixed[$fixlinenr] =~
Joe Perches3705ce52013-07-03 15:05:31 -07004427 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
4428 }
4429
Andy Whitcroft22f2a2e2007-08-10 13:01:03 -07004430 }
4431
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004432# check for spinlock_t definitions without a comment.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004433 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
4434 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004435 my $which = $1;
4436 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004437 CHK("UNCOMMENTED_DEFINITION",
4438 "$1 definition without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004439 }
4440 }
4441# check for memory barriers without a comment.
4442 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
4443 if (!ctx_has_comment($first_line, $linenr)) {
Joe Perchesc1fd7bb2013-11-12 15:10:11 -08004444 WARN("MEMORY_BARRIER",
4445 "memory barrier without comment\n" . $herecurr);
Andy Whitcroft4a0df2e2007-06-08 13:46:39 -07004446 }
4447 }
4448# check of hardware specific defines
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004449 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004450 CHK("ARCH_DEFINES",
4451 "architecture specific defines should be avoided\n" . $herecurr);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07004452 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004453
Tobias Klauserd4977c72010-05-24 14:33:30 -07004454# Check that the storage class is at the beginning of a declaration
4455 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004456 WARN("STORAGE_CLASS",
4457 "storage class should be at the beginning of the declaration\n" . $herecurr)
Tobias Klauserd4977c72010-05-24 14:33:30 -07004458 }
4459
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004460# check the location of the inline attribute, that it is between
4461# storage class and type.
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004462 if ($line =~ /\b$Type\s+$Inline\b/ ||
4463 $line =~ /\b$Inline\s+$Storage\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004464 ERROR("INLINE_LOCATION",
4465 "inline keyword should sit between storage class and type\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004466 }
4467
Andy Whitcroft8905a672007-11-28 16:21:06 -08004468# Check for __inline__ and __inline, prefer inline
Joe Perches2b7ab452013-11-12 15:10:14 -08004469 if ($realfile !~ m@\binclude/uapi/@ &&
4470 $line =~ /\b(__inline__|__inline)\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004471 if (WARN("INLINE",
4472 "plain inline is preferred over $1\n" . $herecurr) &&
4473 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004474 $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004475
4476 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08004477 }
4478
Joe Perches3d130fd2011-01-12 17:00:00 -08004479# Check for __attribute__ packed, prefer __packed
Joe Perches2b7ab452013-11-12 15:10:14 -08004480 if ($realfile !~ m@\binclude/uapi/@ &&
4481 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004482 WARN("PREFER_PACKED",
4483 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
Joe Perches3d130fd2011-01-12 17:00:00 -08004484 }
4485
Joe Perches39b7e282011-07-25 17:13:24 -07004486# Check for __attribute__ aligned, prefer __aligned
Joe Perches2b7ab452013-11-12 15:10:14 -08004487 if ($realfile !~ m@\binclude/uapi/@ &&
4488 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004489 WARN("PREFER_ALIGNED",
4490 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
Joe Perches39b7e282011-07-25 17:13:24 -07004491 }
4492
Joe Perches5f14d3b2012-01-10 15:09:52 -08004493# Check for __attribute__ format(printf, prefer __printf
Joe Perches2b7ab452013-11-12 15:10:14 -08004494 if ($realfile !~ m@\binclude/uapi/@ &&
4495 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004496 if (WARN("PREFER_PRINTF",
4497 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
4498 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004499 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004500
4501 }
Joe Perches5f14d3b2012-01-10 15:09:52 -08004502 }
4503
Joe Perches6061d942012-03-23 15:02:16 -07004504# Check for __attribute__ format(scanf, prefer __scanf
Joe Perches2b7ab452013-11-12 15:10:14 -08004505 if ($realfile !~ m@\binclude/uapi/@ &&
4506 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004507 if (WARN("PREFER_SCANF",
4508 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
4509 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004510 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004511 }
Joe Perches6061d942012-03-23 15:02:16 -07004512 }
4513
Joe Perches8f53a9b2010-03-05 13:43:48 -08004514# check for sizeof(&)
4515 if ($line =~ /\bsizeof\s*\(\s*\&/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004516 WARN("SIZEOF_ADDRESS",
4517 "sizeof(& should be avoided\n" . $herecurr);
Joe Perches8f53a9b2010-03-05 13:43:48 -08004518 }
4519
Joe Perches66c80b62012-07-30 14:41:22 -07004520# check for sizeof without parenthesis
4521 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004522 if (WARN("SIZEOF_PARENTHESIS",
4523 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
4524 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004525 $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004526 }
Joe Perches66c80b62012-07-30 14:41:22 -07004527 }
4528
Joe Perches428e2fd2011-05-24 17:13:39 -07004529# check for line continuations in quoted strings with odd counts of "
4530 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004531 WARN("LINE_CONTINUATIONS",
4532 "Avoid line continuations in quoted strings\n" . $herecurr);
Joe Perches428e2fd2011-05-24 17:13:39 -07004533 }
4534
Joe Perches88982fe2012-12-17 16:02:00 -08004535# check for struct spinlock declarations
4536 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4537 WARN("USE_SPINLOCK_T",
4538 "struct spinlock should be spinlock_t\n" . $herecurr);
4539 }
4540
Joe Perchesa6962d72013-04-29 16:18:13 -07004541# check for seq_printf uses that could be seq_puts
Joe Perches06668722013-11-12 15:10:07 -08004542 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
Joe Perchesa6962d72013-04-29 16:18:13 -07004543 my $fmt = get_quoted_string($line, $rawline);
Joe Perches06668722013-11-12 15:10:07 -08004544 if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004545 if (WARN("PREFER_SEQ_PUTS",
4546 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
4547 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004548 $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004549 }
Joe Perchesa6962d72013-04-29 16:18:13 -07004550 }
4551 }
4552
Andy Whitcroft554e1652012-01-10 15:09:57 -08004553# Check for misused memsets
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004554 if ($^V && $^V ge 5.10.0 &&
4555 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004556 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
Andy Whitcroft554e1652012-01-10 15:09:57 -08004557
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004558 my $ms_addr = $2;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004559 my $ms_val = $7;
4560 my $ms_size = $12;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004561
Andy Whitcroft554e1652012-01-10 15:09:57 -08004562 if ($ms_size =~ /^(0x|)0$/i) {
4563 ERROR("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004564 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
Andy Whitcroft554e1652012-01-10 15:09:57 -08004565 } elsif ($ms_size =~ /^(0x|)1$/i) {
4566 WARN("MEMSET",
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004567 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4568 }
4569 }
4570
Joe Perches98a9bba2014-01-23 15:54:52 -08004571# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
4572 if ($^V && $^V ge 5.10.0 &&
4573 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
4574 if (WARN("PREFER_ETHER_ADDR_COPY",
4575 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
4576 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004577 $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
Joe Perches98a9bba2014-01-23 15:54:52 -08004578 }
4579 }
4580
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004581# typecasts on min/max could be min_t/max_t
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004582 if ($^V && $^V ge 5.10.0 &&
4583 defined $stat &&
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004584 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004585 if (defined $2 || defined $7) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004586 my $call = $1;
4587 my $cast1 = deparenthesize($2);
4588 my $arg1 = $3;
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004589 my $cast2 = deparenthesize($7);
4590 my $arg2 = $8;
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004591 my $cast;
4592
Joe Perchesd1fe9c02012-03-23 15:02:16 -07004593 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
Joe Perchesd7c76ba2012-01-10 15:09:58 -08004594 $cast = "$cast1 or $cast2";
4595 } elsif ($cast1 ne "") {
4596 $cast = $cast1;
4597 } else {
4598 $cast = $cast2;
4599 }
4600 WARN("MINMAX",
4601 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
Andy Whitcroft554e1652012-01-10 15:09:57 -08004602 }
4603 }
4604
Joe Perches4a273192012-07-30 14:41:20 -07004605# check usleep_range arguments
4606 if ($^V && $^V ge 5.10.0 &&
4607 defined $stat &&
4608 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4609 my $min = $1;
4610 my $max = $7;
4611 if ($min eq $max) {
4612 WARN("USLEEP_RANGE",
4613 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4614 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4615 $min > $max) {
4616 WARN("USLEEP_RANGE",
4617 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4618 }
4619 }
4620
Joe Perches823b7942013-11-12 15:10:15 -08004621# check for naked sscanf
4622 if ($^V && $^V ge 5.10.0 &&
4623 defined $stat &&
Joe Perches6c8bd702014-04-03 14:49:16 -07004624 $line =~ /\bsscanf\b/ &&
Joe Perches823b7942013-11-12 15:10:15 -08004625 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
4626 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
4627 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
4628 my $lc = $stat =~ tr@\n@@;
4629 $lc = $lc + $linenr;
4630 my $stat_real = raw_line($linenr, 0);
4631 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4632 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4633 }
4634 WARN("NAKED_SSCANF",
4635 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
4636 }
4637
Joe Perchesafc819a2014-06-04 16:12:08 -07004638# check for simple sscanf that should be kstrto<foo>
4639 if ($^V && $^V ge 5.10.0 &&
4640 defined $stat &&
4641 $line =~ /\bsscanf\b/) {
4642 my $lc = $stat =~ tr@\n@@;
4643 $lc = $lc + $linenr;
4644 my $stat_real = raw_line($linenr, 0);
4645 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4646 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4647 }
4648 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
4649 my $format = $6;
4650 my $count = $format =~ tr@%@%@;
4651 if ($count == 1 &&
4652 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
4653 WARN("SSCANF_TO_KSTRTO",
4654 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
4655 }
4656 }
4657 }
4658
Joe Perches70dc8a42013-09-11 14:23:58 -07004659# check for new externs in .h files.
4660 if ($realfile =~ /\.h$/ &&
4661 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
Joe Perchesd1d85782013-09-24 15:27:46 -07004662 if (CHK("AVOID_EXTERNS",
4663 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
Joe Perches70dc8a42013-09-11 14:23:58 -07004664 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004665 $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
Joe Perches70dc8a42013-09-11 14:23:58 -07004666 }
4667 }
4668
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004669# check for new externs in .c files.
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004670 if ($realfile =~ /\.c$/ && defined $stat &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004671 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004672 {
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004673 my $function_name = $1;
4674 my $paren_space = $2;
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004675
4676 my $s = $stat;
4677 if (defined $cond) {
4678 substr($s, 0, length($cond), '');
4679 }
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004680 if ($s =~ /^\s*;/ &&
4681 $function_name ne 'uninitialized_var')
4682 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004683 WARN("AVOID_EXTERNS",
4684 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004685 }
4686
4687 if ($paren_space =~ /\n/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004688 WARN("FUNCTION_ARGUMENTS",
4689 "arguments for function declarations should follow identifier\n" . $herecurr);
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004690 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004691
4692 } elsif ($realfile =~ /\.c$/ && defined $stat &&
4693 $stat =~ /^.\s*extern\s+/)
4694 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004695 WARN("AVOID_EXTERNS",
4696 "externs should be avoided in .c files\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004697 }
4698
4699# checks for new __setup's
4700 if ($rawline =~ /\b__setup\("([^"]*)"/) {
4701 my $name = $1;
4702
4703 if (!grep(/$name/, @setup_docs)) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004704 CHK("UNDOCUMENTED_SETUP",
4705 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
Andy Whitcroftde7d4f02007-07-15 23:37:22 -07004706 }
Andy Whitcroft653d4872007-06-23 17:16:34 -07004707 }
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004708
4709# check for pointless casting of kmalloc return
Joe Perchescaf2a542011-01-12 16:59:56 -08004710 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004711 WARN("UNNECESSARY_CASTS",
4712 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
Andy Whitcroft9c0ca6f2007-10-16 23:29:38 -07004713 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004714
Joe Perchesa640d252013-07-03 15:05:21 -07004715# alloc style
4716# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
4717 if ($^V && $^V ge 5.10.0 &&
4718 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
4719 CHK("ALLOC_SIZEOF_STRUCT",
4720 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
4721 }
4722
Joe Perches60a55362014-06-04 16:12:07 -07004723# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
4724 if ($^V && $^V ge 5.10.0 &&
Joe Perchese3674552014-08-06 16:10:55 -07004725 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
Joe Perches60a55362014-06-04 16:12:07 -07004726 my $oldfunc = $3;
4727 my $a1 = $4;
4728 my $a2 = $10;
4729 my $newfunc = "kmalloc_array";
4730 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
Joe Perchese3674552014-08-06 16:10:55 -07004731 my $r1 = $a1;
4732 my $r2 = $a2;
4733 if ($a1 =~ /^sizeof\s*\S/) {
4734 $r1 = $a2;
4735 $r2 = $a1;
4736 }
4737 if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
4738 !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
Joe Perches60a55362014-06-04 16:12:07 -07004739 if (WARN("ALLOC_WITH_MULTIPLY",
4740 "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
4741 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004742 $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;
Joe Perches60a55362014-06-04 16:12:07 -07004743
4744 }
4745 }
4746 }
4747
Joe Perches972fdea2013-04-29 16:18:12 -07004748# check for krealloc arg reuse
4749 if ($^V && $^V ge 5.10.0 &&
4750 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
4751 WARN("KREALLOC_ARG_REUSE",
4752 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
4753 }
4754
Joe Perches5ce59ae2013-02-21 16:44:18 -08004755# check for alloc argument mismatch
4756 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4757 WARN("ALLOC_ARRAY_ARGS",
4758 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4759 }
4760
Joe Perchescaf2a542011-01-12 16:59:56 -08004761# check for multiple semicolons
4762 if ($line =~ /;\s*;\s*$/) {
Joe Perchesd5e616f2013-09-11 14:23:54 -07004763 if (WARN("ONE_SEMICOLON",
4764 "Statements terminations use 1 semicolon\n" . $herecurr) &&
4765 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004766 $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004767 }
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004768 }
4769
Joe Perchesc34c09a2014-01-23 15:54:43 -08004770# check for case / default statements not preceeded by break/fallthrough/switch
4771 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
4772 my $has_break = 0;
4773 my $has_statement = 0;
4774 my $count = 0;
4775 my $prevline = $linenr;
4776 while ($prevline > 1 && $count < 3 && !$has_break) {
4777 $prevline--;
4778 my $rline = $rawlines[$prevline - 1];
4779 my $fline = $lines[$prevline - 1];
4780 last if ($fline =~ /^\@\@/);
4781 next if ($fline =~ /^\-/);
4782 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
4783 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
4784 next if ($fline =~ /^.[\s$;]*$/);
4785 $has_statement = 1;
4786 $count++;
4787 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
4788 }
4789 if (!$has_break && $has_statement) {
4790 WARN("MISSING_BREAK",
4791 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
4792 }
4793 }
4794
Joe Perchesd1e2ad02012-12-17 16:02:01 -08004795# check for switch/default statements without a break;
4796 if ($^V && $^V ge 5.10.0 &&
4797 defined $stat &&
4798 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4799 my $ctx = '';
4800 my $herectx = $here . "\n";
4801 my $cnt = statement_rawlines($stat);
4802 for (my $n = 0; $n < $cnt; $n++) {
4803 $herectx .= raw_line($linenr, $n) . "\n";
4804 }
4805 WARN("DEFAULT_NO_BREAK",
4806 "switch default: should use break\n" . $herectx);
Joe Perchescaf2a542011-01-12 16:59:56 -08004807 }
4808
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004809# check for gcc specific __FUNCTION__
Joe Perchesd5e616f2013-09-11 14:23:54 -07004810 if ($line =~ /\b__FUNCTION__\b/) {
4811 if (WARN("USE_FUNC",
4812 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
4813 $fix) {
Joe Perches194f66f2014-08-06 16:11:03 -07004814 $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
Joe Perchesd5e616f2013-09-11 14:23:54 -07004815 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08004816 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004817
Joe Perches2c924882012-03-23 15:02:20 -07004818# check for use of yield()
4819 if ($line =~ /\byield\s*\(\s*\)/) {
4820 WARN("YIELD",
4821 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
4822 }
4823
Joe Perches179f8f42013-07-03 15:05:30 -07004824# check for comparisons against true and false
4825 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
4826 my $lead = $1;
4827 my $arg = $2;
4828 my $test = $3;
4829 my $otype = $4;
4830 my $trail = $5;
4831 my $op = "!";
4832
4833 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
4834
4835 my $type = lc($otype);
4836 if ($type =~ /^(?:true|false)$/) {
4837 if (("$test" eq "==" && "$type" eq "true") ||
4838 ("$test" eq "!=" && "$type" eq "false")) {
4839 $op = "";
4840 }
4841
4842 CHK("BOOL_COMPARISON",
4843 "Using comparison to $otype is error prone\n" . $herecurr);
4844
4845## maybe suggesting a correct construct would better
4846## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
4847
4848 }
4849 }
4850
Thomas Gleixner4882720b2010-09-07 14:34:01 +00004851# check for semaphores initialized locked
4852 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004853 WARN("CONSIDER_COMPLETION",
4854 "consider using a completion\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004855 }
Joe Perches6712d852012-03-23 15:02:20 -07004856
Joe Perches67d0a072011-10-31 17:13:10 -07004857# recommend kstrto* over simple_strto* and strict_strto*
4858 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004859 WARN("CONSIDER_KSTRTO",
Joe Perches67d0a072011-10-31 17:13:10 -07004860 "$1 is obsolete, use k$3 instead\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004861 }
Joe Perches6712d852012-03-23 15:02:20 -07004862
Fabian Frederickae3ccc42014-06-04 16:12:10 -07004863# check for __initcall(), use device_initcall() explicitly or more appropriate function please
Michael Ellermanf3db6632008-07-23 21:28:57 -07004864 if ($line =~ /^.\s*__initcall\s*\(/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004865 WARN("USE_DEVICE_INITCALL",
Fabian Frederickae3ccc42014-06-04 16:12:10 -07004866 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
Michael Ellermanf3db6632008-07-23 21:28:57 -07004867 }
Joe Perches6712d852012-03-23 15:02:20 -07004868
Emese Revfy79404842010-03-05 13:43:53 -08004869# check for various ops structs, ensure they are const.
4870 my $struct_ops = qr{acpi_dock_ops|
4871 address_space_operations|
4872 backlight_ops|
4873 block_device_operations|
4874 dentry_operations|
4875 dev_pm_ops|
4876 dma_map_ops|
4877 extent_io_ops|
4878 file_lock_operations|
4879 file_operations|
4880 hv_ops|
4881 ide_dma_ops|
4882 intel_dvo_dev_ops|
4883 item_operations|
4884 iwl_ops|
4885 kgdb_arch|
4886 kgdb_io|
4887 kset_uevent_ops|
4888 lock_manager_operations|
4889 microcode_ops|
4890 mtrr_ops|
4891 neigh_ops|
4892 nlmsvc_binding|
4893 pci_raw_ops|
4894 pipe_buf_operations|
4895 platform_hibernation_ops|
4896 platform_suspend_ops|
4897 proto_ops|
4898 rpc_pipe_ops|
4899 seq_operations|
4900 snd_ac97_build_ops|
4901 soc_pcmcia_socket_ops|
4902 stacktrace_ops|
4903 sysfs_ops|
4904 tty_operations|
4905 usb_mon_operations|
4906 wd_ops}x;
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004907 if ($line !~ /\bconst\b/ &&
Emese Revfy79404842010-03-05 13:43:53 -08004908 $line =~ /\bstruct\s+($struct_ops)\b/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004909 WARN("CONST_STRUCT",
4910 "struct $1 should normally be const\n" .
Andy Whitcroft6903ffb2009-01-15 13:51:07 -08004911 $herecurr);
Andy Whitcroft2b6db5c2009-01-06 14:41:29 -08004912 }
Andy Whitcroft773647a2008-03-28 14:15:58 -07004913
4914# use of NR_CPUS is usually wrong
4915# ignore definitions of NR_CPUS and usage to define arrays as likely right
4916 if ($line =~ /\bNR_CPUS\b/ &&
Andy Whitcroftc45dcab2008-06-05 22:46:01 -07004917 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4918 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
Andy Whitcroft171ae1a2008-04-29 00:59:32 -07004919 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4920 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4921 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
Andy Whitcroft773647a2008-03-28 14:15:58 -07004922 {
Joe Perches000d1cc12011-07-25 17:13:25 -07004923 WARN("NR_CPUS",
4924 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
Andy Whitcroft773647a2008-03-28 14:15:58 -07004925 }
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004926
Joe Perches52ea8502013-11-12 15:10:09 -08004927# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
4928 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
4929 ERROR("DEFINE_ARCH_HAS",
4930 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
4931 }
4932
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004933# check for %L{u,d,i} in strings
4934 my $string;
4935 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4936 $string = substr($rawline, $-[1], $+[1] - $-[1]);
Andy Whitcroft2a1bc5d2008-10-15 22:02:23 -07004937 $string =~ s/%%/__/g;
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004938 if ($string =~ /(?<!%)%L[udi]/) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004939 WARN("PRINTF_L",
4940 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
Andy Whitcroft9c9ba342008-04-29 00:59:33 -07004941 last;
4942 }
4943 }
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004944
4945# whine mightly about in_atomic
4946 if ($line =~ /\bin_atomic\s*\(/) {
4947 if ($realfile =~ m@^drivers/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004948 ERROR("IN_ATOMIC",
4949 "do not use in_atomic in drivers\n" . $herecurr);
Andy Whitcroftf4a87732009-02-27 14:03:05 -08004950 } elsif ($realfile !~ m@^kernel/@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004951 WARN("IN_ATOMIC",
4952 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
Andy Whitcroft691d77b2009-01-06 14:41:16 -08004953 }
4954 }
Peter Zijlstra1704f472010-03-19 01:37:42 +01004955
4956# check for lockdep_set_novalidate_class
4957 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4958 $line =~ /__lockdep_no_validate__\s*\)/ ) {
4959 if ($realfile !~ m@^kernel/lockdep@ &&
4960 $realfile !~ m@^include/linux/lockdep@ &&
4961 $realfile !~ m@^drivers/base/core@) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004962 ERROR("LOCKDEP",
4963 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
Peter Zijlstra1704f472010-03-19 01:37:42 +01004964 }
4965 }
Dave Jones88f88312011-01-12 16:59:59 -08004966
4967 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4968 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
Joe Perches000d1cc12011-07-25 17:13:25 -07004969 WARN("EXPORTED_WORLD_WRITABLE",
4970 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
Dave Jones88f88312011-01-12 16:59:59 -08004971 }
Joe Perches24358802014-04-03 14:49:13 -07004972
Joe Perches515a2352014-04-03 14:49:24 -07004973# Mode permission misuses where it seems decimal should be octal
4974# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
4975 if ($^V && $^V ge 5.10.0 &&
4976 $line =~ /$mode_perms_search/) {
4977 foreach my $entry (@mode_permission_funcs) {
4978 my $func = $entry->[0];
4979 my $arg_pos = $entry->[1];
Joe Perches24358802014-04-03 14:49:13 -07004980
Joe Perches515a2352014-04-03 14:49:24 -07004981 my $skip_args = "";
4982 if ($arg_pos > 1) {
4983 $arg_pos--;
4984 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
4985 }
4986 my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
4987 if ($line =~ /$test/) {
4988 my $val = $1;
4989 $val = $6 if ($skip_args ne "");
Joe Perches24358802014-04-03 14:49:13 -07004990
Joe Perches515a2352014-04-03 14:49:24 -07004991 if ($val !~ /^0$/ &&
4992 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
4993 length($val) ne 4)) {
4994 ERROR("NON_OCTAL_PERMISSIONS",
4995 "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
4996 }
Joe Perches24358802014-04-03 14:49:13 -07004997 }
4998 }
4999 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08005000 }
5001
5002 # If we have no input at all, then there is nothing to report on
5003 # so just keep quiet.
5004 if ($#rawlines == -1) {
5005 exit(0);
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005006 }
5007
Andy Whitcroft8905a672007-11-28 16:21:06 -08005008 # In mailback mode only produce a report in the negative, for
5009 # things that appear to be patches.
5010 if ($mailback && ($clean == 1 || !$is_patch)) {
5011 exit(0);
5012 }
5013
5014 # This is not a patch, and we are are in 'no-patch' mode so
5015 # just keep quiet.
5016 if (!$chk_patch && !$is_patch) {
5017 exit(0);
5018 }
5019
5020 if (!$is_patch) {
Joe Perches000d1cc12011-07-25 17:13:25 -07005021 ERROR("NOT_UNIFIED_DIFF",
5022 "Does not appear to be a unified-diff format patch\n");
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005023 }
5024 if ($is_patch && $chk_signoff && $signoff == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07005025 ERROR("MISSING_SIGN_OFF",
5026 "Missing Signed-off-by: line(s)\n");
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005027 }
5028
Andy Whitcroft8905a672007-11-28 16:21:06 -08005029 print report_dump();
Andy Whitcroft13214ad2008-02-08 04:22:03 -08005030 if ($summary && !($clean == 1 && $quiet == 1)) {
5031 print "$filename " if ($summary_file);
Andy Whitcroft8905a672007-11-28 16:21:06 -08005032 print "total: $cnt_error errors, $cnt_warn warnings, " .
5033 (($check)? "$cnt_chk checks, " : "") .
5034 "$cnt_lines lines checked\n";
5035 print "\n" if ($quiet == 0);
Andy Whitcroftf0a594c2007-07-19 01:48:34 -07005036 }
Andy Whitcroft8905a672007-11-28 16:21:06 -08005037
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07005038 if ($quiet == 0) {
Joe Perchesd1fe9c02012-03-23 15:02:16 -07005039
5040 if ($^V lt 5.10.0) {
5041 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
5042 print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
5043 }
5044
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07005045 # If there were whitespace errors which cleanpatch can fix
5046 # then suggest that.
5047 if ($rpt_cleaners) {
5048 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
5049 print " scripts/cleanfile\n\n";
Mike Frysingerb0781212011-03-22 16:34:43 -07005050 $rpt_cleaners = 0;
Andy Whitcroftd2c0a232010-10-26 14:23:12 -07005051 }
5052 }
5053
Joe Perches91bfe482013-09-11 14:23:59 -07005054 hash_show_words(\%use_type, "Used");
5055 hash_show_words(\%ignore_type, "Ignored");
Joe Perches000d1cc12011-07-25 17:13:25 -07005056
Joe Perchesd752fcc2014-08-06 16:11:05 -07005057 if ($clean == 0 && $fix &&
5058 ("@rawlines" ne "@fixed" ||
5059 $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
Joe Perches9624b8d2014-01-23 15:54:44 -08005060 my $newfile = $filename;
5061 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
Joe Perches3705ce52013-07-03 15:05:31 -07005062 my $linecount = 0;
5063 my $f;
5064
Joe Perchesd752fcc2014-08-06 16:11:05 -07005065 @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
5066
Joe Perches3705ce52013-07-03 15:05:31 -07005067 open($f, '>', $newfile)
5068 or die "$P: Can't open $newfile for write\n";
5069 foreach my $fixed_line (@fixed) {
5070 $linecount++;
5071 if ($file) {
5072 if ($linecount > 3) {
5073 $fixed_line =~ s/^\+//;
Joe Perchesd752fcc2014-08-06 16:11:05 -07005074 print $f $fixed_line . "\n";
Joe Perches3705ce52013-07-03 15:05:31 -07005075 }
5076 } else {
5077 print $f $fixed_line . "\n";
5078 }
5079 }
5080 close($f);
5081
5082 if (!$quiet) {
5083 print << "EOM";
5084Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
5085
5086Do _NOT_ trust the results written to this file.
5087Do _NOT_ submit these changes without inspecting them for correctness.
5088
5089This EXPERIMENTAL file is simply a convenience to help rewrite patches.
5090No warranties, expressed or implied...
5091
5092EOM
5093 }
5094 }
5095
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005096 if ($clean == 1 && $quiet == 0) {
Andy Whitcroftc2fdda02008-02-08 04:20:54 -08005097 print "$vname has no obvious style problems and is ready for submission.\n"
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005098 }
5099 if ($clean == 0 && $quiet == 0) {
Joe Perches000d1cc12011-07-25 17:13:25 -07005100 print << "EOM";
5101$vname has style problems, please review.
5102
5103If any of these errors are false positives, please report
5104them to the maintainer, see CHECKPATCH in MAINTAINERS.
5105EOM
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005106 }
Andy Whitcroft13214ad2008-02-08 04:22:03 -08005107
Andy Whitcroft0a920b5b2007-06-01 00:46:48 -07005108 return $clean;
5109}