Blame view
scripts/checkpatch.pl
74.6 KB
0a920b5b6 add a trivial pat... |
1 |
#!/usr/bin/perl -w |
dbf004d78 remove my email a... |
2 |
# (c) 2001, Dave Jones. (the file handling bit) |
00df344fd update checkpatch... |
3 |
# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) |
2a5a2c252 checkpatch: updat... |
4 |
# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) |
131edb341 checkpatch: updat... |
5 |
# (c) 2008,2009, Andy Whitcroft <apw@canonical.com> |
0a920b5b6 add a trivial pat... |
6 7 8 9 10 |
# Licensed under the terms of the GNU GPL License version 2 use strict; my $P = $0; |
00df344fd update checkpatch... |
11 |
$P =~ s@.*/@@g; |
0a920b5b6 add a trivial pat... |
12 |
|
5e8d8f6f2 checkpatch: versi... |
13 |
my $V = '0.30'; |
0a920b5b6 add a trivial pat... |
14 15 16 17 18 19 20 |
use Getopt::Long qw(:config no_auto_abbrev); my $quiet = 0; my $tree = 1; my $chk_signoff = 1; my $chk_patch = 1; |
773647a09 update checkpatch... |
21 |
my $tst_only; |
6c72ffaab update checkpatch... |
22 |
my $emacs = 0; |
8905a67c6 update checkpatch... |
23 |
my $terse = 0; |
6c72ffaab update checkpatch... |
24 25 |
my $file = 0; my $check = 0; |
8905a67c6 update checkpatch... |
26 27 |
my $summary = 1; my $mailback = 0; |
13214adf7 update checkpatch... |
28 |
my $summary_file = 0; |
6c72ffaab update checkpatch... |
29 |
my $root; |
c2fdda0df update checkpatch... |
30 |
my %debug; |
77f5b10a8 checkpatch: make ... |
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
my $help = 0; sub help { my ($exitcode) = @_; print << "EOM"; Usage: $P [OPTION]... [FILE]... Version: $V Options: -q, --quiet quiet --no-tree run without a kernel tree --no-signoff do not check for 'Signed-off-by' line --patch treat FILE as patchfile (default) --emacs emacs compile window format --terse one line per report -f, --file treat FILE as regular source file --subjective, --strict enable more subjective tests --root=PATH PATH to the kernel tree root --no-summary suppress the per-file summary --mailback only produce a report in case of warnings/errors --summary-file include the filename in summary --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 'values', 'possible', 'type', and 'attr' (default is all off) --test-only=WORD report only warnings/errors containing WORD literally -h, --help, --version display this help and exit When FILE is - read standard input. EOM exit($exitcode); } |
0a920b5b6 add a trivial pat... |
65 |
GetOptions( |
6c72ffaab update checkpatch... |
66 |
'q|quiet+' => \$quiet, |
0a920b5b6 add a trivial pat... |
67 68 69 |
'tree!' => \$tree, 'signoff!' => \$chk_signoff, 'patch!' => \$chk_patch, |
6c72ffaab update checkpatch... |
70 |
'emacs!' => \$emacs, |
8905a67c6 update checkpatch... |
71 |
'terse!' => \$terse, |
77f5b10a8 checkpatch: make ... |
72 |
'f|file!' => \$file, |
6c72ffaab update checkpatch... |
73 74 75 |
'subjective!' => \$check, 'strict!' => \$check, 'root=s' => \$root, |
8905a67c6 update checkpatch... |
76 77 |
'summary!' => \$summary, 'mailback!' => \$mailback, |
13214adf7 update checkpatch... |
78 |
'summary-file!' => \$summary_file, |
c2fdda0df update checkpatch... |
79 |
'debug=s' => \%debug, |
773647a09 update checkpatch... |
80 |
'test-only=s' => \$tst_only, |
77f5b10a8 checkpatch: make ... |
81 82 83 84 85 |
'h|help' => \$help, 'version' => \$help ) or help(1); help(0) if ($help); |
0a920b5b6 add a trivial pat... |
86 87 88 89 |
my $exit = 0; if ($#ARGV < 0) { |
77f5b10a8 checkpatch: make ... |
90 91 |
print "$P: no input files "; |
0a920b5b6 add a trivial pat... |
92 93 |
exit(1); } |
c2fdda0df update checkpatch... |
94 95 |
my $dbg_values = 0; my $dbg_possible = 0; |
7429c6903 checkpatch: impro... |
96 |
my $dbg_type = 0; |
a1ef277e2 checkpatch: add t... |
97 |
my $dbg_attr = 0; |
c2fdda0df update checkpatch... |
98 |
for my $key (keys %debug) { |
21caa13c0 checkpatch: fix t... |
99 100 101 |
## no critic eval "\${dbg_$key} = '$debug{$key}';"; die "$@" if ($@); |
c2fdda0df update checkpatch... |
102 |
} |
8905a67c6 update checkpatch... |
103 104 105 106 |
if ($terse) { $emacs = 1; $quiet++; } |
6c72ffaab update checkpatch... |
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
if ($tree) { if (defined $root) { if (!top_of_kernel_tree($root)) { die "$P: $root: --root does not point at a valid tree "; } } else { if (top_of_kernel_tree('.')) { $root = '.'; } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && top_of_kernel_tree($1)) { $root = $1; } } if (!defined $root) { print "Must be run from the top-level dir. of a kernel tree "; exit(2); } |
0a920b5b6 add a trivial pat... |
127 |
} |
6c72ffaab update checkpatch... |
128 |
my $emitted_corrupt = 0; |
2ceb532b0 checkpatch: fix f... |
129 130 131 132 |
our $Ident = qr{ [A-Za-z_][A-Za-z\d_]* (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* }x; |
6c72ffaab update checkpatch... |
133 134 135 136 137 138 139 140 |
our $Storage = qr{extern|static|asmlinkage}; our $Sparse = qr{ __user| __kernel| __force| __iomem| __must_check| __init_refok| |
417495eda checkpatch: add _... |
141 142 |
__kprobes| __ref |
6c72ffaab update checkpatch... |
143 |
}x; |
52131292c checkpatch: fix f... |
144 145 146 |
# Notes to $Attribute: # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check |
6c72ffaab update checkpatch... |
147 148 149 150 |
our $Attribute = qr{ const| __read_mostly| __kprobes| |
52131292c checkpatch: fix f... |
151 |
__(?:mem|cpu|dev|)(?:initdata|initconst|init\b)| |
24e1d81ac checkpatch: ____c... |
152 153 |
____cacheline_aligned| ____cacheline_aligned_in_smp| |
5fe3af119 checkpatch: __wea... |
154 155 |
____cacheline_internodealigned_in_smp| __weak |
6c72ffaab update checkpatch... |
156 |
}x; |
c45dcabd2 update checkpatch... |
157 |
our $Modifier; |
6c72ffaab update checkpatch... |
158 |
our $Inline = qr{inline|__always_inline|noinline}; |
6c72ffaab update checkpatch... |
159 160 161 162 163 |
our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; our $Lval = qr{$Ident(?:$Member)*}; our $Constant = qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*}; our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)}; |
86f9d059c checkpatch: allow... |
164 |
our $Compare = qr{<=|>=|==|!=|<|>}; |
6c72ffaab update checkpatch... |
165 166 167 |
our $Operators = qr{ <=|>=|==|!=| =>|->|<<|>>|<|>|!|~| |
c2fdda0df update checkpatch... |
168 |
&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% |
6c72ffaab update checkpatch... |
169 |
}x; |
8905a67c6 update checkpatch... |
170 171 172 |
our $NonptrType; our $Type; our $Declare; |
171ae1a49 update checkpatch... |
173 174 175 176 177 178 179 180 181 182 |
our $UTF8 = qr { [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 }x; |
8ed22cad9 checkpatch: pull ... |
183 |
our $typeTypedefs = qr{(?x: |
fb9e9096b checkpatch: limit... |
184 |
(?:__)?(?:u|s|be|le)(?:8|16|32|64)| |
8ed22cad9 checkpatch: pull ... |
185 186 |
atomic_t )}; |
691e669ba checkpatch.pl: al... |
187 188 189 190 191 192 193 |
our $logFunctions = qr{(?x: printk| pr_(debug|dbg|vdbg|devel|info|warning|err|notice|alert|crit|emerg|cont)| dev_(printk|dbg|vdbg|info|warn|err|notice|alert|crit|emerg|WARN)| WARN| panic )}; |
8905a67c6 update checkpatch... |
194 195 |
our @typeList = ( qr{void}, |
c45dcabd2 update checkpatch... |
196 197 198 199 200 201 202 |
qr{(?:unsigned\s+)?char}, qr{(?:unsigned\s+)?short}, qr{(?:unsigned\s+)?int}, qr{(?:unsigned\s+)?long}, qr{(?:unsigned\s+)?long\s+int}, qr{(?:unsigned\s+)?long\s+long}, qr{(?:unsigned\s+)?long\s+long\s+int}, |
8905a67c6 update checkpatch... |
203 204 205 206 |
qr{unsigned}, qr{float}, qr{double}, qr{bool}, |
8905a67c6 update checkpatch... |
207 208 209 210 211 212 213 |
qr{struct\s+$Ident}, qr{union\s+$Ident}, qr{enum\s+$Ident}, qr{${Ident}_t}, qr{${Ident}_handler}, qr{${Ident}_handler_fn}, ); |
c45dcabd2 update checkpatch... |
214 215 216 |
our @modifierList = ( qr{fastcall}, ); |
8905a67c6 update checkpatch... |
217 218 |
sub build_types { |
d2172eb5b checkpatch: possi... |
219 220 221 222 223 224 225 226 |
my $mods = "(?x: " . join("| ", @modifierList) . " )"; my $all = "(?x: " . join("| ", @typeList) . " )"; |
c8cb2ca37 checkpatch: types... |
227 |
$Modifier = qr{(?:$Attribute|$Sparse|$mods)}; |
8905a67c6 update checkpatch... |
228 |
$NonptrType = qr{ |
d2172eb5b checkpatch: possi... |
229 |
(?:$Modifier\s+|const\s+)* |
cf655043d update checkpatch... |
230 |
(?: |
c45dcabd2 update checkpatch... |
231 |
(?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)| |
8ed22cad9 checkpatch: pull ... |
232 |
(?:$typeTypedefs\b)| |
c45dcabd2 update checkpatch... |
233 |
(?:${all}\b) |
cf655043d update checkpatch... |
234 |
) |
c8cb2ca37 checkpatch: types... |
235 |
(?:\s+$Modifier|\s+const)* |
8905a67c6 update checkpatch... |
236 237 |
}x; $Type = qr{ |
c45dcabd2 update checkpatch... |
238 |
$NonptrType |
65863862b checkpatch: dissa... |
239 |
(?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)? |
c8cb2ca37 checkpatch: types... |
240 |
(?:\s+$Inline|\s+$Modifier)* |
8905a67c6 update checkpatch... |
241 242 243 244 |
}x; $Declare = qr{(?:$Storage\s+)?$Type}; } build_types(); |
6c72ffaab update checkpatch... |
245 246 |
$chk_signoff = 0 if ($file); |
4a0df2ef4 update checkpatch... |
247 248 |
my @dep_includes = (); my @dep_functions = (); |
6c72ffaab update checkpatch... |
249 250 |
my $removal = "Documentation/feature-removal-schedule.txt"; if ($tree && -f "$root/$removal") { |
21caa13c0 checkpatch: fix t... |
251 |
open(my $REMOVE, '<', "$root/$removal") || |
6c72ffaab update checkpatch... |
252 253 |
die "$P: $removal: open failed - $! "; |
21caa13c0 checkpatch: fix t... |
254 |
while (<$REMOVE>) { |
f0a594c1c update checkpatch... |
255 256 257 |
if (/^Check:\s+(.*\S)/) { for my $entry (split(/[, ]+/, $1)) { if ($entry =~ m@include/(.*)@) { |
4a0df2ef4 update checkpatch... |
258 |
push(@dep_includes, $1); |
4a0df2ef4 update checkpatch... |
259 |
|
f0a594c1c update checkpatch... |
260 261 262 |
} elsif ($entry !~ m@/@) { push(@dep_functions, $entry); } |
4a0df2ef4 update checkpatch... |
263 |
} |
0a920b5b6 add a trivial pat... |
264 265 |
} } |
21caa13c0 checkpatch: fix t... |
266 |
close($REMOVE); |
0a920b5b6 add a trivial pat... |
267 |
} |
00df344fd update checkpatch... |
268 |
my @rawlines = (); |
c2fdda0df update checkpatch... |
269 270 |
my @lines = (); my $vname; |
6c72ffaab update checkpatch... |
271 |
for my $filename (@ARGV) { |
21caa13c0 checkpatch: fix t... |
272 |
my $FILE; |
6c72ffaab update checkpatch... |
273 |
if ($file) { |
21caa13c0 checkpatch: fix t... |
274 |
open($FILE, '-|', "diff -u /dev/null $filename") || |
6c72ffaab update checkpatch... |
275 276 |
die "$P: $filename: diff failed - $! "; |
21caa13c0 checkpatch: fix t... |
277 278 |
} elsif ($filename eq '-') { open($FILE, '<&STDIN'); |
6c72ffaab update checkpatch... |
279 |
} else { |
21caa13c0 checkpatch: fix t... |
280 |
open($FILE, '<', "$filename") || |
6c72ffaab update checkpatch... |
281 282 |
die "$P: $filename: open failed - $! "; |
0a920b5b6 add a trivial pat... |
283 |
} |
c2fdda0df update checkpatch... |
284 285 286 287 288 |
if ($filename eq '-') { $vname = 'Your patch'; } else { $vname = $filename; } |
21caa13c0 checkpatch: fix t... |
289 |
while (<$FILE>) { |
6c72ffaab update checkpatch... |
290 291 292 |
chomp; push(@rawlines, $_); } |
21caa13c0 checkpatch: fix t... |
293 |
close($FILE); |
c2fdda0df update checkpatch... |
294 |
if (!process($filename)) { |
6c72ffaab update checkpatch... |
295 296 297 |
$exit = 1; } @rawlines = (); |
13214adf7 update checkpatch... |
298 |
@lines = (); |
0a920b5b6 add a trivial pat... |
299 300 301 302 303 |
} exit($exit); sub top_of_kernel_tree { |
6c72ffaab update checkpatch... |
304 305 306 307 308 309 310 311 312 313 314 315 |
my ($root) = @_; my @tree_check = ( "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", "README", "Documentation", "arch", "include", "drivers", "fs", "init", "ipc", "kernel", "lib", "scripts", ); foreach my $check (@tree_check) { if (! -e $root . '/' . $check) { return 0; } |
0a920b5b6 add a trivial pat... |
316 |
} |
6c72ffaab update checkpatch... |
317 |
return 1; |
0a920b5b6 add a trivial pat... |
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 |
} sub expand_tabs { my ($str) = @_; my $res = ''; my $n = 0; for my $c (split(//, $str)) { if ($c eq "\t") { $res .= ' '; $n++; for (; ($n % 8) != 0; $n++) { $res .= ' '; } next; } $res .= $c; $n++; } return $res; } |
6c72ffaab update checkpatch... |
340 |
sub copy_spacing { |
773647a09 update checkpatch... |
341 |
(my $res = shift) =~ tr/\t/ /c; |
6c72ffaab update checkpatch... |
342 343 |
return $res; } |
0a920b5b6 add a trivial pat... |
344 |
|
4a0df2ef4 update checkpatch... |
345 346 347 348 349 350 351 352 353 354 355 356 |
sub line_stats { my ($line) = @_; # Drop the diff line leader and expand tabs $line =~ s/^.//; $line = expand_tabs($line); # Pick the indent from the front of the line. my ($white) = ($line =~ /^(\s*)/); return (length($line), length($white)); } |
773647a09 update checkpatch... |
357 358 359 360 361 362 363 364 365 366 367 |
my $sanitise_quote = ''; sub sanitise_line_reset { my ($in_comment) = @_; if ($in_comment) { $sanitise_quote = '*/'; } else { $sanitise_quote = ''; } } |
00df344fd update checkpatch... |
368 369 370 371 372 |
sub sanitise_line { my ($line) = @_; my $res = ''; my $l = ''; |
c2fdda0df update checkpatch... |
373 |
my $qlen = 0; |
773647a09 update checkpatch... |
374 375 |
my $off = 0; my $c; |
00df344fd update checkpatch... |
376 |
|
773647a09 update checkpatch... |
377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
# Always copy over the diff marker. $res = substr($line, 0, 1); for ($off = 1; $off < length($line); $off++) { $c = substr($line, $off, 1); # Comments we are wacking completly including the begin # and end, all to $;. if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { $sanitise_quote = '*/'; substr($res, $off, 2, "$;$;"); $off++; next; |
00df344fd update checkpatch... |
391 |
} |
81bc0e020 checkpatch: handl... |
392 |
if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { |
773647a09 update checkpatch... |
393 394 395 396 |
$sanitise_quote = ''; substr($res, $off, 2, "$;$;"); $off++; next; |
c2fdda0df update checkpatch... |
397 |
} |
113f04a83 checkpatch: handl... |
398 399 400 401 402 403 404 |
if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { $sanitise_quote = '//'; substr($res, $off, 2, $sanitise_quote); $off++; next; } |
773647a09 update checkpatch... |
405 406 407 408 409 410 411 |
# A \ in a string means ignore the next character. if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && $c eq "\\") { substr($res, $off, 2, 'XX'); $off++; next; |
00df344fd update checkpatch... |
412 |
} |
773647a09 update checkpatch... |
413 414 415 416 |
# Regular quotes. if ($c eq "'" || $c eq '"') { if ($sanitise_quote eq '') { $sanitise_quote = $c; |
00df344fd update checkpatch... |
417 |
|
773647a09 update checkpatch... |
418 419 420 421 422 423 |
substr($res, $off, 1, $c); next; } elsif ($sanitise_quote eq $c) { $sanitise_quote = ''; } } |
00df344fd update checkpatch... |
424 |
|
fae17daed checkpatch: comme... |
425 426 |
#print "c<$c> SQ<$sanitise_quote> "; |
773647a09 update checkpatch... |
427 428 |
if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { substr($res, $off, 1, $;); |
113f04a83 checkpatch: handl... |
429 430 |
} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { substr($res, $off, 1, $;); |
773647a09 update checkpatch... |
431 432 433 434 435 |
} elsif ($off != 0 && $sanitise_quote && $c ne "\t") { substr($res, $off, 1, 'X'); } else { substr($res, $off, 1, $c); } |
c2fdda0df update checkpatch... |
436 |
} |
113f04a83 checkpatch: handl... |
437 438 439 |
if ($sanitise_quote eq '//') { $sanitise_quote = ''; } |
c2fdda0df update checkpatch... |
440 |
# The pathname on a #include may be surrounded by '<' and '>'. |
c45dcabd2 update checkpatch... |
441 |
if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { |
c2fdda0df update checkpatch... |
442 443 444 445 |
my $clean = 'X' x length($1); $res =~ s@\<.*\>@<$clean>@; # The whole of a #error is a string. |
c45dcabd2 update checkpatch... |
446 |
} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { |
c2fdda0df update checkpatch... |
447 |
my $clean = 'X' x length($1); |
c45dcabd2 update checkpatch... |
448 |
$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; |
c2fdda0df update checkpatch... |
449 |
} |
00df344fd update checkpatch... |
450 451 |
return $res; } |
8905a67c6 update checkpatch... |
452 453 454 455 456 457 |
sub ctx_statement_block { my ($linenr, $remain, $off) = @_; my $line = $linenr - 1; my $blk = ''; my $soff = $off; my $coff = $off - 1; |
773647a09 update checkpatch... |
458 |
my $coff_set = 0; |
8905a67c6 update checkpatch... |
459 |
|
13214adf7 update checkpatch... |
460 |
my $loff = 0; |
8905a67c6 update checkpatch... |
461 462 |
my $type = ''; my $level = 0; |
a27506459 checkpatch: handl... |
463 |
my @stack = (); |
cf655043d update checkpatch... |
464 |
my $p; |
8905a67c6 update checkpatch... |
465 466 |
my $c; my $len = 0; |
13214adf7 update checkpatch... |
467 468 |
my $remainder; |
8905a67c6 update checkpatch... |
469 |
while (1) { |
a27506459 checkpatch: handl... |
470 |
@stack = (['', 0]) if ($#stack == -1); |
773647a09 update checkpatch... |
471 472 |
#warn "CSB: blk<$blk> remain<$remain> "; |
8905a67c6 update checkpatch... |
473 474 475 476 |
# If we are about to drop off the end, pull in more # context. if ($off >= $len) { for (; $remain > 0; $line++) { |
dea33496d checkpatch: suppr... |
477 |
last if (!defined $lines[$line]); |
c2fdda0df update checkpatch... |
478 |
next if ($lines[$line] =~ /^-/); |
8905a67c6 update checkpatch... |
479 |
$remain--; |
13214adf7 update checkpatch... |
480 |
$loff = $len; |
c2fdda0df update checkpatch... |
481 482 |
$blk .= $lines[$line] . " "; |
8905a67c6 update checkpatch... |
483 484 485 486 487 488 489 |
$len = length($blk); $line++; last; } # Bail if there is no further context. #warn "CSB: blk<$blk> off<$off> len<$len> "; |
13214adf7 update checkpatch... |
490 |
if ($off >= $len) { |
8905a67c6 update checkpatch... |
491 492 493 |
last; } } |
cf655043d update checkpatch... |
494 |
$p = $c; |
8905a67c6 update checkpatch... |
495 |
$c = substr($blk, $off, 1); |
13214adf7 update checkpatch... |
496 |
$remainder = substr($blk, $off); |
8905a67c6 update checkpatch... |
497 |
|
773647a09 update checkpatch... |
498 499 |
#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set> "; |
4635f4fba checkpatch: track... |
500 501 502 503 504 505 506 507 508 |
# Handle nested #if/#else. if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { push(@stack, [ $type, $level ]); } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { ($type, $level) = @{$stack[$#stack - 1]}; } elsif ($remainder =~ /^#\s*endif\b/) { ($type, $level) = @{pop(@stack)}; } |
8905a67c6 update checkpatch... |
509 510 511 512 513 |
# Statement ends at the ';' or a close '}' at the # outermost level. if ($level == 0 && $c eq ';') { last; } |
13214adf7 update checkpatch... |
514 |
# An else is really a conditional as long as its not else if |
773647a09 update checkpatch... |
515 516 517 518 519 520 521 522 523 524 |
if ($level == 0 && $coff_set == 0 && (!defined($p) || $p =~ /(?:\s|\}|\+)/) && $remainder =~ /^(else)(?:\s|{)/ && $remainder !~ /^else\s+if\b/) { $coff = $off + length($1) - 1; $coff_set = 1; #warn "CSB: mark coff<$coff> soff<$soff> 1<$1> "; #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "] "; |
13214adf7 update checkpatch... |
525 |
} |
8905a67c6 update checkpatch... |
526 527 528 529 530 531 532 533 534 535 |
if (($type eq '' || $type eq '(') && $c eq '(') { $level++; $type = '('; } if ($type eq '(' && $c eq ')') { $level--; $type = ($level != 0)? '(' : ''; if ($level == 0 && $coff < $soff) { $coff = $off; |
773647a09 update checkpatch... |
536 537 538 |
$coff_set = 1; #warn "CSB: mark coff<$coff> "; |
8905a67c6 update checkpatch... |
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 |
} } if (($type eq '' || $type eq '{') && $c eq '{') { $level++; $type = '{'; } if ($type eq '{' && $c eq '}') { $level--; $type = ($level != 0)? '{' : ''; if ($level == 0) { last; } } $off++; } |
a3bb97a7a checkpatch: macro... |
555 |
# We are truly at the end, so shuffle to the next line. |
13214adf7 update checkpatch... |
556 |
if ($off == $len) { |
a3bb97a7a checkpatch: macro... |
557 |
$loff = $len + 1; |
13214adf7 update checkpatch... |
558 559 560 |
$line++; $remain--; } |
8905a67c6 update checkpatch... |
561 562 563 564 565 566 567 568 |
my $statement = substr($blk, $soff, $off - $soff + 1); my $condition = substr($blk, $soff, $coff - $soff + 1); #warn "STATEMENT<$statement> "; #warn "CONDITION<$condition> "; |
773647a09 update checkpatch... |
569 570 |
#print "coff<$coff> soff<$off> loff<$loff> "; |
13214adf7 update checkpatch... |
571 572 573 574 |
return ($statement, $condition, $line, $remain + 1, $off - $loff + 1, $level); } |
cf655043d update checkpatch... |
575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 |
sub statement_lines { my ($stmt) = @_; # Strip the diff line prefixes and rip blank lines at start and end. $stmt =~ s/(^| )./$1/g; $stmt =~ s/^\s*//; $stmt =~ s/\s*$//; my @stmt_lines = ($stmt =~ / /g); return $#stmt_lines + 2; } sub statement_rawlines { my ($stmt) = @_; my @stmt_lines = ($stmt =~ / /g); return $#stmt_lines + 2; } sub statement_block_size { my ($stmt) = @_; $stmt =~ s/(^| )./$1/g; $stmt =~ s/^\s*{//; $stmt =~ s/}\s*$//; $stmt =~ s/^\s*//; $stmt =~ s/\s*$//; my @stmt_lines = ($stmt =~ / /g); my @stmt_statements = ($stmt =~ /;/g); my $stmt_lines = $#stmt_lines + 2; my $stmt_statements = $#stmt_statements + 1; if ($stmt_lines > $stmt_statements) { return $stmt_lines; } else { return $stmt_statements; } } |
13214adf7 update checkpatch... |
622 623 624 625 626 |
sub ctx_statement_full { my ($linenr, $remain, $off) = @_; my ($statement, $condition, $level); my (@chunks); |
cf655043d update checkpatch... |
627 |
# Grab the first conditional/block pair. |
13214adf7 update checkpatch... |
628 629 |
($statement, $condition, $linenr, $remain, $off, $level) = ctx_statement_block($linenr, $remain, $off); |
773647a09 update checkpatch... |
630 631 |
#print "F: c<$condition> s<$statement> remain<$remain> "; |
cf655043d update checkpatch... |
632 633 634 635 636 637 638 639 |
push(@chunks, [ $condition, $statement ]); if (!($remain > 0 && $condition =~ /^\s*(?: [+-])?\s*(?:if|else|do)\b/s)) { return ($level, $linenr, @chunks); } # Pull in the following conditional/block pairs and see if they # could continue the statement. |
13214adf7 update checkpatch... |
640 |
for (;;) { |
13214adf7 update checkpatch... |
641 642 |
($statement, $condition, $linenr, $remain, $off, $level) = ctx_statement_block($linenr, $remain, $off); |
cf655043d update checkpatch... |
643 644 |
#print "C: c<$condition> s<$statement> remain<$remain> "; |
773647a09 update checkpatch... |
645 646 |
last if (!($remain > 0 && $condition =~ /^(?:\s* [+-])*\s*(?:else|do)\b/s)); |
cf655043d update checkpatch... |
647 648 649 |
#print "C: push "; push(@chunks, [ $condition, $statement ]); |
13214adf7 update checkpatch... |
650 651 652 |
} return ($level, $linenr, @chunks); |
8905a67c6 update checkpatch... |
653 |
} |
4a0df2ef4 update checkpatch... |
654 |
sub ctx_block_get { |
f0a594c1c update checkpatch... |
655 |
my ($linenr, $remain, $outer, $open, $close, $off) = @_; |
4a0df2ef4 update checkpatch... |
656 657 |
my $line; my $start = $linenr - 1; |
4a0df2ef4 update checkpatch... |
658 659 660 661 |
my $blk = ''; my @o; my @c; my @res = (); |
f0a594c1c update checkpatch... |
662 |
my $level = 0; |
4635f4fba checkpatch: track... |
663 |
my @stack = ($level); |
00df344fd update checkpatch... |
664 665 666 667 668 |
for ($line = $start; $remain > 0; $line++) { next if ($rawlines[$line] =~ /^-/); $remain--; $blk .= $rawlines[$line]; |
4635f4fba checkpatch: track... |
669 670 671 672 673 674 675 676 677 |
# Handle nested #if/#else. if ($rawlines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { push(@stack, $level); } elsif ($rawlines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { $level = $stack[$#stack - 1]; } elsif ($rawlines[$line] =~ /^.\s*#\s*endif\b/) { $level = pop(@stack); } |
f0a594c1c update checkpatch... |
678 679 680 681 682 683 684 |
foreach my $c (split(//, $rawlines[$line])) { ##print "C<$c>L<$level><$open$close>O<$off> "; if ($off > 0) { $off--; next; } |
4a0df2ef4 update checkpatch... |
685 |
|
f0a594c1c update checkpatch... |
686 687 688 689 690 691 692 |
if ($c eq $close && $level > 0) { $level--; last if ($level == 0); } elsif ($c eq $open) { $level++; } } |
4a0df2ef4 update checkpatch... |
693 |
|
f0a594c1c update checkpatch... |
694 |
if (!$outer || $level <= 1) { |
00df344fd update checkpatch... |
695 |
push(@res, $rawlines[$line]); |
4a0df2ef4 update checkpatch... |
696 |
} |
f0a594c1c update checkpatch... |
697 |
last if ($level == 0); |
4a0df2ef4 update checkpatch... |
698 |
} |
f0a594c1c update checkpatch... |
699 |
return ($level, @res); |
4a0df2ef4 update checkpatch... |
700 701 702 |
} sub ctx_block_outer { my ($linenr, $remain) = @_; |
f0a594c1c update checkpatch... |
703 704 |
my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); return @r; |
4a0df2ef4 update checkpatch... |
705 706 707 |
} sub ctx_block { my ($linenr, $remain) = @_; |
f0a594c1c update checkpatch... |
708 709 |
my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); return @r; |
653d4876b update checkpatch... |
710 711 |
} sub ctx_statement { |
f0a594c1c update checkpatch... |
712 713 714 715 716 717 |
my ($linenr, $remain, $off) = @_; my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); return @r; } sub ctx_block_level { |
653d4876b update checkpatch... |
718 |
my ($linenr, $remain) = @_; |
f0a594c1c update checkpatch... |
719 |
return ctx_block_get($linenr, $remain, 0, '{', '}', 0); |
4a0df2ef4 update checkpatch... |
720 |
} |
9c0ca6f9a update checkpatch... |
721 722 723 724 725 |
sub ctx_statement_level { my ($linenr, $remain, $off) = @_; return ctx_block_get($linenr, $remain, 0, '(', ')', $off); } |
4a0df2ef4 update checkpatch... |
726 727 728 729 730 |
sub ctx_locate_comment { my ($first_line, $end_line) = @_; # Catch a comment on the end of the line itself. |
beae63324 checkpatch: comme... |
731 |
my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); |
4a0df2ef4 update checkpatch... |
732 733 734 735 736 737 738 |
return $current_comment if (defined $current_comment); # Look through the context and try and figure out if there is a # comment. my $in_comment = 0; $current_comment = ''; for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { |
00df344fd update checkpatch... |
739 740 741 |
my $line = $rawlines[$linenr - 1]; #warn " $line "; |
4a0df2ef4 update checkpatch... |
742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 |
if ($linenr == $first_line and $line =~ m@^.\s*\*@) { $in_comment = 1; } if ($line =~ m@/\*@) { $in_comment = 1; } if (!$in_comment && $current_comment ne '') { $current_comment = ''; } $current_comment .= $line . " " if ($in_comment); if ($line =~ m@\*/@) { $in_comment = 0; } } chomp($current_comment); return($current_comment); } sub ctx_has_comment { my ($first_line, $end_line) = @_; my $cmt = ctx_locate_comment($first_line, $end_line); |
00df344fd update checkpatch... |
764 765 |
##print "LINE: $rawlines[$end_line - 1 ] "; |
4a0df2ef4 update checkpatch... |
766 767 768 769 770 |
##print "CMMT: $cmt "; return ($cmt ne ''); } |
4d001e4d8 checkpatch: repor... |
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 |
sub raw_line { my ($linenr, $cnt) = @_; my $offset = $linenr - 1; $cnt++; my $line; while ($cnt) { $line = $rawlines[$offset++]; next if (defined($line) && $line =~ /^-/); $cnt--; } return $line; } |
6c72ffaab update checkpatch... |
786 787 788 |
sub cat_vet { my ($vet) = @_; my ($res, $coded); |
9c0ca6f9a update checkpatch... |
789 |
|
6c72ffaab update checkpatch... |
790 791 792 793 794 795 |
$res = ''; while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { $res .= $1; if ($2 ne '') { $coded = sprintf("^%c", unpack('C', $2) + 64); $res .= $coded; |
9c0ca6f9a update checkpatch... |
796 797 |
} } |
6c72ffaab update checkpatch... |
798 |
$res =~ s/$/\$/; |
9c0ca6f9a update checkpatch... |
799 |
|
6c72ffaab update checkpatch... |
800 |
return $res; |
9c0ca6f9a update checkpatch... |
801 |
} |
c2fdda0df update checkpatch... |
802 |
my $av_preprocessor = 0; |
cf655043d update checkpatch... |
803 |
my $av_pending; |
c2fdda0df update checkpatch... |
804 |
my @av_paren_type; |
1f65f947a checkpatch: add c... |
805 |
my $av_pend_colon; |
c2fdda0df update checkpatch... |
806 807 808 |
sub annotate_reset { $av_preprocessor = 0; |
cf655043d update checkpatch... |
809 810 |
$av_pending = '_'; @av_paren_type = ('E'); |
1f65f947a checkpatch: add c... |
811 |
$av_pend_colon = 'O'; |
c2fdda0df update checkpatch... |
812 |
} |
6c72ffaab update checkpatch... |
813 814 |
sub annotate_values { my ($stream, $type) = @_; |
0a920b5b6 add a trivial pat... |
815 |
|
6c72ffaab update checkpatch... |
816 |
my $res; |
1f65f947a checkpatch: add c... |
817 |
my $var = '_' x length($stream); |
6c72ffaab update checkpatch... |
818 |
my $cur = $stream; |
c2fdda0df update checkpatch... |
819 820 |
print "$stream " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
821 |
|
6c72ffaab update checkpatch... |
822 |
while (length($cur)) { |
773647a09 update checkpatch... |
823 |
@av_paren_type = ('E') if ($#av_paren_type < 0); |
cf655043d update checkpatch... |
824 |
print " <" . join('', @av_paren_type) . |
171ae1a49 update checkpatch... |
825 |
"> <$type> <$av_pending>" if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
826 |
if ($cur =~ /^(\s+)/o) { |
c2fdda0df update checkpatch... |
827 828 829 830 |
print "WS($1) " if ($dbg_values > 1); if ($1 =~ / / && $av_preprocessor) { |
cf655043d update checkpatch... |
831 |
$type = pop(@av_paren_type); |
c2fdda0df update checkpatch... |
832 |
$av_preprocessor = 0; |
6c72ffaab update checkpatch... |
833 |
} |
8ea3eb9a2 checkpatch: handl... |
834 |
} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\()/) { |
c2fdda0df update checkpatch... |
835 836 |
print "DECLARE($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
837 |
$type = 'T'; |
389a2fe57 checkpatch: allow... |
838 839 840 841 |
} elsif ($cur =~ /^($Modifier)\s*/) { print "MODIFIER($1) " if ($dbg_values > 1); $type = 'T'; |
c45dcabd2 update checkpatch... |
842 |
} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { |
171ae1a49 update checkpatch... |
843 844 |
print "DEFINE($1,$2) " if ($dbg_values > 1); |
c2fdda0df update checkpatch... |
845 |
$av_preprocessor = 1; |
171ae1a49 update checkpatch... |
846 847 848 849 850 |
push(@av_paren_type, $type); if ($2 ne '') { $av_pending = 'N'; } $type = 'E'; |
c45dcabd2 update checkpatch... |
851 |
} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { |
171ae1a49 update checkpatch... |
852 853 854 855 |
print "UNDEF($1) " if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $type); |
6c72ffaab update checkpatch... |
856 |
|
c45dcabd2 update checkpatch... |
857 |
} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { |
cf655043d update checkpatch... |
858 859 |
print "PRE_START($1) " if ($dbg_values > 1); |
c2fdda0df update checkpatch... |
860 |
$av_preprocessor = 1; |
cf655043d update checkpatch... |
861 862 863 |
push(@av_paren_type, $type); push(@av_paren_type, $type); |
171ae1a49 update checkpatch... |
864 |
$type = 'E'; |
cf655043d update checkpatch... |
865 |
|
c45dcabd2 update checkpatch... |
866 |
} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { |
cf655043d update checkpatch... |
867 868 869 870 871 |
print "PRE_RESTART($1) " if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $av_paren_type[$#av_paren_type]); |
171ae1a49 update checkpatch... |
872 |
$type = 'E'; |
cf655043d update checkpatch... |
873 |
|
c45dcabd2 update checkpatch... |
874 |
} elsif ($cur =~ /^(\#\s*(?:endif))/o) { |
cf655043d update checkpatch... |
875 876 877 878 879 880 881 882 883 |
print "PRE_END($1) " if ($dbg_values > 1); $av_preprocessor = 1; # Assume all arms of the conditional end as this # one does, and continue as if the #endif was not here. pop(@av_paren_type); push(@av_paren_type, $type); |
171ae1a49 update checkpatch... |
884 |
$type = 'E'; |
6c72ffaab update checkpatch... |
885 886 887 |
} elsif ($cur =~ /^(\\ )/o) { |
c2fdda0df update checkpatch... |
888 889 |
print "PRECONT($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
890 |
|
171ae1a49 update checkpatch... |
891 892 893 894 895 |
} elsif ($cur =~ /^(__attribute__)\s*\(?/o) { print "ATTR($1) " if ($dbg_values > 1); $av_pending = $type; $type = 'N'; |
6c72ffaab update checkpatch... |
896 |
} elsif ($cur =~ /^(sizeof)\s*(\()?/o) { |
c2fdda0df update checkpatch... |
897 898 |
print "SIZEOF($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
899 |
if (defined $2) { |
cf655043d update checkpatch... |
900 |
$av_pending = 'V'; |
6c72ffaab update checkpatch... |
901 902 |
} $type = 'N'; |
14b111c15 checkpatch: condi... |
903 |
} elsif ($cur =~ /^(if|while|for)\b/o) { |
c2fdda0df update checkpatch... |
904 905 |
print "COND($1) " if ($dbg_values > 1); |
14b111c15 checkpatch: condi... |
906 |
$av_pending = 'E'; |
6c72ffaab update checkpatch... |
907 |
$type = 'N'; |
1f65f947a checkpatch: add c... |
908 909 910 911 912 |
} elsif ($cur =~/^(case)/o) { print "CASE($1) " if ($dbg_values > 1); $av_pend_colon = 'C'; $type = 'N'; |
14b111c15 checkpatch: condi... |
913 |
} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { |
c2fdda0df update checkpatch... |
914 915 |
print "KEYWORD($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
916 917 918 |
$type = 'N'; } elsif ($cur =~ /^(\()/o) { |
c2fdda0df update checkpatch... |
919 920 |
print "PAREN('$1') " if ($dbg_values > 1); |
cf655043d update checkpatch... |
921 922 |
push(@av_paren_type, $av_pending); $av_pending = '_'; |
6c72ffaab update checkpatch... |
923 924 925 |
$type = 'N'; } elsif ($cur =~ /^(\))/o) { |
cf655043d update checkpatch... |
926 927 928 |
my $new_type = pop(@av_paren_type); if ($new_type ne '_') { $type = $new_type; |
c2fdda0df update checkpatch... |
929 930 931 |
print "PAREN('$1') -> $type " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
932 |
} else { |
c2fdda0df update checkpatch... |
933 934 |
print "PAREN('$1') " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
935 |
} |
c8cb2ca37 checkpatch: types... |
936 |
} elsif ($cur =~ /^($Ident)\s*\(/o) { |
c2fdda0df update checkpatch... |
937 938 |
print "FUNC($1) " if ($dbg_values > 1); |
c8cb2ca37 checkpatch: types... |
939 |
$type = 'V'; |
cf655043d update checkpatch... |
940 |
$av_pending = 'V'; |
6c72ffaab update checkpatch... |
941 |
|
8e761b04a checkpatch: detec... |
942 943 |
} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { if (defined $2 && $type eq 'C' || $type eq 'T') { |
1f65f947a checkpatch: add c... |
944 |
$av_pend_colon = 'B'; |
8e761b04a checkpatch: detec... |
945 946 |
} elsif ($type eq 'E') { $av_pend_colon = 'L'; |
1f65f947a checkpatch: add c... |
947 948 949 950 |
} print "IDENT_COLON($1,$type>$av_pend_colon) " if ($dbg_values > 1); $type = 'V'; |
6c72ffaab update checkpatch... |
951 |
} elsif ($cur =~ /^($Ident|$Constant)/o) { |
c2fdda0df update checkpatch... |
952 953 |
print "IDENT($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
954 955 956 |
$type = 'V'; } elsif ($cur =~ /^($Assignment)/o) { |
c2fdda0df update checkpatch... |
957 958 |
print "ASSIGN($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
959 |
$type = 'N'; |
cf655043d update checkpatch... |
960 |
} elsif ($cur =~/^(;|{|})/) { |
c2fdda0df update checkpatch... |
961 962 |
print "END($1) " if ($dbg_values > 1); |
13214adf7 update checkpatch... |
963 |
$type = 'E'; |
1f65f947a checkpatch: add c... |
964 |
$av_pend_colon = 'O'; |
8e761b04a checkpatch: detec... |
965 966 967 968 |
} elsif ($cur =~/^(,)/) { print "COMMA($1) " if ($dbg_values > 1); $type = 'C'; |
1f65f947a checkpatch: add c... |
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 |
} elsif ($cur =~ /^(\?)/o) { print "QUESTION($1) " if ($dbg_values > 1); $type = 'N'; } elsif ($cur =~ /^(:)/o) { print "COLON($1,$av_pend_colon) " if ($dbg_values > 1); substr($var, length($res), 1, $av_pend_colon); if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { $type = 'E'; } else { $type = 'N'; } $av_pend_colon = 'O'; |
13214adf7 update checkpatch... |
985 |
|
8e761b04a checkpatch: detec... |
986 |
} elsif ($cur =~ /^(\[)/o) { |
13214adf7 update checkpatch... |
987 988 |
print "CLOSE($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
989 |
$type = 'N'; |
0d413866c checkpatch: value... |
990 |
} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { |
74048ed81 checkpatch: varia... |
991 992 993 994 995 996 997 998 999 1000 1001 1002 |
my $variant; print "OPV($1) " if ($dbg_values > 1); if ($type eq 'V') { $variant = 'B'; } else { $variant = 'U'; } substr($var, length($res), 1, $variant); $type = 'N'; |
6c72ffaab update checkpatch... |
1003 |
} elsif ($cur =~ /^($Operators)/o) { |
c2fdda0df update checkpatch... |
1004 1005 |
print "OP($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
1006 1007 1008 1009 1010 |
if ($1 ne '++' && $1 ne '--') { $type = 'N'; } } elsif ($cur =~ /(^.)/o) { |
c2fdda0df update checkpatch... |
1011 1012 |
print "C($1) " if ($dbg_values > 1); |
6c72ffaab update checkpatch... |
1013 1014 1015 1016 1017 |
} if (defined $1) { $cur = substr($cur, length($1)); $res .= $type x length($1); } |
9c0ca6f9a update checkpatch... |
1018 |
} |
0a920b5b6 add a trivial pat... |
1019 |
|
1f65f947a checkpatch: add c... |
1020 |
return ($res, $var); |
0a920b5b6 add a trivial pat... |
1021 |
} |
8905a67c6 update checkpatch... |
1022 |
sub possible { |
13214adf7 update checkpatch... |
1023 |
my ($possible, $line) = @_; |
9a974fdbe checkpatch: possi... |
1024 |
my $notPermitted = qr{(?: |
0776e5946 checkpatch: do is... |
1025 1026 1027 1028 |
^(?: $Modifier| $Storage| $Type| |
9a974fdbe checkpatch: possi... |
1029 1030 1031 |
DEFINE_\S+ )$| ^(?: |
0776e5946 checkpatch: do is... |
1032 1033 1034 1035 1036 1037 |
goto| return| case| else| asm|__asm__| do |
9a974fdbe checkpatch: possi... |
1038 |
)(?:\s|$)| |
0776e5946 checkpatch: do is... |
1039 |
^(?:typedef|struct|enum)\b |
9a974fdbe checkpatch: possi... |
1040 1041 1042 1043 |
)}x; warn "CHECK<$possible> ($line) " if ($dbg_possible > 2); if ($possible !~ $notPermitted) { |
c45dcabd2 update checkpatch... |
1044 1045 1046 1047 1048 1049 1050 |
# Check for modifiers. $possible =~ s/\s*$Storage\s*//g; $possible =~ s/\s*$Sparse\s*//g; if ($possible =~ /^\s*$/) { } elsif ($possible =~ /\s/) { $possible =~ s/\s*$Type\s*//g; |
d25065865 checkpatch: possi... |
1051 |
for my $modifier (split(' ', $possible)) { |
9a974fdbe checkpatch: possi... |
1052 1053 1054 1055 1056 |
if ($modifier !~ $notPermitted) { warn "MODIFIER: $modifier ($possible) ($line) " if ($dbg_possible); push(@modifierList, $modifier); } |
d25065865 checkpatch: possi... |
1057 |
} |
c45dcabd2 update checkpatch... |
1058 1059 1060 1061 1062 1063 |
} else { warn "POSSIBLE: $possible ($line) " if ($dbg_possible); push(@typeList, $possible); } |
8905a67c6 update checkpatch... |
1064 |
build_types(); |
0776e5946 checkpatch: do is... |
1065 1066 1067 |
} else { warn "NOTPOSS: $possible ($line) " if ($dbg_possible > 1); |
8905a67c6 update checkpatch... |
1068 1069 |
} } |
6c72ffaab update checkpatch... |
1070 |
my $prefix = ''; |
f0a594c1c update checkpatch... |
1071 |
sub report { |
773647a09 update checkpatch... |
1072 1073 1074 |
if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) { return 0; } |
8905a67c6 update checkpatch... |
1075 1076 1077 1078 1079 |
my $line = $prefix . $_[0]; $line = (split(' ', $line))[0] . " " if ($terse); |
13214adf7 update checkpatch... |
1080 |
push(our @report, $line); |
773647a09 update checkpatch... |
1081 1082 |
return 1; |
f0a594c1c update checkpatch... |
1083 1084 |
} sub report_dump { |
13214adf7 update checkpatch... |
1085 |
our @report; |
f0a594c1c update checkpatch... |
1086 |
} |
de7d4f0e1 update checkpatch... |
1087 |
sub ERROR { |
773647a09 update checkpatch... |
1088 1089 1090 1091 1092 |
if (report("ERROR: $_[0] ")) { our $clean = 0; our $cnt_error++; } |
de7d4f0e1 update checkpatch... |
1093 1094 |
} sub WARN { |
773647a09 update checkpatch... |
1095 1096 1097 1098 1099 |
if (report("WARNING: $_[0] ")) { our $clean = 0; our $cnt_warn++; } |
de7d4f0e1 update checkpatch... |
1100 1101 |
} sub CHK { |
773647a09 update checkpatch... |
1102 1103 |
if ($check && report("CHECK: $_[0] ")) { |
6c72ffaab update checkpatch... |
1104 1105 1106 |
our $clean = 0; our $cnt_chk++; } |
de7d4f0e1 update checkpatch... |
1107 |
} |
6ecd96744 checkpatch: repor... |
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 |
sub check_absolute_file { my ($absolute, $herecurr) = @_; my $file = $absolute; ##print "absolute<$absolute> "; # See if any suffix of this path is a path within the tree. while ($file =~ s@^[^/]*/@@) { if (-f "$root/$file") { ##print "file<$file> "; last; } } if (! -f _) { return 0; } # It is, so see if the prefix is acceptable. my $prefix = $absolute; substr($prefix, -length($file)) = ''; ##print "prefix<$prefix> "; if ($prefix ne ".../") { WARN("use relative pathname instead of absolute in changelog text " . $herecurr); } } |
0a920b5b6 add a trivial pat... |
1138 1139 |
sub process { my $filename = shift; |
0a920b5b6 add a trivial pat... |
1140 1141 1142 |
my $linenr=0; my $prevline=""; |
c2fdda0df update checkpatch... |
1143 |
my $prevrawline=""; |
0a920b5b6 add a trivial pat... |
1144 |
my $stashline=""; |
c2fdda0df update checkpatch... |
1145 |
my $stashrawline=""; |
0a920b5b6 add a trivial pat... |
1146 |
|
4a0df2ef4 update checkpatch... |
1147 |
my $length; |
0a920b5b6 add a trivial pat... |
1148 1149 1150 |
my $indent; my $previndent=0; my $stashindent=0; |
de7d4f0e1 update checkpatch... |
1151 |
our $clean = 1; |
0a920b5b6 add a trivial pat... |
1152 1153 |
my $signoff = 0; my $is_patch = 0; |
13214adf7 update checkpatch... |
1154 |
our @report = (); |
6c72ffaab update checkpatch... |
1155 1156 1157 1158 |
our $cnt_lines = 0; our $cnt_error = 0; our $cnt_warn = 0; our $cnt_chk = 0; |
0a920b5b6 add a trivial pat... |
1159 1160 1161 1162 1163 1164 |
# Trace the real file/line as we go. my $realfile = ''; my $realline = 0; my $realcnt = 0; my $here = ''; my $in_comment = 0; |
c2fdda0df update checkpatch... |
1165 |
my $comment_edge = 0; |
0a920b5b6 add a trivial pat... |
1166 |
my $first_line = 0; |
1e8557269 checkpatch: Add w... |
1167 |
my $p1_prefix = ''; |
0a920b5b6 add a trivial pat... |
1168 |
|
13214adf7 update checkpatch... |
1169 1170 1171 |
my $prev_values = 'E'; # suppression flags |
773647a09 update checkpatch... |
1172 |
my %suppress_ifbraces; |
170d3a226 checkpatch: handl... |
1173 |
my %suppress_whiletrailers; |
2b474a1a5 checkpatch: fix f... |
1174 |
my %suppress_export; |
653d4876b update checkpatch... |
1175 |
|
c2fdda0df update checkpatch... |
1176 |
# Pre-scan the patch sanitizing the lines. |
de7d4f0e1 update checkpatch... |
1177 |
# Pre-scan the patch looking for any __setup documentation. |
c2fdda0df update checkpatch... |
1178 |
# |
de7d4f0e1 update checkpatch... |
1179 1180 |
my @setup_docs = (); my $setup_docs = 0; |
773647a09 update checkpatch... |
1181 1182 |
sanitise_line_reset(); |
c2fdda0df update checkpatch... |
1183 1184 |
my $line; foreach my $rawline (@rawlines) { |
773647a09 update checkpatch... |
1185 1186 |
$linenr++; $line = $rawline; |
c2fdda0df update checkpatch... |
1187 |
|
773647a09 update checkpatch... |
1188 |
if ($rawline=~/^\+\+\+\s+(\S+)/) { |
de7d4f0e1 update checkpatch... |
1189 1190 1191 1192 |
$setup_docs = 0; if ($1 =~ m@Documentation/kernel-parameters.txt$@) { $setup_docs = 1; } |
773647a09 update checkpatch... |
1193 1194 1195 1196 1197 1198 1199 1200 1201 |
#next; } if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { $realline=$1-1; if (defined $2) { $realcnt=$3+1; } else { $realcnt=1+1; } |
c45dcabd2 update checkpatch... |
1202 |
$in_comment = 0; |
773647a09 update checkpatch... |
1203 1204 1205 1206 1207 1208 |
# Guestimate if this is a continuing comment. Run # the context looking for a comment "edge". If this # edge is a close comment then we must be in a comment # at context start. my $edge; |
01fa91471 checkpatch: fix u... |
1209 1210 1211 1212 1213 1214 1215 |
my $cnt = $realcnt; for (my $ln = $linenr + 1; $cnt > 0; $ln++) { next if (defined $rawlines[$ln - 1] && $rawlines[$ln - 1] =~ /^-/); $cnt--; #print "RAW<$rawlines[$ln - 1]> "; |
721c1cb60 checkpatch: comme... |
1216 |
last if (!defined $rawlines[$ln - 1]); |
fae17daed checkpatch: comme... |
1217 1218 1219 1220 1221 |
if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { ($edge) = $1; last; } |
773647a09 update checkpatch... |
1222 1223 1224 1225 1226 1227 1228 1229 1230 |
} if (defined $edge && $edge eq '*/') { $in_comment = 1; } # Guestimate if this is a continuing comment. If this # is the start of a diff block and this line starts # ' *' then it is very likely a comment. if (!defined $edge && |
83242e0c2 checkpatch: widen... |
1231 |
$rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) |
773647a09 update checkpatch... |
1232 1233 1234 1235 1236 1237 1238 |
{ $in_comment = 1; } ##print "COMMENT:$in_comment edge<$edge> $rawline "; sanitise_line_reset($in_comment); |
171ae1a49 update checkpatch... |
1239 |
} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { |
773647a09 update checkpatch... |
1240 |
# Standardise the strings and chars within the input to |
171ae1a49 update checkpatch... |
1241 |
# simplify matching -- only bother with positive lines. |
773647a09 update checkpatch... |
1242 |
$line = sanitise_line($rawline); |
de7d4f0e1 update checkpatch... |
1243 |
} |
773647a09 update checkpatch... |
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 |
push(@lines, $line); if ($realcnt > 1) { $realcnt-- if ($line =~ /^(?:\+| |$)/); } else { $realcnt = 0; } #print "==>$rawline "; #print "-->$line "; |
de7d4f0e1 update checkpatch... |
1256 1257 1258 1259 1260 |
if ($setup_docs && $line =~ /^\+/) { push(@setup_docs, $line); } } |
6c72ffaab update checkpatch... |
1261 |
$prefix = ''; |
773647a09 update checkpatch... |
1262 1263 |
$realcnt = 0; $linenr = 0; |
0a920b5b6 add a trivial pat... |
1264 1265 |
foreach my $line (@lines) { $linenr++; |
c2fdda0df update checkpatch... |
1266 |
my $rawline = $rawlines[$linenr - 1]; |
6c72ffaab update checkpatch... |
1267 |
|
0a920b5b6 add a trivial pat... |
1268 |
#extract the line range in the file after the patch is applied |
6c72ffaab update checkpatch... |
1269 |
if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { |
0a920b5b6 add a trivial pat... |
1270 |
$is_patch = 1; |
4a0df2ef4 update checkpatch... |
1271 |
$first_line = $linenr + 1; |
0a920b5b6 add a trivial pat... |
1272 1273 1274 1275 1276 1277 |
$realline=$1-1; if (defined $2) { $realcnt=$3+1; } else { $realcnt=1+1; } |
c2fdda0df update checkpatch... |
1278 |
annotate_reset(); |
13214adf7 update checkpatch... |
1279 |
$prev_values = 'E'; |
773647a09 update checkpatch... |
1280 |
%suppress_ifbraces = (); |
170d3a226 checkpatch: handl... |
1281 |
%suppress_whiletrailers = (); |
2b474a1a5 checkpatch: fix f... |
1282 |
%suppress_export = (); |
0a920b5b6 add a trivial pat... |
1283 |
next; |
0a920b5b6 add a trivial pat... |
1284 |
|
4a0df2ef4 update checkpatch... |
1285 1286 1287 |
# track the line number as we move through the hunk, note that # new versions of GNU diff omit the leading space on completely # blank context lines so we need to count that too. |
773647a09 update checkpatch... |
1288 |
} elsif ($line =~ /^( |\+|$)/) { |
0a920b5b6 add a trivial pat... |
1289 |
$realline++; |
d8aaf1214 update checkpatch... |
1290 |
$realcnt-- if ($realcnt != 0); |
0a920b5b6 add a trivial pat... |
1291 |
|
4a0df2ef4 update checkpatch... |
1292 |
# Measure the line length and indent. |
c2fdda0df update checkpatch... |
1293 |
($length, $indent) = line_stats($rawline); |
0a920b5b6 add a trivial pat... |
1294 1295 1296 1297 |
# Track the previous line. ($prevline, $stashline) = ($stashline, $line); ($previndent, $stashindent) = ($stashindent, $indent); |
c2fdda0df update checkpatch... |
1298 |
($prevrawline, $stashrawline) = ($stashrawline, $rawline); |
773647a09 update checkpatch... |
1299 1300 |
#warn "line<$line> "; |
6c72ffaab update checkpatch... |
1301 |
|
d8aaf1214 update checkpatch... |
1302 1303 |
} elsif ($realcnt == 1) { $realcnt--; |
0a920b5b6 add a trivial pat... |
1304 |
} |
cc77cdca5 checkpatch: corre... |
1305 |
my $hunk_line = ($realcnt != 0); |
0a920b5b6 add a trivial pat... |
1306 |
#make up the handle for any error we report on this line |
773647a09 update checkpatch... |
1307 1308 |
$prefix = "$filename:$realline: " if ($emacs && $file); $prefix = "$filename:$linenr: " if ($emacs && !$file); |
6c72ffaab update checkpatch... |
1309 1310 |
$here = "#$linenr: " if (!$file); $here = "#$realline: " if ($file); |
773647a09 update checkpatch... |
1311 1312 1313 1314 |
# extract the filename as it passes if ($line=~/^\+\+\+\s+(\S+)/) { $realfile = $1; |
1e8557269 checkpatch: Add w... |
1315 1316 1317 |
$realfile =~ s@^([^/]*)/@@; $p1_prefix = $1; |
e2f7aa4b8 checkpatch: do no... |
1318 1319 |
if (!$file && $tree && $p1_prefix ne '' && -e "$root/$p1_prefix") { |
1e8557269 checkpatch: Add w... |
1320 1321 1322 |
WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch "); } |
773647a09 update checkpatch... |
1323 |
|
c1ab33269 checkpatch: inclu... |
1324 |
if ($realfile =~ m@^include/asm/@) { |
773647a09 update checkpatch... |
1325 1326 1327 1328 1329 1330 |
ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture> " . "$here$rawline "); } next; } |
389834b68 checkpatch: produ... |
1331 |
$here .= "FILE: $realfile:$realline:" if ($realcnt != 0); |
0a920b5b6 add a trivial pat... |
1332 |
|
c2fdda0df update checkpatch... |
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 |
my $hereline = "$here $rawline "; my $herecurr = "$here $rawline "; my $hereprev = "$here $prevrawline $rawline "; |
0a920b5b6 add a trivial pat... |
1343 |
|
6c72ffaab update checkpatch... |
1344 |
$cnt_lines++ if ($realcnt != 0); |
0a920b5b6 add a trivial pat... |
1345 |
#check the patch for a signoff: |
d8aaf1214 update checkpatch... |
1346 |
if ($line =~ /^\s*signed-off-by:/i) { |
4a0df2ef4 update checkpatch... |
1347 1348 |
# This is a signoff, if ugly, so do not double report. $signoff++; |
0a920b5b6 add a trivial pat... |
1349 |
if (!($line =~ /^\s*Signed-off-by:/)) { |
de7d4f0e1 update checkpatch... |
1350 1351 1352 |
WARN("Signed-off-by: is the preferred form " . $herecurr); |
0a920b5b6 add a trivial pat... |
1353 1354 |
} if ($line =~ /^\s*signed-off-by:\S/i) { |
773647a09 update checkpatch... |
1355 1356 |
WARN("space required after Signed-off-by: " . |
de7d4f0e1 update checkpatch... |
1357 |
$herecurr); |
0a920b5b6 add a trivial pat... |
1358 1359 |
} } |
00df344fd update checkpatch... |
1360 |
# Check for wrappage within a valid hunk of the file |
8905a67c6 update checkpatch... |
1361 |
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { |
de7d4f0e1 update checkpatch... |
1362 1363 |
ERROR("patch seems to be corrupt (line wrapped?) " . |
6c72ffaab update checkpatch... |
1364 |
$herecurr) if (!$emitted_corrupt++); |
de7d4f0e1 update checkpatch... |
1365 |
} |
6ecd96744 checkpatch: repor... |
1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 |
# Check for absolute kernel paths. if ($tree) { while ($line =~ m{(?:^|\s)(/\S*)}g) { my $file = $1; if ($file =~ m{^(.*?)(?::\d+)+:?$} && check_absolute_file($1, $herecurr)) { # } else { check_absolute_file($file, $herecurr); } } } |
de7d4f0e1 update checkpatch... |
1379 1380 |
# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php if (($realfile =~ /^$/ || $line =~ /^\+/) && |
171ae1a49 update checkpatch... |
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 |
$rawline !~ m/^$UTF8*$/) { my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); my $blank = copy_spacing($rawline); my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; my $hereptr = "$hereline$ptr "; ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8 " . $hereptr); |
00df344fd update checkpatch... |
1391 |
} |
306708547 checkpatch: ensur... |
1392 1393 |
# ignore non-hunk lines and lines being removed next if (!$hunk_line || $line =~ /^-/); |
0a920b5b6 add a trivial pat... |
1394 |
|
0a920b5b6 add a trivial pat... |
1395 |
#trailing whitespace |
9c0ca6f9a update checkpatch... |
1396 |
if ($line =~ /^\+.*\015/) { |
c2fdda0df update checkpatch... |
1397 1398 1399 |
my $herevet = "$here " . cat_vet($rawline) . " "; |
9c0ca6f9a update checkpatch... |
1400 1401 |
ERROR("DOS line endings " . $herevet); |
c2fdda0df update checkpatch... |
1402 1403 1404 1405 |
} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { my $herevet = "$here " . cat_vet($rawline) . " "; |
de7d4f0e1 update checkpatch... |
1406 1407 |
ERROR("trailing whitespace " . $herevet); |
0a920b5b6 add a trivial pat... |
1408 |
} |
5368df20f checkpatch: check... |
1409 |
|
3354957a4 checkpatch: add c... |
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 |
# check for Kconfig help text having a real description if ($realfile =~ /Kconfig/ && $line =~ /\+?\s*(---)?help(---)?$/) { my $length = 0; for (my $l = $linenr; defined($lines[$l]); $l++) { my $f = $lines[$l]; $f =~ s/#.*//; $f =~ s/^\s+//; next if ($f =~ /^$/); last if ($f =~ /^\s*config\s/); $length++; } WARN("please write a paragraph that describes the config symbol fully " . $herecurr) if ($length < 4); } |
5368df20f checkpatch: check... |
1425 1426 |
# check we are in a valid source file if not then ignore this hunk next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); |
0a920b5b6 add a trivial pat... |
1427 |
#80 column limit |
c45dcabd2 update checkpatch... |
1428 |
if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && |
f4c014c0d checkpatch: allow... |
1429 |
$rawline !~ /^.\s*\*\s*\@$Ident\s/ && |
691e669ba checkpatch.pl: al... |
1430 |
$line !~ /^\+\s*$logFunctions\s*\(\s*(?:KERN_\S+\s*)?"[X\t]*"\s*(?:,|\)\s*;)\s*$/ && |
f4c014c0d checkpatch: allow... |
1431 |
$length > 80) |
c45dcabd2 update checkpatch... |
1432 |
{ |
de7d4f0e1 update checkpatch... |
1433 1434 |
WARN("line over 80 characters " . $herecurr); |
0a920b5b6 add a trivial pat... |
1435 |
} |
5e79d96ee checkpatch: warn ... |
1436 1437 1438 1439 1440 1441 |
# check for spaces before a quoted newline if ($rawline =~ /^.*\".*\s\ /) { WARN("unnecessary whitespace before a quoted newline " . $herecurr); } |
8905a67c6 update checkpatch... |
1442 1443 1444 1445 1446 |
# check for adding lines without a newline. if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { WARN("adding a line without newline at end of file " . $herecurr); } |
42e41c54d checkpatch: add s... |
1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 |
# Blackfin: use hi/lo macros if ($realfile =~ m@arch/blackfin/.*\.S$@) { if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) { my $herevet = "$here " . cat_vet($line) . " "; ERROR("use the LO() macro, not (... & 0xFFFF) " . $herevet); } if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) { my $herevet = "$here " . cat_vet($line) . " "; ERROR("use the HI() macro, not (... >> 16) " . $herevet); } } |
b9ea10d69 checkpatch: perfo... |
1464 1465 |
# check we are in a valid source file C or perl if not then ignore this hunk next if ($realfile !~ /\.(h|c|pl)$/); |
0a920b5b6 add a trivial pat... |
1466 1467 1468 |
# at the beginning of a line any tabs must come first and anything # more than 8 must use tabs. |
c2fdda0df update checkpatch... |
1469 1470 1471 1472 1473 |
if ($rawline =~ /^\+\s* \t\s*\S/ || $rawline =~ /^\+\s* \s*/) { my $herevet = "$here " . cat_vet($rawline) . " "; |
171ae1a49 update checkpatch... |
1474 1475 |
ERROR("code indent should use tabs where possible " . $herevet); |
0a920b5b6 add a trivial pat... |
1476 |
} |
08e443656 checkpatch.pl: wa... |
1477 1478 1479 1480 1481 1482 1483 1484 |
# check for space before tabs. if ($rawline =~ /^\+/ && $rawline =~ / \t/) { my $herevet = "$here " . cat_vet($rawline) . " "; WARN("please, no space before tabs " . $herevet); } |
b9ea10d69 checkpatch: perfo... |
1485 1486 |
# check we are in a valid C source file if not then ignore this hunk next if ($realfile !~ /\.(h|c)$/); |
c2fdda0df update checkpatch... |
1487 |
# check for RCS/CVS revision markers |
cf655043d update checkpatch... |
1488 |
if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { |
c2fdda0df update checkpatch... |
1489 1490 1491 |
WARN("CVS style keyword markers, these will _not_ be updated ". $herecurr); } |
22f2a2ef9 update checkpatch... |
1492 |
|
42e41c54d checkpatch: add s... |
1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 |
# Blackfin: don't use __builtin_bfin_[cs]sync if ($line =~ /__builtin_bfin_csync/) { my $herevet = "$here " . cat_vet($line) . " "; ERROR("use the CSYNC() macro in asm/blackfin.h " . $herevet); } if ($line =~ /__builtin_bfin_ssync/) { my $herevet = "$here " . cat_vet($line) . " "; ERROR("use the SSYNC() macro in asm/blackfin.h " . $herevet); } |
9c0ca6f9a update checkpatch... |
1508 |
# Check for potential 'bare' types |
2b474a1a5 checkpatch: fix f... |
1509 1510 |
my ($stat, $cond, $line_nr_next, $remain_next, $off_next, $realline_next); |
9c9ba34ee update checkpatch... |
1511 |
if ($realcnt && $line =~ /.\s*\S/) { |
170d3a226 checkpatch: handl... |
1512 |
($stat, $cond, $line_nr_next, $remain_next, $off_next) = |
f5fe35dd9 checkpatch: condi... |
1513 |
ctx_statement_block($linenr, $realcnt, 0); |
171ae1a49 update checkpatch... |
1514 1515 1516 1517 1518 1519 |
$stat =~ s/ ./ /g; $cond =~ s/ ./ /g; |
2b474a1a5 checkpatch: fix f... |
1520 1521 1522 1523 1524 1525 1526 |
# Find the real next line. $realline_next = $line_nr_next; if (defined $realline_next && (!defined $lines[$realline_next - 1] || substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { $realline_next++; } |
171ae1a49 update checkpatch... |
1527 1528 |
my $s = $stat; $s =~ s/{.*$//s; |
cf655043d update checkpatch... |
1529 |
|
c2fdda0df update checkpatch... |
1530 |
# Ignore goto labels. |
171ae1a49 update checkpatch... |
1531 |
if ($s =~ /$Ident:\*$/s) { |
c2fdda0df update checkpatch... |
1532 1533 |
# Ignore functions being called |
171ae1a49 update checkpatch... |
1534 |
} elsif ($s =~ /^.\s*$Ident\s*\(/s) { |
c2fdda0df update checkpatch... |
1535 |
|
463f28648 checkpatch: possi... |
1536 |
} elsif ($s =~ /^.\s*else\b/s) { |
c45dcabd2 update checkpatch... |
1537 |
# declarations always start with types |
d25065865 checkpatch: possi... |
1538 |
} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) { |
c45dcabd2 update checkpatch... |
1539 1540 1541 |
my $type = $1; $type =~ s/\s+/ /g; possible($type, "A:" . $s); |
8905a67c6 update checkpatch... |
1542 |
# definitions in global scope can only start with types |
a6a840628 checkpatch: label... |
1543 |
} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { |
c45dcabd2 update checkpatch... |
1544 |
possible($1, "B:" . $s); |
c2fdda0df update checkpatch... |
1545 |
} |
8905a67c6 update checkpatch... |
1546 1547 |
# any (foo ... *) is a pointer cast, and foo is a type |
65863862b checkpatch: dissa... |
1548 |
while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { |
c45dcabd2 update checkpatch... |
1549 |
possible($1, "C:" . $s); |
8905a67c6 update checkpatch... |
1550 1551 1552 1553 1554 |
} # Check for any sort of function declaration. # int foo(something bar, other baz); # void (*store_gdt)(x86_descr_ptr *); |
171ae1a49 update checkpatch... |
1555 |
if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { |
8905a67c6 update checkpatch... |
1556 |
my ($name_len) = length($1); |
8905a67c6 update checkpatch... |
1557 |
|
cf655043d update checkpatch... |
1558 |
my $ctx = $s; |
773647a09 update checkpatch... |
1559 |
substr($ctx, 0, $name_len + 1, ''); |
8905a67c6 update checkpatch... |
1560 |
$ctx =~ s/\)[^\)]*$//; |
cf655043d update checkpatch... |
1561 |
|
8905a67c6 update checkpatch... |
1562 |
for my $arg (split(/\s*,\s*/, $ctx)) { |
c45dcabd2 update checkpatch... |
1563 |
if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { |
8905a67c6 update checkpatch... |
1564 |
|
c45dcabd2 update checkpatch... |
1565 |
possible($1, "D:" . $s); |
8905a67c6 update checkpatch... |
1566 1567 |
} } |
9c0ca6f9a update checkpatch... |
1568 |
} |
8905a67c6 update checkpatch... |
1569 |
|
9c0ca6f9a update checkpatch... |
1570 |
} |
653d4876b update checkpatch... |
1571 1572 1573 |
# # Checks which may be anchored in the context. # |
00df344fd update checkpatch... |
1574 |
|
653d4876b update checkpatch... |
1575 1576 |
# Check for switch () and associated case and default # statements should be at the same indent. |
00df344fd update checkpatch... |
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 |
if ($line=~/\bswitch\s*\(.*\)/) { my $err = ''; my $sep = ''; my @ctx = ctx_block_outer($linenr, $realcnt); shift(@ctx); for my $ctx (@ctx) { my ($clen, $cindent) = line_stats($ctx); if ($ctx =~ /^\+\s*(case\s+|default:)/ && $indent != $cindent) { $err .= "$sep$ctx "; $sep = ''; } else { $sep = "[...] "; } } if ($err ne '') { |
9c0ca6f9a update checkpatch... |
1595 1596 |
ERROR("switch and case should be at the same indent $hereline$err"); |
de7d4f0e1 update checkpatch... |
1597 1598 1599 1600 1601 |
} } # if/while/etc brace do not go on next line, unless defining a do while loop, # or if that brace on the next line is for something else |
c45dcabd2 update checkpatch... |
1602 |
if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { |
773647a09 update checkpatch... |
1603 |
my $pre_ctx = "$1$2"; |
9c0ca6f9a update checkpatch... |
1604 |
my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); |
de7d4f0e1 update checkpatch... |
1605 1606 1607 |
my $ctx_cnt = $realcnt - $#ctx - 1; my $ctx = join(" ", @ctx); |
548596d52 checkpatch: trail... |
1608 1609 |
my $ctx_ln = $linenr; my $ctx_skip = $realcnt; |
773647a09 update checkpatch... |
1610 |
|
548596d52 checkpatch: trail... |
1611 1612 1613 1614 1615 1616 |
while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && defined $lines[$ctx_ln - 1] && $lines[$ctx_ln - 1] =~ /^-/)) { ##print "SKIP<$ctx_skip> CNT<$ctx_cnt> "; $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); |
de7d4f0e1 update checkpatch... |
1617 |
$ctx_ln++; |
de7d4f0e1 update checkpatch... |
1618 |
} |
548596d52 checkpatch: trail... |
1619 |
|
53210168f checkpatch: tough... |
1620 1621 1622 1623 1624 1625 1626 |
#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt> "; #print "pre<$pre_ctx> line<$line> ctx<$ctx> next<$lines[$ctx_ln - 1]> "; |
de7d4f0e1 update checkpatch... |
1627 |
|
773647a09 update checkpatch... |
1628 1629 1630 |
if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { ERROR("that open brace { should be on the previous line " . |
c45dcabd2 update checkpatch... |
1631 1632 1633 1634 |
"$here $ctx $lines[$ctx_ln - 1] "); |
00df344fd update checkpatch... |
1635 |
} |
773647a09 update checkpatch... |
1636 1637 1638 1639 |
if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && $ctx =~ /\)\s*\;\s*$/ && defined $lines[$ctx_ln - 1]) { |
9c0ca6f9a update checkpatch... |
1640 1641 |
my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); if ($nindent > $indent) { |
773647a09 update checkpatch... |
1642 1643 |
WARN("trailing semicolon indicates no statements, indent implies otherwise " . |
c45dcabd2 update checkpatch... |
1644 1645 1646 1647 |
"$here $ctx $lines[$ctx_ln - 1] "); |
9c0ca6f9a update checkpatch... |
1648 1649 |
} } |
00df344fd update checkpatch... |
1650 |
} |
4d001e4d8 checkpatch: repor... |
1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 |
# Check relative indent for conditionals and blocks. if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { my ($s, $c) = ($stat, $cond); substr($s, 0, length($c), ''); # Make sure we remove the line prefixes as we have # none on the first line, and are going to readd them # where necessary. $s =~ s/ ./ /gs; # Find out how long the conditional actually is. |
6f779c18c checkpatch: suspe... |
1665 1666 1667 |
my @newlines = ($c =~ / /gs); my $cond_lines = 1 + $#newlines; |
4d001e4d8 checkpatch: repor... |
1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 |
# We want to check the first line inside the block # starting at the end of the conditional, so remove: # 1) any blank line termination # 2) any opening brace { on end of the line # 3) any do (...) { my $continuation = 0; my $check = 0; $s =~ s/^.*\bdo\b//; $s =~ s/^\s*{//; if ($s =~ s/^\s*\\//) { $continuation = 1; } |
9bd49efe4 checkpatch: suspe... |
1681 1682 |
if ($s =~ s/^\s*? //) { |
4d001e4d8 checkpatch: repor... |
1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 |
$check = 1; $cond_lines++; } # Also ignore a loop construct at the end of a # preprocessor statement. if (($prevline =~ /^.\s*#\s*define\s/ || $prevline =~ /\\\s*$/) && $continuation == 0) { $check = 0; } |
9bd49efe4 checkpatch: suspe... |
1693 |
my $cond_ptr = -1; |
740504c61 checkpatch: suspe... |
1694 |
$continuation = 0; |
9bd49efe4 checkpatch: suspe... |
1695 1696 |
while ($cond_ptr != $cond_lines) { $cond_ptr = $cond_lines; |
f16fa28f7 checkpatch: suspe... |
1697 1698 1699 1700 1701 |
# If we see an #else/#elif then the code # is not linear. if ($s =~ /^\s*\#\s*(?:else|elif)/) { $check = 0; } |
9bd49efe4 checkpatch: suspe... |
1702 1703 1704 1705 |
# Ignore: # 1) blank lines, they should be at 0, # 2) preprocessor lines, and # 3) labels. |
740504c61 checkpatch: suspe... |
1706 1707 1708 |
if ($continuation || $s =~ /^\s*? / || |
9bd49efe4 checkpatch: suspe... |
1709 1710 |
$s =~ /^\s*#\s*?/ || $s =~ /^\s*$Ident\s*:/) { |
740504c61 checkpatch: suspe... |
1711 1712 |
$continuation = ($s =~ /^.*?\\ /) ? 1 : 0; |
30dad6ebe checkpatch: inden... |
1713 1714 1715 1716 |
if ($s =~ s/^.*? //) { $cond_lines++; } |
9bd49efe4 checkpatch: suspe... |
1717 |
} |
4d001e4d8 checkpatch: repor... |
1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 |
} my (undef, $sindent) = line_stats("+" . $s); my $stat_real = raw_line($linenr, $cond_lines); # Check if either of these lines are modified, else # this is not this patch's fault. if (!defined($stat_real) || $stat !~ /^\+/ && $stat_real !~ /^\+/) { $check = 0; } if (defined($stat_real) && $cond_lines > 1) { $stat_real = "[...] $stat_real"; } |
9bd49efe4 checkpatch: suspe... |
1733 1734 |
#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat> "; |
4d001e4d8 checkpatch: repor... |
1735 1736 1737 1738 1739 1740 1741 1742 |
if ($check && (($sindent % 8) != 0 || ($sindent <= $indent && $s ne ''))) { WARN("suspect code indent for conditional statements ($indent, $sindent) " . $herecurr . "$stat_real "); } } |
6c72ffaab update checkpatch... |
1743 1744 |
# Track the 'values' across context and added lines. my $opline = $line; $opline =~ s/^./ /; |
1f65f947a checkpatch: add c... |
1745 1746 1747 |
my ($curr_values, $curr_vars) = annotate_values($opline . " ", $prev_values); |
6c72ffaab update checkpatch... |
1748 |
$curr_values = $prev_values . $curr_values; |
c2fdda0df update checkpatch... |
1749 1750 |
if ($dbg_values) { my $outline = $opline; $outline =~ s/\t/ /g; |
cf655043d update checkpatch... |
1751 1752 1753 1754 |
print "$linenr > .$outline "; print "$linenr > $curr_values "; |
1f65f947a checkpatch: add c... |
1755 1756 |
print "$linenr > $curr_vars "; |
c2fdda0df update checkpatch... |
1757 |
} |
6c72ffaab update checkpatch... |
1758 |
$prev_values = substr($curr_values, -1); |
00df344fd update checkpatch... |
1759 1760 |
#ignore lines not being added if ($line=~/^[^\+]/) {next;} |
653d4876b update checkpatch... |
1761 |
# TEST: allow direct testing of the type matcher. |
7429c6903 checkpatch: impro... |
1762 1763 1764 1765 1766 1767 1768 1769 |
if ($dbg_type) { if ($line =~ /^.\s*$Declare\s*$/) { ERROR("TEST: is type " . $herecurr); } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { ERROR("TEST: is not type ($1 is) ". $herecurr); } |
653d4876b update checkpatch... |
1770 1771 |
next; } |
a1ef277e2 checkpatch: add t... |
1772 1773 |
# TEST: allow direct testing of the attribute matcher. if ($dbg_attr) { |
9360b0e50 checkpatch: exten... |
1774 |
if ($line =~ /^.\s*$Modifier\s*$/) { |
a1ef277e2 checkpatch: add t... |
1775 1776 |
ERROR("TEST: is attr " . $herecurr); |
9360b0e50 checkpatch: exten... |
1777 |
} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { |
a1ef277e2 checkpatch: add t... |
1778 1779 1780 1781 1782 |
ERROR("TEST: is not attr ($1 is) ". $herecurr); } next; } |
653d4876b update checkpatch... |
1783 |
|
f0a594c1c update checkpatch... |
1784 |
# check for initialisation to aggregates open brace on the next line |
99423c206 checkpatch: fix _... |
1785 1786 |
if ($line =~ /^.\s*{/ && $prevline =~ /(?:^|[^=])=\s*$/) { |
773647a09 update checkpatch... |
1787 1788 |
ERROR("that open brace { should be on the previous line " . $hereprev); |
f0a594c1c update checkpatch... |
1789 |
} |
653d4876b update checkpatch... |
1790 1791 1792 1793 1794 |
# # Checks which are anchored on the added line. # # check for malformed paths in #include statements (uses RAW line) |
c45dcabd2 update checkpatch... |
1795 |
if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { |
653d4876b update checkpatch... |
1796 1797 |
my $path = $1; if ($path =~ m{//}) { |
de7d4f0e1 update checkpatch... |
1798 1799 1800 |
ERROR("malformed #include filename " . $herecurr); |
653d4876b update checkpatch... |
1801 |
} |
653d4876b update checkpatch... |
1802 |
} |
00df344fd update checkpatch... |
1803 |
|
0a920b5b6 add a trivial pat... |
1804 |
# no C99 // comments |
00df344fd update checkpatch... |
1805 |
if ($line =~ m{//}) { |
de7d4f0e1 update checkpatch... |
1806 1807 |
ERROR("do not use C99 // comments " . $herecurr); |
0a920b5b6 add a trivial pat... |
1808 |
} |
00df344fd update checkpatch... |
1809 |
# Remove C99 comments. |
0a920b5b6 add a trivial pat... |
1810 |
$line =~ s@//.*@@; |
6c72ffaab update checkpatch... |
1811 |
$opline =~ s@//.*@@; |
0a920b5b6 add a trivial pat... |
1812 |
|
2b474a1a5 checkpatch: fix f... |
1813 1814 1815 1816 1817 1818 1819 1820 1821 |
# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider # the whole statement. #print "APW <$lines[$realline_next - 1]> "; if (defined $realline_next && exists $lines[$realline_next - 1] && !defined $suppress_export{$realline_next} && ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { |
653d4876b update checkpatch... |
1822 |
my $name = $1; |
2b474a1a5 checkpatch: fix f... |
1823 1824 1825 |
if ($stat !~ /(?: .}\s*$| |
480120586 checkpatch: DEFIN... |
1826 1827 1828 |
^.DEFINE_$Ident\(\Q$name\E\)| ^.DECLARE_$Ident\(\Q$name\E\)| ^.LIST_HEAD\(\Q$name\E\)| |
2b474a1a5 checkpatch: fix f... |
1829 1830 |
^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() |
480120586 checkpatch: DEFIN... |
1831 |
)/x) { |
2b474a1a5 checkpatch: fix f... |
1832 1833 1834 1835 1836 |
#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name> "; $suppress_export{$realline_next} = 2; } else { $suppress_export{$realline_next} = 1; |
0a920b5b6 add a trivial pat... |
1837 1838 |
} } |
2b474a1a5 checkpatch: fix f... |
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 |
if (!defined $suppress_export{$linenr} && $prevline =~ /^.\s*$/ && ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { #print "FOO B <$lines[$linenr - 1]> "; $suppress_export{$linenr} = 2; } if (defined $suppress_export{$linenr} && $suppress_export{$linenr} == 2) { WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable " . $herecurr); } |
0a920b5b6 add a trivial pat... |
1852 |
|
f0a594c1c update checkpatch... |
1853 |
# check for external initialisers. |
c45dcabd2 update checkpatch... |
1854 |
if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { |
f0a594c1c update checkpatch... |
1855 1856 1857 1858 |
ERROR("do not initialise externals to 0 or NULL " . $herecurr); } |
653d4876b update checkpatch... |
1859 |
# check for static initialisers. |
2d1bafd79 checkpatch: do no... |
1860 |
if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) { |
de7d4f0e1 update checkpatch... |
1861 1862 1863 |
ERROR("do not initialise statics to 0 or NULL " . $herecurr); |
0a920b5b6 add a trivial pat... |
1864 |
} |
653d4876b update checkpatch... |
1865 1866 1867 |
# check for new typedefs, only function parameters and sparse annotations # make sense. if ($line =~ /\btypedef\s/ && |
8054576dc checkpatch: loose... |
1868 |
$line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && |
c45dcabd2 update checkpatch... |
1869 |
$line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && |
8ed22cad9 checkpatch: pull ... |
1870 |
$line !~ /\b$typeTypedefs\b/ && |
653d4876b update checkpatch... |
1871 |
$line !~ /\b__bitwise(?:__|)\b/) { |
de7d4f0e1 update checkpatch... |
1872 1873 |
WARN("do not add new typedefs " . $herecurr); |
0a920b5b6 add a trivial pat... |
1874 1875 1876 |
} # * goes on variable not on type |
65863862b checkpatch: dissa... |
1877 |
# (char*[ const]) |
00ef4ece0 checkpatch: corre... |
1878 |
if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) { |
65863862b checkpatch: dissa... |
1879 1880 1881 1882 1883 1884 1885 |
my ($from, $to) = ($1, $1); # Should start with a space. $to =~ s/^(\S)/ $1/; # Should not end with a space. $to =~ s/\s+$//; # '*'s should not have spaces between. |
f9a0b3d17 checkpatch: type/... |
1886 |
while ($to =~ s/\*\s+\*/\*\*/) { |
65863862b checkpatch: dissa... |
1887 |
} |
d8aaf1214 update checkpatch... |
1888 |
|
65863862b checkpatch: dissa... |
1889 1890 1891 1892 1893 1894 |
#print "from<$from> to<$to> "; if ($from ne $to) { ERROR("\"(foo$from)\" should be \"(foo$to)\" " . $herecurr); } |
00ef4ece0 checkpatch: corre... |
1895 |
} elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) { |
65863862b checkpatch: dissa... |
1896 1897 1898 1899 1900 1901 1902 |
my ($from, $to, $ident) = ($1, $1, $2); # Should start with a space. $to =~ s/^(\S)/ $1/; # Should not end with a space. $to =~ s/\s+$//; # '*'s should not have spaces between. |
f9a0b3d17 checkpatch: type/... |
1903 |
while ($to =~ s/\*\s+\*/\*\*/) { |
65863862b checkpatch: dissa... |
1904 1905 1906 |
} # Modifiers should have spaces. $to =~ s/(\b$Modifier$)/$1 /; |
d8aaf1214 update checkpatch... |
1907 |
|
667026e7b checkpatch: a mod... |
1908 1909 1910 |
#print "from<$from> to<$to> ident<$ident> "; if ($from ne $to && $ident !~ /^$Modifier$/) { |
65863862b checkpatch: dissa... |
1911 1912 1913 |
ERROR("\"foo${from}bar\" should be \"foo${to}bar\" " . $herecurr); } |
0a920b5b6 add a trivial pat... |
1914 1915 1916 1917 1918 1919 1920 1921 1922 |
} # # no BUG() or BUG_ON() # if ($line =~ /\b(BUG|BUG_ON)\b/) { # print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON() "; # print "$herecurr"; # $clean = 0; # } |
8905a67c6 update checkpatch... |
1923 |
if ($line =~ /\bLINUX_VERSION_CODE\b/) { |
c2fdda0df update checkpatch... |
1924 1925 |
WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged " . $herecurr); |
8905a67c6 update checkpatch... |
1926 |
} |
00df344fd update checkpatch... |
1927 1928 1929 1930 1931 |
# printk should use KERN_* levels. Note that follow on printk's on the # same line do not need a level, so we use the current block context # to try and find and validate the current printk. In summary the current # printk includes all preceeding printk's which have no newline on the end. # we assume the first bad printk is the one to report. |
f0a594c1c update checkpatch... |
1932 |
if ($line =~ /\bprintk\((?!KERN_)\s*"/) { |
00df344fd update checkpatch... |
1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 |
my $ok = 0; for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) { #print "CHECK<$lines[$ln - 1] "; # we have a preceeding printk if it ends # with " " ignore it, else it is to blame if ($lines[$ln - 1] =~ m{\bprintk\(}) { if ($rawlines[$ln - 1] !~ m{\ "}) { $ok = 1; } last; } } if ($ok == 0) { |
de7d4f0e1 update checkpatch... |
1949 1950 |
WARN("printk() should include KERN_ facility level " . $herecurr); |
00df344fd update checkpatch... |
1951 |
} |
0a920b5b6 add a trivial pat... |
1952 |
} |
653d4876b update checkpatch... |
1953 1954 |
# function brace can't be on same line, except for #defines of do while, # or if closed on same line |
c45dcabd2 update checkpatch... |
1955 1956 |
if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) { |
de7d4f0e1 update checkpatch... |
1957 1958 |
ERROR("open brace '{' following function declarations go on the next line " . $herecurr); |
0a920b5b6 add a trivial pat... |
1959 |
} |
653d4876b update checkpatch... |
1960 |
|
8905a67c6 update checkpatch... |
1961 1962 1963 1964 1965 1966 |
# open braces for enum, union and struct go on the same line. if ($line =~ /^.\s*{/ && $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { ERROR("open brace '{' following $1 go on the same line " . $hereprev); } |
8d31cfcec checkpatch: check... |
1967 1968 |
# check for spacing round square brackets; allowed: # 1. with a type on the left -- int [] a; |
fe2a7dbc8 checkpatch: squar... |
1969 1970 |
# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, # 3. inside a curly brace -- = { [0...10] = 5 } |
8d31cfcec checkpatch: check... |
1971 1972 1973 |
while ($line =~ /(.*?\s)\[/g) { my ($where, $prefix) = ($-[1], $1); if ($prefix !~ /$Type\s+$/ && |
fe2a7dbc8 checkpatch: squar... |
1974 1975 |
($where != 0 || $prefix !~ /^.\s+$/) && $prefix !~ /{\s+$/) { |
8d31cfcec checkpatch: check... |
1976 1977 1978 1979 |
ERROR("space prohibited before open square bracket '[' " . $herecurr); } } |
f0a594c1c update checkpatch... |
1980 |
# check for spaces between functions and their parentheses. |
6c72ffaab update checkpatch... |
1981 |
while ($line =~ /($Ident)\s+\(/g) { |
c2fdda0df update checkpatch... |
1982 |
my $name = $1; |
773647a09 update checkpatch... |
1983 1984 |
my $ctx_before = substr($line, 0, $-[1]); my $ctx = "$ctx_before$name"; |
c2fdda0df update checkpatch... |
1985 1986 |
# Ignore those directives where spaces _are_ permitted. |
773647a09 update checkpatch... |
1987 1988 1989 1990 1991 1992 |
if ($name =~ /^(?: if|for|while|switch|return|case| volatile|__volatile__| __attribute__|format|__extension__| asm|__asm__)$/x) { |
c2fdda0df update checkpatch... |
1993 1994 1995 1996 |
# cpp #define statements have non-optional spaces, ie # if there is a space between the name and the open # parenthesis it is simply not a parameter group. |
c45dcabd2 update checkpatch... |
1997 |
} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { |
773647a09 update checkpatch... |
1998 1999 |
# cpp #elif statement condition may start with a ( |
c45dcabd2 update checkpatch... |
2000 |
} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { |
c2fdda0df update checkpatch... |
2001 2002 2003 |
# If this whole things ends with a type its most # likely a typedef for a function. |
773647a09 update checkpatch... |
2004 |
} elsif ($ctx =~ /$Type$/) { |
c2fdda0df update checkpatch... |
2005 2006 |
} else { |
773647a09 update checkpatch... |
2007 2008 |
WARN("space prohibited between function name and open parenthesis '(' " . $herecurr); |
6c72ffaab update checkpatch... |
2009 |
} |
f0a594c1c update checkpatch... |
2010 |
} |
653d4876b update checkpatch... |
2011 |
# Check operator spacing. |
0a920b5b6 add a trivial pat... |
2012 |
if (!($line=~/\#\s*include/)) { |
9c0ca6f9a update checkpatch... |
2013 2014 2015 2016 |
my $ops = qr{ <<=|>>=|<=|>=|==|!=| \+=|-=|\*=|\/=|%=|\^=|\|=|&=| =>|->|<<|>>|<|>|=|!|~| |
1f65f947a checkpatch: add c... |
2017 2018 |
&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| \?|: |
9c0ca6f9a update checkpatch... |
2019 |
}x; |
cf655043d update checkpatch... |
2020 |
my @elements = split(/($ops|;)/, $opline); |
00df344fd update checkpatch... |
2021 |
my $off = 0; |
6c72ffaab update checkpatch... |
2022 2023 |
my $blank = copy_spacing($opline); |
0a920b5b6 add a trivial pat... |
2024 |
for (my $n = 0; $n < $#elements; $n += 2) { |
4a0df2ef4 update checkpatch... |
2025 |
$off += length($elements[$n]); |
773647a09 update checkpatch... |
2026 2027 2028 2029 2030 2031 2032 |
# Pick up the preceeding and succeeding characters. my $ca = substr($opline, 0, $off); my $cc = ''; if (length($opline) >= ($off + length($elements[$n + 1]))) { $cc = substr($opline, $off + length($elements[$n + 1])); } my $cb = "$ca$;$cc"; |
4a0df2ef4 update checkpatch... |
2033 2034 2035 |
my $a = ''; $a = 'V' if ($elements[$n] ne ''); $a = 'W' if ($elements[$n] =~ /\s$/); |
cf655043d update checkpatch... |
2036 |
$a = 'C' if ($elements[$n] =~ /$;$/); |
4a0df2ef4 update checkpatch... |
2037 2038 |
$a = 'B' if ($elements[$n] =~ /(\[|\()$/); $a = 'O' if ($elements[$n] eq ''); |
773647a09 update checkpatch... |
2039 |
$a = 'E' if ($ca =~ /^\s*$/); |
4a0df2ef4 update checkpatch... |
2040 |
|
0a920b5b6 add a trivial pat... |
2041 |
my $op = $elements[$n + 1]; |
4a0df2ef4 update checkpatch... |
2042 2043 |
my $c = ''; |
0a920b5b6 add a trivial pat... |
2044 |
if (defined $elements[$n + 2]) { |
4a0df2ef4 update checkpatch... |
2045 2046 |
$c = 'V' if ($elements[$n + 2] ne ''); $c = 'W' if ($elements[$n + 2] =~ /^\s/); |
cf655043d update checkpatch... |
2047 |
$c = 'C' if ($elements[$n + 2] =~ /^$;/); |
4a0df2ef4 update checkpatch... |
2048 2049 |
$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); $c = 'O' if ($elements[$n + 2] eq ''); |
8b1b33786 checkpatch: fix c... |
2050 |
$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); |
4a0df2ef4 update checkpatch... |
2051 2052 |
} else { $c = 'E'; |
0a920b5b6 add a trivial pat... |
2053 |
} |
4a0df2ef4 update checkpatch... |
2054 2055 2056 |
my $ctx = "${a}x${c}"; my $at = "(ctx:$ctx)"; |
6c72ffaab update checkpatch... |
2057 |
my $ptr = substr($blank, 0, $off) . "^"; |
de7d4f0e1 update checkpatch... |
2058 2059 |
my $hereptr = "$hereline$ptr "; |
0a920b5b6 add a trivial pat... |
2060 |
|
74048ed81 checkpatch: varia... |
2061 |
# Pull out the value of this operator. |
6c72ffaab update checkpatch... |
2062 |
my $op_type = substr($curr_values, $off + 1, 1); |
0a920b5b6 add a trivial pat... |
2063 |
|
1f65f947a checkpatch: add c... |
2064 2065 |
# Get the full operator variant. my $opv = $op . substr($curr_vars, $off, 1); |
13214adf7 update checkpatch... |
2066 2067 2068 |
# Ignore operators passed as parameters. if ($op_type ne 'V' && $ca =~ /\s$/ && $cc =~ /^\s*,/) { |
cf655043d update checkpatch... |
2069 2070 |
# # Ignore comments # } elsif ($op =~ /^$;+$/) { |
13214adf7 update checkpatch... |
2071 |
|
d8aaf1214 update checkpatch... |
2072 |
# ; should have either the end of line or a space or \ after it |
13214adf7 update checkpatch... |
2073 |
} elsif ($op eq ';') { |
cf655043d update checkpatch... |
2074 2075 |
if ($ctx !~ /.x[WEBC]/ && $cc !~ /^\\/ && $cc !~ /^;/) { |
773647a09 update checkpatch... |
2076 2077 |
ERROR("space required after that '$op' $at " . $hereptr); |
d8aaf1214 update checkpatch... |
2078 2079 2080 2081 |
} # // is a comment } elsif ($op eq '//') { |
0a920b5b6 add a trivial pat... |
2082 |
|
1f65f947a checkpatch: add c... |
2083 2084 2085 2086 |
# No spaces for: # -> # : when part of a bitfield } elsif ($op eq '->' || $opv eq ':B') { |
4a0df2ef4 update checkpatch... |
2087 |
if ($ctx =~ /Wx.|.xW/) { |
773647a09 update checkpatch... |
2088 2089 |
ERROR("spaces prohibited around that '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2090 2091 2092 2093 |
} # , must have a space on the right. } elsif ($op eq ',') { |
cf655043d update checkpatch... |
2094 |
if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { |
773647a09 update checkpatch... |
2095 2096 |
ERROR("space required after that '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2097 |
} |
9c0ca6f9a update checkpatch... |
2098 |
# '*' as part of a type definition -- reported already. |
74048ed81 checkpatch: varia... |
2099 |
} elsif ($opv eq '*_') { |
9c0ca6f9a update checkpatch... |
2100 2101 2102 2103 2104 2105 2106 |
#warn "'*' is part of type "; # unary operators should have a space before and # none after. May be left adjacent to another # unary operator, or a cast } elsif ($op eq '!' || $op eq '~' || |
74048ed81 checkpatch: varia... |
2107 |
$opv eq '*U' || $opv eq '-U' || |
0d413866c checkpatch: value... |
2108 |
$opv eq '&U' || $opv eq '&&U') { |
cf655043d update checkpatch... |
2109 |
if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
773647a09 update checkpatch... |
2110 2111 |
ERROR("space required before that '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2112 |
} |
a3340b357 checkpatch: point... |
2113 |
if ($op eq '*' && $cc =~/\s*$Modifier\b/) { |
171ae1a49 update checkpatch... |
2114 2115 2116 |
# A unary '*' may be const } elsif ($ctx =~ /.xW/) { |
fb9e9096b checkpatch: limit... |
2117 2118 |
ERROR("space prohibited after that '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2119 2120 2121 2122 |
} # unary ++ and unary -- are allowed no space on one side. } elsif ($op eq '++' or $op eq '--') { |
773647a09 update checkpatch... |
2123 2124 2125 2126 2127 2128 2129 2130 |
if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { ERROR("space required one side of that '$op' $at " . $hereptr); } if ($ctx =~ /Wx[BE]/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { ERROR("space prohibited before that '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2131 |
} |
773647a09 update checkpatch... |
2132 2133 2134 |
if ($ctx =~ /ExW/) { ERROR("space prohibited after that '$op' $at " . $hereptr); |
653d4876b update checkpatch... |
2135 |
} |
0a920b5b6 add a trivial pat... |
2136 |
|
773647a09 update checkpatch... |
2137 |
|
0a920b5b6 add a trivial pat... |
2138 |
# << and >> may either have or not have spaces both sides |
9c0ca6f9a update checkpatch... |
2139 2140 2141 |
} elsif ($op eq '<<' or $op eq '>>' or $op eq '&' or $op eq '^' or $op eq '|' or $op eq '+' or $op eq '-' or |
c2fdda0df update checkpatch... |
2142 2143 |
$op eq '*' or $op eq '/' or $op eq '%') |
0a920b5b6 add a trivial pat... |
2144 |
{ |
773647a09 update checkpatch... |
2145 |
if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { |
de7d4f0e1 update checkpatch... |
2146 2147 2148 |
ERROR("need consistent spacing around '$op' $at " . $hereptr); |
0a920b5b6 add a trivial pat... |
2149 |
} |
1f65f947a checkpatch: add c... |
2150 2151 2152 2153 2154 2155 2156 |
# A colon needs no spaces before when it is # terminating a case value or a label. } elsif ($opv eq ':C' || $opv eq ':L') { if ($ctx =~ /Wx./) { ERROR("space prohibited before that '$op' $at " . $hereptr); } |
0a920b5b6 add a trivial pat... |
2157 |
# All the others need spaces both sides. |
cf655043d update checkpatch... |
2158 |
} elsif ($ctx !~ /[EWC]x[CWE]/) { |
1f65f947a checkpatch: add c... |
2159 |
my $ok = 0; |
22f2a2ef9 update checkpatch... |
2160 |
# Ignore email addresses <foo@bar> |
1f65f947a checkpatch: add c... |
2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 |
if (($op eq '<' && $cc =~ /^\S+\@\S+>/) || ($op eq '>' && $ca =~ /<\S+\@\S+$/)) { $ok = 1; } # Ignore ?: if (($opv eq ':O' && $ca =~ /\?$/) || ($op eq '?' && $cc =~ /^:/)) { $ok = 1; } if ($ok == 0) { |
773647a09 update checkpatch... |
2176 2177 |
ERROR("spaces required around that '$op' $at " . $hereptr); |
22f2a2ef9 update checkpatch... |
2178 |
} |
0a920b5b6 add a trivial pat... |
2179 |
} |
4a0df2ef4 update checkpatch... |
2180 |
$off += length($elements[$n + 1]); |
0a920b5b6 add a trivial pat... |
2181 2182 |
} } |
f0a594c1c update checkpatch... |
2183 2184 |
# check for multiple assignments if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { |
6c72ffaab update checkpatch... |
2185 2186 |
CHK("multiple assignments should be avoided " . $herecurr); |
f0a594c1c update checkpatch... |
2187 |
} |
22f2a2ef9 update checkpatch... |
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 |
## # check for multiple declarations, allowing for a function declaration ## # continuation. ## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && ## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { ## ## # Remove any bracketed sections to ensure we do not ## # falsly report the parameters of functions. ## my $ln = $line; ## while ($ln =~ s/\([^\(\)]*\)//g) { ## } ## if ($ln =~ /,/) { ## WARN("declaring multiple variables together should be avoided " . $herecurr); ## } ## } |
f0a594c1c update checkpatch... |
2203 |
|
0a920b5b6 add a trivial pat... |
2204 |
#need space before brace following if, while, etc |
22f2a2ef9 update checkpatch... |
2205 2206 |
if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) || $line =~ /do{/) { |
773647a09 update checkpatch... |
2207 2208 |
ERROR("space required before the open brace '{' " . $herecurr); |
de7d4f0e1 update checkpatch... |
2209 2210 2211 2212 2213 |
} # closing brace should have a space following it when it has anything # on the line if ($line =~ /}(?!(?:,|;|\)))\S/) { |
773647a09 update checkpatch... |
2214 2215 |
ERROR("space required after that close brace '}' " . $herecurr); |
0a920b5b6 add a trivial pat... |
2216 |
} |
22f2a2ef9 update checkpatch... |
2217 2218 |
# check spacing on square brackets if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { |
773647a09 update checkpatch... |
2219 2220 |
ERROR("space prohibited after that open square bracket '[' " . $herecurr); |
22f2a2ef9 update checkpatch... |
2221 2222 |
} if ($line =~ /\s\]/) { |
773647a09 update checkpatch... |
2223 2224 |
ERROR("space prohibited before that close square bracket ']' " . $herecurr); |
22f2a2ef9 update checkpatch... |
2225 |
} |
c45dcabd2 update checkpatch... |
2226 |
# check spacing on parentheses |
9c0ca6f9a update checkpatch... |
2227 2228 |
if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && $line !~ /for\s*\(\s+;/) { |
773647a09 update checkpatch... |
2229 2230 |
ERROR("space prohibited after that open parenthesis '(' " . $herecurr); |
22f2a2ef9 update checkpatch... |
2231 |
} |
13214adf7 update checkpatch... |
2232 |
if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && |
c45dcabd2 update checkpatch... |
2233 2234 |
$line !~ /for\s*\(.*;\s+\)/ && $line !~ /:\s+\)/) { |
773647a09 update checkpatch... |
2235 2236 |
ERROR("space prohibited before that close parenthesis ')' " . $herecurr); |
22f2a2ef9 update checkpatch... |
2237 |
} |
0a920b5b6 add a trivial pat... |
2238 |
#goto labels aren't indented, allow a single space however |
4a0df2ef4 update checkpatch... |
2239 |
if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and |
0a920b5b6 add a trivial pat... |
2240 |
!($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { |
de7d4f0e1 update checkpatch... |
2241 2242 |
WARN("labels should not be indented " . $herecurr); |
0a920b5b6 add a trivial pat... |
2243 |
} |
c45dcabd2 update checkpatch... |
2244 2245 2246 2247 |
# Return is not a function. if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) { my $spacing = $1; my $value = $2; |
86f9d059c checkpatch: allow... |
2248 |
# Flatten any parentheses |
fee61c47d checkpatch: retur... |
2249 |
$value =~ s/\)\(/\) \(/g; |
63f17f897 checkpatch: allow... |
2250 2251 2252 2253 2254 |
while ($value =~ s/\[[^\{\}]*\]/1/ || $value !~ /(?:$Ident|-?$Constant)\s* $Compare\s* (?:$Ident|-?$Constant)/x && $value =~ s/\([^\(\)]*\)/1/) { |
c45dcabd2 update checkpatch... |
2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 |
} if ($value =~ /^(?:$Ident|-?$Constant)$/) { ERROR("return is not a function, parentheses are not required " . $herecurr); } elsif ($spacing !~ /\s+/) { ERROR("space required before the open parenthesis '(' " . $herecurr); } } |
0a920b5b6 add a trivial pat... |
2266 |
# Need a space before open parenthesis after if, while etc |
4a0df2ef4 update checkpatch... |
2267 |
if ($line=~/\b(if|while|for|switch)\(/) { |
773647a09 update checkpatch... |
2268 2269 |
ERROR("space required before the open parenthesis '(' " . $herecurr); |
0a920b5b6 add a trivial pat... |
2270 |
} |
f5fe35dd9 checkpatch: condi... |
2271 2272 |
# Check for illegal assignment in if conditional -- and check for trailing # statements after the conditional. |
170d3a226 checkpatch: handl... |
2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 |
if ($line =~ /do\s*(?!{)/) { my ($stat_next) = ctx_statement_block($line_nr_next, $remain_next, $off_next); $stat_next =~ s/ ./ /g; ##print "stat<$stat> stat_next<$stat_next> "; if ($stat_next =~ /^\s*while\b/) { # If the statement carries leading newlines, # then count those as offsets. my ($whitespace) = ($stat_next =~ /^((?:\s* [+-])*\s*)/s); my $offset = statement_rawlines($whitespace) - 1; $suppress_whiletrailers{$line_nr_next + $offset} = 1; } } if (!defined $suppress_whiletrailers{$linenr} && $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { |
171ae1a49 update checkpatch... |
2297 |
my ($s, $c) = ($stat, $cond); |
8905a67c6 update checkpatch... |
2298 |
|
b53c8e104 checkpatch: ensur... |
2299 |
if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { |
c2fdda0df update checkpatch... |
2300 2301 |
ERROR("do not use assignment in if condition " . $herecurr); |
8905a67c6 update checkpatch... |
2302 2303 2304 2305 |
} # Find out what is on the end of the line after the # conditional. |
773647a09 update checkpatch... |
2306 |
substr($s, 0, length($c), ''); |
8905a67c6 update checkpatch... |
2307 2308 |
$s =~ s/ .*//g; |
13214adf7 update checkpatch... |
2309 |
$s =~ s/$;//g; # Remove any comments |
53210168f checkpatch: tough... |
2310 2311 |
if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && $c !~ /}\s*while\s*/) |
773647a09 update checkpatch... |
2312 |
{ |
bb44ad39c checkpatch: trail... |
2313 2314 2315 2316 |
# Find out how long the conditional actually is. my @newlines = ($c =~ / /gs); my $cond_lines = 1 + $#newlines; |
42bdf74c9 checkpatch: trivi... |
2317 |
my $stat_real = ''; |
bb44ad39c checkpatch: trail... |
2318 |
|
42bdf74c9 checkpatch: trivi... |
2319 2320 2321 |
$stat_real = raw_line($linenr, $cond_lines) . " " if ($cond_lines); |
bb44ad39c checkpatch: trail... |
2322 2323 2324 2325 2326 2327 2328 |
if (defined($stat_real) && $cond_lines > 1) { $stat_real = "[...] $stat_real"; } ERROR("trailing statements should be on next line " . $herecurr . $stat_real); |
8905a67c6 update checkpatch... |
2329 2330 |
} } |
13214adf7 update checkpatch... |
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 |
# Check for bitwise tests written as boolean if ($line =~ / (?: (?:\[|\(|\&\&|\|\|) \s*0[xX][0-9]+\s* (?:\&\&|\|\|) | (?:\&\&|\|\|) \s*0[xX][0-9]+\s* (?:\&\&|\|\||\)|\]) )/x) { WARN("boolean test with hexadecimal, perhaps just 1 \& or \|? " . $herecurr); } |
8905a67c6 update checkpatch... |
2346 |
# if and else should not have general statements after it |
13214adf7 update checkpatch... |
2347 2348 2349 2350 2351 2352 2353 |
if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { my $s = $1; $s =~ s/$;//g; # Remove any comments if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { ERROR("trailing statements should be on next line " . $herecurr); } |
0a920b5b6 add a trivial pat... |
2354 |
} |
396677823 checkpatch: if sh... |
2355 2356 2357 2358 2359 2360 |
# if should not continue a brace if ($line =~ /}\s*if\b/) { ERROR("trailing statements should be on next line " . $herecurr); } |
a1080bf80 checkpatch: case/... |
2361 2362 2363 |
# case and default should not have general statements after them if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && $line !~ /\G(?: |
3fef12d6c checkpatch: allow... |
2364 |
(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| |
a1080bf80 checkpatch: case/... |
2365 2366 2367 2368 2369 2370 |
\s*return\s+ )/xg) { ERROR("trailing statements should be on next line " . $herecurr); } |
0a920b5b6 add a trivial pat... |
2371 2372 2373 2374 2375 |
# Check for }<nl>else {, these must be at the same # indent level to be relevant to each other. if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and $previndent == $indent) { |
de7d4f0e1 update checkpatch... |
2376 2377 |
ERROR("else should follow close brace '}' " . $hereprev); |
0a920b5b6 add a trivial pat... |
2378 |
} |
c2fdda0df update checkpatch... |
2379 2380 2381 2382 2383 2384 |
if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and $previndent == $indent) { my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); # Find out what is on the end of the line after the # conditional. |
773647a09 update checkpatch... |
2385 |
substr($s, 0, length($c), ''); |
c2fdda0df update checkpatch... |
2386 2387 2388 2389 2390 2391 2392 2393 |
$s =~ s/ .*//g; if ($s =~ /^\s*;/) { ERROR("while should follow close brace '}' " . $hereprev); } } |
0a920b5b6 add a trivial pat... |
2394 2395 2396 2397 2398 2399 2400 2401 2402 |
#studly caps, commented out until figure out how to distinguish between use of existing and adding new # if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) { # print "No studly caps, use _ "; # print "$herecurr"; # $clean = 0; # } #no spaces allowed after \ in define |
c45dcabd2 update checkpatch... |
2403 |
if ($line=~/\#\s*define.*\\\s$/) { |
de7d4f0e1 update checkpatch... |
2404 2405 |
WARN("Whitepspace after \\ makes next lines useless " . $herecurr); |
0a920b5b6 add a trivial pat... |
2406 |
} |
653d4876b update checkpatch... |
2407 |
#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) |
c45dcabd2 update checkpatch... |
2408 |
if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { |
e09dec483 checkpatch: reduc... |
2409 2410 2411 2412 |
my $file = "$1.h"; my $checkfile = "include/linux/$file"; if (-f "$root/$checkfile" && $realfile ne $checkfile && |
c45dcabd2 update checkpatch... |
2413 2414 |
$1 ne 'irq') { |
e09dec483 checkpatch: reduc... |
2415 2416 2417 2418 2419 2420 2421 |
if ($realfile =~ m{^arch/}) { CHK("Consider using #include <linux/$file> instead of <asm/$file> " . $herecurr); } else { WARN("Use #include <linux/$file> instead of <asm/$file> " . $herecurr); } |
0a920b5b6 add a trivial pat... |
2422 2423 |
} } |
653d4876b update checkpatch... |
2424 2425 |
# multi-statement macros should be enclosed in a do while loop, grab the # first statement and ensure its the whole macro if its not enclosed |
cf655043d update checkpatch... |
2426 |
# in a known good container |
b8f96a31f checkpatch: macro... |
2427 2428 |
if ($realfile !~ m@/vmlinux.lds.h$@ && $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { |
d8aaf1214 update checkpatch... |
2429 2430 |
my $ln = $linenr; my $cnt = $realcnt; |
c45dcabd2 update checkpatch... |
2431 2432 |
my ($off, $dstat, $dcond, $rest); my $ctx = ''; |
653d4876b update checkpatch... |
2433 |
|
c45dcabd2 update checkpatch... |
2434 2435 2436 2437 2438 2439 2440 2441 2442 |
my $args = defined($1); # Find the end of the macro and limit our statement # search to that. while ($cnt > 0 && defined $lines[$ln - 1] && $lines[$ln - 1] =~ /^(?:-|..*\\$)/) { $ctx .= $rawlines[$ln - 1] . " "; |
a3bb97a7a checkpatch: macro... |
2443 |
$cnt-- if ($lines[$ln - 1] !~ /^-/); |
c45dcabd2 update checkpatch... |
2444 |
$ln++; |
c45dcabd2 update checkpatch... |
2445 2446 2447 2448 2449 2450 2451 |
} $ctx .= $rawlines[$ln - 1]; ($dstat, $dcond, $ln, $cnt, $off) = ctx_statement_block($linenr, $ln - $linenr + 1, 0); #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off> "; |
a3bb97a7a checkpatch: macro... |
2452 2453 |
#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . " "; |
c45dcabd2 update checkpatch... |
2454 2455 2456 2457 |
# Extract the remainder of the define (if any) and # rip off surrounding spaces, and trailing \'s. $rest = ''; |
636d140a8 checkpatch: compl... |
2458 2459 2460 |
while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) { #print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest> "; |
a3bb97a7a checkpatch: macro... |
2461 2462 2463 2464 2465 |
if ($off != 0 || $lines[$ln - 1] !~ /^-/) { $rest .= substr($lines[$ln - 1], $off) . " "; $cnt--; } |
c45dcabd2 update checkpatch... |
2466 |
$ln++; |
c45dcabd2 update checkpatch... |
2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 |
$off = 0; } $rest =~ s/\\ .//g; $rest =~ s/^\s*//s; $rest =~ s/\s*$//s; # Clean up the original statement. if ($args) { substr($dstat, 0, length($dcond), ''); } else { $dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//; |
d8aaf1214 update checkpatch... |
2479 |
} |
292f1a9b3 checkpatch: compl... |
2480 |
$dstat =~ s/$;//g; |
c45dcabd2 update checkpatch... |
2481 2482 2483 2484 |
$dstat =~ s/\\ .//g; $dstat =~ s/^\s*//s; $dstat =~ s/\s*$//s; |
de7d4f0e1 update checkpatch... |
2485 |
|
c45dcabd2 update checkpatch... |
2486 |
# Flatten any parentheses and braces |
bf30d6ede checkpatch: compl... |
2487 2488 2489 2490 |
while ($dstat =~ s/\([^\(\)]*\)/1/ || $dstat =~ s/\{[^\{\}]*\}/1/ || $dstat =~ s/\[[^\{\}]*\]/1/) { |
de7d4f0e1 update checkpatch... |
2491 |
} |
d8aaf1214 update checkpatch... |
2492 |
|
c45dcabd2 update checkpatch... |
2493 2494 2495 2496 2497 2498 |
my $exceptions = qr{ $Declare| module_param_named| MODULE_PARAM_DESC| DECLARE_PER_CPU| DEFINE_PER_CPU| |
383099fd6 checkpatch: struc... |
2499 |
__typeof__\(| |
22fd2d3e4 checkpatch.pl: ad... |
2500 2501 |
union| struct| |
ea71a0a01 checkpatch: forma... |
2502 2503 |
\.$Ident\s*=\s*| ^\"|\"$ |
c45dcabd2 update checkpatch... |
2504 |
}x; |
383099fd6 checkpatch: struc... |
2505 2506 |
#print "REST<$rest> dstat<$dstat> "; |
c45dcabd2 update checkpatch... |
2507 2508 2509 2510 |
if ($rest ne '') { if ($rest !~ /while\s*\(/ && $dstat !~ /$exceptions/) { |
de7d4f0e1 update checkpatch... |
2511 2512 2513 2514 |
ERROR("Macros with multiple statements should be enclosed in a do - while loop " . "$here $ctx "); |
c45dcabd2 update checkpatch... |
2515 2516 2517 2518 2519 2520 |
} } elsif ($ctx !~ /;/) { if ($dstat ne '' && $dstat !~ /^(?:$Ident|-?$Constant)$/ && $dstat !~ /$exceptions/ && |
b132e5d58 checkpatch: macro... |
2521 |
$dstat !~ /^\.$Ident\s*=/ && |
c45dcabd2 update checkpatch... |
2522 2523 |
$dstat =~ /$Operators/) { |
de7d4f0e1 update checkpatch... |
2524 2525 2526 2527 |
ERROR("Macros with complex values should be enclosed in parenthesis " . "$here $ctx "); |
d8aaf1214 update checkpatch... |
2528 |
} |
653d4876b update checkpatch... |
2529 |
} |
0a920b5b6 add a trivial pat... |
2530 |
} |
080ba9296 checkpatch: try t... |
2531 2532 2533 2534 2535 2536 2537 2538 2539 |
# make sure symbols are always wrapped with VMLINUX_SYMBOL() ... # all assignments may have only one of the following with an assignment: # . # ALIGN(...) # VMLINUX_SYMBOL(...) if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) { WARN("vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols " . $herecurr); } |
f0a594c1c update checkpatch... |
2540 |
# check for redundant bracing round if etc |
13214adf7 update checkpatch... |
2541 2542 |
if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { my ($level, $endln, @chunks) = |
cf655043d update checkpatch... |
2543 |
ctx_statement_full($linenr, $realcnt, 1); |
13214adf7 update checkpatch... |
2544 2545 |
#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level> "; |
cf655043d update checkpatch... |
2546 2547 2548 |
#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>> "; if ($#chunks > 0 && $level == 0) { |
13214adf7 update checkpatch... |
2549 2550 |
my $allowed = 0; my $seen = 0; |
773647a09 update checkpatch... |
2551 2552 |
my $herectx = $here . " "; |
cf655043d update checkpatch... |
2553 |
my $ln = $linenr - 1; |
13214adf7 update checkpatch... |
2554 2555 |
for my $chunk (@chunks) { my ($cond, $block) = @{$chunk}; |
773647a09 update checkpatch... |
2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 |
# If the condition carries leading newlines, then count those as offsets. my ($whitespace) = ($cond =~ /^((?:\s* [+-])*\s*)/s); my $offset = statement_rawlines($whitespace) - 1; #print "COND<$cond> whitespace<$whitespace> offset<$offset> "; # We have looked at and allowed this specific line. $suppress_ifbraces{$ln + $offset} = 1; $herectx .= "$rawlines[$ln + $offset] [...] "; |
cf655043d update checkpatch... |
2570 |
$ln += statement_rawlines($block) - 1; |
773647a09 update checkpatch... |
2571 |
substr($block, 0, length($cond), ''); |
13214adf7 update checkpatch... |
2572 2573 |
$seen++ if ($block =~ /^\s*{/); |
cf655043d update checkpatch... |
2574 2575 2576 2577 2578 |
#print "cond<$cond> block<$block> allowed<$allowed> "; if (statement_lines($cond) > 1) { #print "APW: ALLOWED: cond<$cond> "; |
13214adf7 update checkpatch... |
2579 2580 2581 |
$allowed = 1; } if ($block =~/\b(?:if|for|while)\b/) { |
cf655043d update checkpatch... |
2582 2583 |
#print "APW: ALLOWED: block<$block> "; |
13214adf7 update checkpatch... |
2584 2585 |
$allowed = 1; } |
cf655043d update checkpatch... |
2586 2587 2588 |
if (statement_block_size($block) > 1) { #print "APW: ALLOWED: lines block<$block> "; |
13214adf7 update checkpatch... |
2589 2590 2591 2592 |
$allowed = 1; } } if ($seen && !$allowed) { |
cf655043d update checkpatch... |
2593 2594 |
WARN("braces {} are not necessary for any arm of this statement " . $herectx); |
13214adf7 update checkpatch... |
2595 2596 2597 |
} } } |
773647a09 update checkpatch... |
2598 |
if (!defined $suppress_ifbraces{$linenr - 1} && |
13214adf7 update checkpatch... |
2599 |
$line =~ /\b(if|while|for|else)\b/) { |
cf655043d update checkpatch... |
2600 2601 2602 2603 2604 2605 2606 2607 |
my $allowed = 0; # Check the pre-context. if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { #print "APW: ALLOWED: pre<$1> "; $allowed = 1; } |
773647a09 update checkpatch... |
2608 2609 2610 |
my ($level, $endln, @chunks) = ctx_statement_full($linenr, $realcnt, $-[0]); |
cf655043d update checkpatch... |
2611 2612 |
# Check the condition. my ($cond, $block) = @{$chunks[0]}; |
773647a09 update checkpatch... |
2613 2614 |
#print "CHECKING<$linenr> cond<$cond> block<$block> "; |
cf655043d update checkpatch... |
2615 |
if (defined $cond) { |
773647a09 update checkpatch... |
2616 |
substr($block, 0, length($cond), ''); |
cf655043d update checkpatch... |
2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 |
} if (statement_lines($cond) > 1) { #print "APW: ALLOWED: cond<$cond> "; $allowed = 1; } if ($block =~/\b(?:if|for|while)\b/) { #print "APW: ALLOWED: block<$block> "; $allowed = 1; } if (statement_block_size($block) > 1) { #print "APW: ALLOWED: lines block<$block> "; $allowed = 1; } # Check the post-context. if (defined $chunks[1]) { my ($cond, $block) = @{$chunks[1]}; if (defined $cond) { |
773647a09 update checkpatch... |
2637 |
substr($block, 0, length($cond), ''); |
cf655043d update checkpatch... |
2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 |
} if ($block =~ /^\s*\{/) { #print "APW: ALLOWED: chunk-1 block<$block> "; $allowed = 1; } } if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { my $herectx = $here . " ";; |
f055663c5 checkpatch: repor... |
2648 |
my $cnt = statement_rawlines($block); |
cf655043d update checkpatch... |
2649 |
|
f055663c5 checkpatch: repor... |
2650 2651 2652 |
for (my $n = 0; $n < $cnt; $n++) { $herectx .= raw_line($linenr, $n) . " ";; |
f0a594c1c update checkpatch... |
2653 |
} |
cf655043d update checkpatch... |
2654 2655 2656 |
WARN("braces {} are not necessary for single statement blocks " . $herectx); |
f0a594c1c update checkpatch... |
2657 2658 |
} } |
653d4876b update checkpatch... |
2659 |
# don't include deprecated include files (uses RAW line) |
4a0df2ef4 update checkpatch... |
2660 |
for my $inc (@dep_includes) { |
c45dcabd2 update checkpatch... |
2661 |
if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) { |
de7d4f0e1 update checkpatch... |
2662 2663 |
ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt " . $herecurr); |
0a920b5b6 add a trivial pat... |
2664 2665 |
} } |
4a0df2ef4 update checkpatch... |
2666 2667 |
# don't use deprecated functions for my $func (@dep_functions) { |
00df344fd update checkpatch... |
2668 |
if ($line =~ /\b$func\b/) { |
de7d4f0e1 update checkpatch... |
2669 2670 |
ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt " . $herecurr); |
4a0df2ef4 update checkpatch... |
2671 2672 2673 2674 |
} } # no volatiles please |
6c72ffaab update checkpatch... |
2675 2676 |
my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { |
de7d4f0e1 update checkpatch... |
2677 2678 |
WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt " . $herecurr); |
4a0df2ef4 update checkpatch... |
2679 |
} |
9c0ca6f9a update checkpatch... |
2680 2681 2682 2683 2684 |
# SPIN_LOCK_UNLOCKED & RW_LOCK_UNLOCKED are deprecated if ($line =~ /\b(SPIN_LOCK_UNLOCKED|RW_LOCK_UNLOCKED)/) { ERROR("Use of $1 is deprecated: see Documentation/spinlocks.txt " . $herecurr); } |
00df344fd update checkpatch... |
2685 |
# warn about #if 0 |
c45dcabd2 update checkpatch... |
2686 |
if ($line =~ /^.\s*\#\s*if\s+0\b/) { |
de7d4f0e1 update checkpatch... |
2687 2688 2689 |
CHK("if this code is redundant consider removing it " . $herecurr); |
4a0df2ef4 update checkpatch... |
2690 |
} |
f0a594c1c update checkpatch... |
2691 2692 2693 2694 |
# check for needless kfree() checks if ($prevline =~ /\bif\s*\(([^\)]*)\)/) { my $expr = $1; if ($line =~ /\bkfree\(\Q$expr\E\);/) { |
3c232147a checkpatch: corre... |
2695 2696 |
WARN("kfree(NULL) is safe this check is probably not required " . $hereprev); |
f0a594c1c update checkpatch... |
2697 2698 |
} } |
4c432a8f0 checkpatch: usb_f... |
2699 2700 2701 2702 2703 2704 2705 2706 |
# check for needless usb_free_urb() checks if ($prevline =~ /\bif\s*\(([^\)]*)\)/) { my $expr = $1; if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) { WARN("usb_free_urb(NULL) is safe this check is probably not required " . $hereprev); } } |
f0a594c1c update checkpatch... |
2707 |
|
00df344fd update checkpatch... |
2708 |
# warn about #ifdefs in C files |
c45dcabd2 update checkpatch... |
2709 |
# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { |
00df344fd update checkpatch... |
2710 2711 2712 2713 2714 |
# print "#ifdef in C files should be avoided "; # print "$herecurr"; # $clean = 0; # } |
22f2a2ef9 update checkpatch... |
2715 |
# warn about spacing in #ifdefs |
c45dcabd2 update checkpatch... |
2716 |
if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { |
22f2a2ef9 update checkpatch... |
2717 2718 2719 |
ERROR("exactly one space required after that #$1 " . $herecurr); } |
4a0df2ef4 update checkpatch... |
2720 |
# check for spinlock_t definitions without a comment. |
171ae1a49 update checkpatch... |
2721 2722 |
if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { |
4a0df2ef4 update checkpatch... |
2723 2724 |
my $which = $1; if (!ctx_has_comment($first_line, $linenr)) { |
de7d4f0e1 update checkpatch... |
2725 2726 |
CHK("$1 definition without comment " . $herecurr); |
4a0df2ef4 update checkpatch... |
2727 2728 2729 2730 2731 |
} } # check for memory barriers without a comment. if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { if (!ctx_has_comment($first_line, $linenr)) { |
de7d4f0e1 update checkpatch... |
2732 2733 |
CHK("memory barrier without comment " . $herecurr); |
4a0df2ef4 update checkpatch... |
2734 2735 2736 |
} } # check of hardware specific defines |
c45dcabd2 update checkpatch... |
2737 |
if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { |
de7d4f0e1 update checkpatch... |
2738 2739 |
CHK("architecture specific defines should be avoided " . $herecurr); |
0a920b5b6 add a trivial pat... |
2740 |
} |
653d4876b update checkpatch... |
2741 |
|
d4977c78e checkpatch: warn ... |
2742 2743 2744 2745 2746 |
# Check that the storage class is at the beginning of a declaration if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) { WARN("storage class should be at the beginning of the declaration " . $herecurr) } |
de7d4f0e1 update checkpatch... |
2747 2748 |
# check the location of the inline attribute, that it is between # storage class and type. |
9c0ca6f9a update checkpatch... |
2749 2750 |
if ($line =~ /\b$Type\s+$Inline\b/ || $line =~ /\b$Inline\s+$Storage\b/) { |
de7d4f0e1 update checkpatch... |
2751 2752 2753 |
ERROR("inline keyword should sit between storage class and type " . $herecurr); } |
8905a67c6 update checkpatch... |
2754 2755 2756 2757 2758 |
# Check for __inline__ and __inline, prefer inline if ($line =~ /\b(__inline__|__inline)\b/) { WARN("plain inline is preferred over $1 " . $herecurr); } |
8f53a9b80 scripts/checkpatc... |
2759 2760 2761 2762 2763 |
# check for sizeof(&) if ($line =~ /\bsizeof\s*\(\s*\&/) { WARN("sizeof(& should be avoided " . $herecurr); } |
de7d4f0e1 update checkpatch... |
2764 |
# check for new externs in .c files. |
171ae1a49 update checkpatch... |
2765 |
if ($realfile =~ /\.c$/ && defined $stat && |
c45dcabd2 update checkpatch... |
2766 |
$stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) |
171ae1a49 update checkpatch... |
2767 |
{ |
c45dcabd2 update checkpatch... |
2768 2769 |
my $function_name = $1; my $paren_space = $2; |
171ae1a49 update checkpatch... |
2770 2771 2772 2773 2774 |
my $s = $stat; if (defined $cond) { substr($s, 0, length($cond), ''); } |
c45dcabd2 update checkpatch... |
2775 2776 2777 |
if ($s =~ /^\s*;/ && $function_name ne 'uninitialized_var') { |
171ae1a49 update checkpatch... |
2778 2779 2780 2781 2782 2783 2784 2785 2786 |
WARN("externs should be avoided in .c files " . $herecurr); } if ($paren_space =~ / /) { WARN("arguments for function declarations should follow identifier " . $herecurr); } |
9c9ba34ee update checkpatch... |
2787 2788 2789 2790 2791 2792 |
} elsif ($realfile =~ /\.c$/ && defined $stat && $stat =~ /^.\s*extern\s+/) { WARN("externs should be avoided in .c files " . $herecurr); |
de7d4f0e1 update checkpatch... |
2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 |
} # checks for new __setup's if ($rawline =~ /\b__setup\("([^"]*)"/) { my $name = $1; if (!grep(/$name/, @setup_docs)) { CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt " . $herecurr); } |
653d4876b update checkpatch... |
2803 |
} |
9c0ca6f9a update checkpatch... |
2804 2805 2806 2807 2808 2809 |
# check for pointless casting of kmalloc return if ($line =~ /\*\s*\)\s*k[czm]alloc\b/) { WARN("unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html " . $herecurr); } |
13214adf7 update checkpatch... |
2810 2811 2812 2813 2814 2815 |
# check for gcc specific __FUNCTION__ if ($line =~ /__FUNCTION__/) { WARN("__func__ should be used instead of gcc specific __FUNCTION__ " . $herecurr); } |
773647a09 update checkpatch... |
2816 2817 |
# check for semaphores used as mutexes |
171ae1a49 update checkpatch... |
2818 |
if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) { |
773647a09 update checkpatch... |
2819 2820 2821 2822 |
WARN("mutexes are preferred for single holder semaphores " . $herecurr); } # check for semaphores used as mutexes |
171ae1a49 update checkpatch... |
2823 |
if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) { |
773647a09 update checkpatch... |
2824 2825 |
WARN("consider using a completion " . $herecurr); |
1704f47b5 lockdep: Add nova... |
2826 |
|
773647a09 update checkpatch... |
2827 2828 2829 2830 2831 2832 |
} # recommend strict_strto* over simple_strto* if ($line =~ /\bsimple_(strto.*?)\s*\(/) { WARN("consider using strict_$1 in preference to simple_$1 " . $herecurr); } |
f3db6639f checkpatch: add a... |
2833 2834 2835 2836 2837 |
# check for __initcall(), use device_initcall() explicitly please if ($line =~ /^.\s*__initcall\s*\(/) { WARN("please use device_initcall() instead of __initcall() " . $herecurr); } |
79404849e checkpatch.pl: ex... |
2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 |
# check for various ops structs, ensure they are const. my $struct_ops = qr{acpi_dock_ops| address_space_operations| backlight_ops| block_device_operations| dentry_operations| dev_pm_ops| dma_map_ops| extent_io_ops| file_lock_operations| file_operations| hv_ops| ide_dma_ops| intel_dvo_dev_ops| item_operations| iwl_ops| kgdb_arch| kgdb_io| kset_uevent_ops| lock_manager_operations| microcode_ops| mtrr_ops| neigh_ops| nlmsvc_binding| pci_raw_ops| pipe_buf_operations| platform_hibernation_ops| platform_suspend_ops| proto_ops| rpc_pipe_ops| seq_operations| snd_ac97_build_ops| soc_pcmcia_socket_ops| stacktrace_ops| sysfs_ops| tty_operations| usb_mon_operations| wd_ops}x; |
6903ffb22 checkpatch: struc... |
2876 |
if ($line !~ /\bconst\b/ && |
79404849e checkpatch.pl: ex... |
2877 |
$line =~ /\bstruct\s+($struct_ops)\b/) { |
6903ffb22 checkpatch: struc... |
2878 2879 2880 |
WARN("struct $1 should normally be const " . $herecurr); |
2b6db5cb6 checkpatch: struc... |
2881 |
} |
773647a09 update checkpatch... |
2882 2883 2884 2885 |
# use of NR_CPUS is usually wrong # ignore definitions of NR_CPUS and usage to define arrays as likely right if ($line =~ /\bNR_CPUS\b/ && |
c45dcabd2 update checkpatch... |
2886 2887 |
$line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && |
171ae1a49 update checkpatch... |
2888 2889 2890 |
$line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) |
773647a09 update checkpatch... |
2891 2892 2893 2894 |
{ WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc " . $herecurr); } |
9c9ba34ee update checkpatch... |
2895 2896 2897 2898 2899 |
# check for %L{u,d,i} in strings my $string; while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { $string = substr($rawline, $-[1], $+[1] - $-[1]); |
2a1bc5d5c checkpatch: %Lx t... |
2900 |
$string =~ s/%%/__/g; |
9c9ba34ee update checkpatch... |
2901 2902 2903 2904 2905 2906 |
if ($string =~ /(?<!%)%L[udi]/) { WARN("\%Ld/%Lu are not-standard C, use %lld/%llu " . $herecurr); last; } } |
691d77b6b checkpatch: add c... |
2907 2908 2909 2910 2911 2912 |
# whine mightly about in_atomic if ($line =~ /\bin_atomic\s*\(/) { if ($realfile =~ m@^drivers/@) { ERROR("do not use in_atomic in drivers " . $herecurr); |
f4a877367 checkpatch: make ... |
2913 |
} elsif ($realfile !~ m@^kernel/@) { |
691d77b6b checkpatch: add c... |
2914 2915 2916 2917 |
WARN("use of in_atomic() is incorrect outside core kernel code " . $herecurr); } } |
1704f47b5 lockdep: Add nova... |
2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 |
# check for lockdep_set_novalidate_class if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || $line =~ /__lockdep_no_validate__\s*\)/ ) { if ($realfile !~ m@^kernel/lockdep@ && $realfile !~ m@^include/linux/lockdep@ && $realfile !~ m@^drivers/base/core@) { ERROR("lockdep_no_validate class is reserved for device->mutex. " . $herecurr); } } |
13214adf7 update checkpatch... |
2929 2930 2931 2932 2933 2934 |
} # If we have no input at all, then there is nothing to report on # so just keep quiet. if ($#rawlines == -1) { exit(0); |
0a920b5b6 add a trivial pat... |
2935 |
} |
8905a67c6 update checkpatch... |
2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 |
# In mailback mode only produce a report in the negative, for # things that appear to be patches. if ($mailback && ($clean == 1 || !$is_patch)) { exit(0); } # This is not a patch, and we are are in 'no-patch' mode so # just keep quiet. if (!$chk_patch && !$is_patch) { exit(0); } if (!$is_patch) { |
de7d4f0e1 update checkpatch... |
2949 2950 |
ERROR("Does not appear to be a unified-diff format patch "); |
0a920b5b6 add a trivial pat... |
2951 2952 |
} if ($is_patch && $chk_signoff && $signoff == 0) { |
de7d4f0e1 update checkpatch... |
2953 2954 |
ERROR("Missing Signed-off-by: line(s) "); |
0a920b5b6 add a trivial pat... |
2955 |
} |
8905a67c6 update checkpatch... |
2956 |
print report_dump(); |
13214adf7 update checkpatch... |
2957 2958 |
if ($summary && !($clean == 1 && $quiet == 1)) { print "$filename " if ($summary_file); |
8905a67c6 update checkpatch... |
2959 2960 2961 2962 2963 2964 |
print "total: $cnt_error errors, $cnt_warn warnings, " . (($check)? "$cnt_chk checks, " : "") . "$cnt_lines lines checked "; print " " if ($quiet == 0); |
f0a594c1c update checkpatch... |
2965 |
} |
8905a67c6 update checkpatch... |
2966 |
|
0a920b5b6 add a trivial pat... |
2967 |
if ($clean == 1 && $quiet == 0) { |
c2fdda0df update checkpatch... |
2968 2969 |
print "$vname has no obvious style problems and is ready for submission. " |
0a920b5b6 add a trivial pat... |
2970 2971 |
} if ($clean == 0 && $quiet == 0) { |
c2fdda0df update checkpatch... |
2972 2973 |
print "$vname has style problems, please review. If any of these errors "; |
0a920b5b6 add a trivial pat... |
2974 2975 2976 2977 2978 |
print "are false positives report them to the maintainer, see "; print "CHECKPATCH in MAINTAINERS. "; } |
13214adf7 update checkpatch... |
2979 |
|
0a920b5b6 add a trivial pat... |
2980 2981 |
return $clean; } |