如何抽出未定义的子程序?

Zai*_*aid 18 perl subroutine

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

举个例子:

use strict;
use warnings;

my $flag = 0;
if ( $flag ) {
  undefined_sub();
}
Run Code Online (Sandbox Code Playgroud)

意见

  • $flag计算结果为true时,将发出以下警告:

    Undefined subroutine &main::undefined_sub called at - line 6
    
    Run Code Online (Sandbox Code Playgroud)

    我不想依赖于在运行时发出的警告来识别未定义的子例程

  • strictwarnings编译指示不帮助这里.use strict 'subs'没有效果.

  • 甚至以下代码片段也是静默的

    $ perl -Mstrict -we 'exit 0; undefined_sub()'
    
    Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 13

也许来自Perl :: Critic的Subroutines :: ProhibitCallsToUndeclaredSubs政策可以提供帮助

此策略检查每个非限定子例程调用在当前文件中是否具有匹配的子例程声明,或者它是否明确显示在其中一个包含模块的导入列表中.

这个"策略"是Perl :: Critic :: StricterSubs的一部分,需要安装.那里还有一些政策.这被视为严重性4违规,因此您可以这样做

perlcritic -4 script.pl
Run Code Online (Sandbox Code Playgroud)

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

perlcritic -4 --single-policy ProhibitCallsToUndeclaredSubs script.pl
Run Code Online (Sandbox Code Playgroud)

一些合法用途仍然被标记,因为它要求显式导入所有子.

这是一个静态分析仪,我认为应该符合您的目的.