NAME
Perl::Critic::Policy::Community::EmptyReturn - Don't use return with no arguments
DESCRIPTION
Context-sensitive functions, while one way to write functions that DWIM (Do What I Mean), tend to instead lead to unexpected behavior when the function is accidentally used in a different context, especially if the function's behavior changes significantly based on context. This also can lead to vulnerabilities when a function is intended to be used as a scalar, but is used in a list, such as a hash constructor or function parameter list. return
with no arguments will return either undef
or an empty list depending on context. Instead, return the appropriate value explicitly.
return; # not ok
return (); # ok
return undef; # ok
sub get_stuff {
return unless @things;
return join(' ', @things);
}
my %stuff = (
one => 1,
two => get_stuff(), # oops! function returns empty list if @things is empty
three => 3,
);
Empty returns are permitted by this policy if the subroutine contains no explicit return values, indicating it is intended to be used in void context.
CAVEATS
This policy currently only checks return statements in named subroutines, anonymous subroutines are not checked. Also, return statements within blocks, other than compound statements like if
and foreach
, are not considered when determining if a function is intended to be used in void context.
Any non-empty return will cause empty returns within the same subroutine to report violations, even though in list context, return
and return ()
are functionally equivalent. It is recommended to explicitly specify an empty list return with return ()
in a function that intends to return list context.
AFFILIATION
This policy is part of Perl::Critic::Community.
CONFIGURATION
This policy is not configurable except for the standard options.
AUTHOR
Dan Book, dbook@cpan.org
COPYRIGHT AND LICENSE
Copyright 2015, Dan Book.
This library is free software; you may redistribute it and/or modify it under the terms of the Artistic License version 2.0.