当前位置: 首页 > 知识库问答 >
问题:

我怎么能抽出未定义的子程序?

益源
2023-03-14

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

例如:

use strict;
use warnings;

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

>

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

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

strictwarningspragmas在这里没有帮助<代码>使用严格的“subs”无效。

甚至下面的代码片段也是无声的

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

共有3个答案

江宏放
2023-03-14

要查找对未在编译时定义的sub的调用,可以使用B::Lint,如下所示:

a.pl

use List::Util qw( min );

sub defined_sub { }
sub defined_later;
sub undefined_sub;

defined_sub();
defined_later();
undefined_sub();
undeclared_sub();
min();
max();              # XXX Didn't import
List::Util::max();
List::Util::mac();  # XXX Typo!

sub defined_later { }

测试:

$ perl -MO=Lint,undefined-subs a.pl
Undefined subroutine 'undefined_sub' called at a.pl line 9
Nonexistent subroutine 'undeclared_sub' called at a.pl line 10
Nonexistent subroutine 'max' called at a.pl line 12
Nonexistent subroutine 'List::Util::mac' called at a.pl line 14
a.pl syntax OK

请注意,这只是子呼叫。方法调用(如Class-

请注意,foo$x是一个有效的方法调用(使用间接方法调用语法),意思是$x-

宗安翔
2023-03-14

你所要求的至少在某种意义上是不可能的。考虑下面的代码片段:

( rand()<0.5 ? *foo : *bar } = sub { say "Hello World!" };

foo();

有50%的可能性,这将运行正常,和50%的可能性,它将给出一个"未定义的子程序"错误。这个决定是在运行时做出的,所以在此之前不可能知道它会是什么。这当然是一个人为的例子来证明一个观点,但是运行时(或编译时)子程序的生成在实际代码中并不少见。例如,看看Moose如何添加创建方法的函数。静态源代码分析永远无法完全分析这样的代码。

B::Lint可能是运行前所能得到的最好的东西。

江阳夏
2023-03-14

Perl::Critic中的子例程::ProhibitCallsToUndeclaredSubs策略可能会有所帮助

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

此“策略”是需要安装的Perl::Critic::StricterSubs的一部分。那里还有一些政策。这被认为是严重违反,所以你可以做

perlcritic -4 script.pl

并为既未声明也未显式导入的解析输出,或使用

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

一些合法的使用仍然被标记,因为它要求显式导入所有sub。

这是一个静态分析器,我认为应该适合你的用途。

 类似资料:
  • null null null null 库atmi是用C编写的,能够通过使用包装器调用一些C++实例方法: } 此库调用的包装在另一个名为MSI的库中定义。包装在C++源文件中定义(msischeduler.cpp: 头文件(msischeduler.h)包含以下片段: null 仅供参考,所有东西都在AIX OS上编译和链接良好(使用xlc,xlc命令)。 我还尝试更改Librariries的链

  • 我的示例显示,我试图向匿名类添加一些额外的方法,通常我如何调用我创建的额外方法。

  • 请分享有关该主题的一些最佳实践。 情况:我们有产品在虚拟机中运行。在我们的产品中,我们有多个项目,它们正在使用我们的库。 任务:需要自动更新相应从属项目中已更改库项目的版本。 示例:库pom.xml文件的更改将触发使用库的依赖项目的更改。 措施:调查web挂钩、git挂钩、maven bom(这一个有利于集中库) 结果:这种解决方案对我们不起作用。 P. S.目前正在考虑拥有一个节点js脚本,该脚

  • 假设我有一些数据如下: 等等 firebase中的数据显然不是按投票排序的,而是按键排序的。 我希望能够按投票数降序排列这些数据。 我想我必须这样做: 或者,我需要使用limitToLast和endAt? 通过分页很容易,但这个难倒了我。 更新(2017年10月16日):Firebase最近宣布Firestore-其完全管理的NoSQL数据存储,这将使执行更复杂的查询更容易。可能仍有一些用例可以使

  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • 问题内容: 我正在为自己的目的创建Electron应用程序。我的问题是,当我在HTML页面中使用节点函数时,它引发以下错误: 未定义’require()’。 有没有办法在我所有的HTML页面中使用Node功能?如果可能的话,请给我举个例子,或者提供一个链接。以下是我要在HTML页面中尝试使用的变量: 这些是我在Electron的所有HTML窗口中使用的值。 问题答案: 从版本5开始,默认值从tru