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; \ } Change-Id: I8eb96e09a088a16d219a082de5ef9575060e367a 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> Git-commit: 08a2843e77fc581d204c1e83de4678b746cdbd6e Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org>
This commit is contained in:
parent
0ec9c96ac1
commit
dc6e2c6d06
|
@ -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