我想扫描一个代码库,以识别当前无法访问的所有未定义子例程实例。

举个例子:

use strict;
use warnings;

my $flag = 0;
if ( $flag ) {
  undefined_sub();
}


观察结果


$flag评估为true时,发出以下警告:

Undefined subroutine &main::undefined_sub called at - line 6


我不想依靠运行时发出的警告来识别未定义的子例程
strictwarnings编译指示在这里没有帮助。 use strict 'subs'无效。
甚至下面的代码片段都是静默的

$ perl -Mstrict -we 'exit 0; undefined_sub()'

最佳答案

也许Subroutines::ProhibitCallsToUndeclaredSubs中的Perl::Critic策略可以帮助您


该策略检查每个不合格的子例程调用在当前文件中是否具有匹配的子例程声明,或者是否明确将其显示在包含模块之一的导入列表中。


此“策略”是Perl::Critic::StricterSubs的一部分,需要安装。那里还有其他一些政策。这被认为是严重性4违规,因此您可以执行

perlcritic -4 script.pl


并为neither declared nor explicitly imported解析输出,或使用

perlcritic -4 --single-policy ProhibitCallsToUndeclaredSubs script.pl


某些合法用途仍被标记,因为它要求所有子程序都显式导入。

这是一台静态分析仪,我认为它应该适合您的目的。

关于perl - 如何清除未定义的子例程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41428150/

10-12 00:45