mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
checkpatch: warn on macros with flow control statements
Macros with flow control statements (goto and return) are not very nice to read as any flow movement is unexpected. Try to highlight them and emit a warning on their definition. Avoid warning on macros that use argument concatenation as those macros commonly create another function where the concatenation is used in the function name definition like: #define FOO_FUNC(name, rtn_type) \ rtn_type func##name(arg1, ...) \ { \ rtn_type rtn; \ [code...] \ return rtn; \ } Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d2207ccbc5
commit
08a2843e77
@ -4066,12 +4066,17 @@ sub process {
|
||||
my $cnt = $realcnt;
|
||||
my ($off, $dstat, $dcond, $rest);
|
||||
my $ctx = '';
|
||||
my $has_flow_statement = 0;
|
||||
my $has_arg_concat = 0;
|
||||
($dstat, $dcond, $ln, $cnt, $off) =
|
||||
ctx_statement_block($linenr, $realcnt, 0);
|
||||
$ctx = $dstat;
|
||||
#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
|
||||
#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
|
||||
|
||||
$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
|
||||
$has_arg_concat = 1 if ($ctx =~ /\#\#/);
|
||||
|
||||
$dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
|
||||
$dstat =~ s/$;//g;
|
||||
$dstat =~ s/\\\n.//g;
|
||||
@ -4136,6 +4141,19 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# check for macros with flow control, but without ## concatenation
|
||||
# ## concatenation is commonly a macro that defines a function so ignore those
|
||||
if ($has_flow_statement && !$has_arg_concat) {
|
||||
my $herectx = $here . "\n";
|
||||
my $cnt = statement_rawlines($ctx);
|
||||
|
||||
for (my $n = 0; $n < $cnt; $n++) {
|
||||
$herectx .= raw_line($linenr, $n) . "\n";
|
||||
}
|
||||
WARN("MACRO_WITH_FLOW_CONTROL",
|
||||
"Macros with flow control statements should be avoided\n" . "$herectx");
|
||||
}
|
||||
|
||||
# check for line continuations outside of #defines, preprocessor #, and asm
|
||||
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user