如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)

Posted

技术标签:

【中文标题】如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)【英文标题】:How to check for all errors in a Perl-CGI application (e.g. check with a Perl compiler or lint-like tool, free opensource?) 【发布时间】:2011-06-29 08:32:49 【问题描述】:

我有一个任务关键型 Perl-CGI 服务器端应用程序,我需要不时扩展或增强它。

是否有工具可以检查应用程序的所有执行路径,即所有 Perl 文件、所有函数、所有 if-else、switch-case 等可能性。

作为一种解释性语言,在修改代码期间引入的错误并不总是很明显。如果认为一切正常,如果在进行更改后,Perl 程序在进行一些测试检查后运行正常,则可能会被误导。

综合测试套件可能是一种解决方案,但这始终是程序定制的,并且在时间紧缺时需要额外的时间来实施。

相反,我认为一个有效的工具对于“一揽子”练习/解析/任何执行路径都是通用的,例如检查未声明的变量,更改为函数/子例程名称,例如由于重构等原因。

我有 ActiveState Komodo IDE,它在检测错误方面做得很好,但作为一个商业工具,我并不总是能够在我工作的所有环境中使用它。所以我更喜欢免费和开源的东西。

更新

感谢@Nylon Smile for Perl::Critic - 下面的答案 - 我的 Perl 设置中没有它作为标准,所以当然必须使用 cpan 来尝试安装它:)

我在详细的安装进度中看到了很多成功(见下文),但也有一些失败 :( 以及看起来不太好的“为 Perl-Critic-1.116 退出安装”:(

每当我尝试安装或升级 Perl 模块时,这种情况并不少见。我有 CentOS 5。

这给我留下的印象是维护、配置、升级 Perl 是一件相当麻烦的事情,易碎的、繁琐的,关于你必须做的事情可能是“但你没有”和“如果你”让它工作:)

[root]# cpanm Perl::Critic
--> Working on Perl::Critic
Fetching http://search.cpan.org/CPAN/authors/id/E/EL/ELLIOTJS/Perl-Critic-1.116.tar.gz ... OK
Configuring Perl-Critic-1.116 ... OK
==> Found dependencies: PPI, B::Keywords, PPI::Document, List::MoreUtils, PPIx::Utilities::Statement, PPI::Token::Whitespace,        PPI::Node, Pod::Spell, PPI::Token::Quote::Single, Perl::Tidy, String::Format, PPI::Document::File, Task::Weaken, Module::Plugg       able, IO::String, version, PPIx::Utilities::Node, Readonly, Exporter, Exception::Class, PPIx::Regexp, Config::Tiny, Email::Add       ress, Test::Deep
--> Working on PPI
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/PPI-1.215.tar.gz ... OK
Configuring PPI-1.215 ... OK
==> Found dependencies: File::Remove, Test::Object, Storable, Test::NoWarnings, Params::Util, Test::SubCalls, Task::Weaken, Li       st::MoreUtils, IO::String, Clone, Class::Inspector
--> Working on File::Remove
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/File-Remove-1.49.tar.gz ... OK
Configuring File-Remove-1.49 ... OK
==> Found dependencies: File::Spec, Cwd
--> Working on File::Spec
Fetching http://search.cpan.org/CPAN/authors/id/S/SM/SMUELLER/PathTools-3.33.tar.gz ... OK
Configuring PathTools-3.33 ... OK
Building and testing PathTools-3.33 ... FAIL
! Installing File::Spec failed. See /root/.cpanm/build.log for details.
! Bailing out the installation for File-Remove-1.49. Retry with --prompt or --force.
--> Working on Test::Object
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Test-Object-0.07.tar.gz ... OK
Configuring Test-Object-0.07 ... OK
Building and testing Test-Object-0.07 ... OK
Successfully installed Test-Object-0.07
--> Working on Storable
Fetching http://search.cpan.org/CPAN/authors/id/A/AM/AMS/Storable-2.25.tar.gz ... OK
Configuring Storable-2.25 ... OK
Building and testing Storable-2.25 ... FAIL
! Installing Storable failed. See /root/.cpanm/build.log for details.
--> Working on Test::NoWarnings
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Test-NoWarnings-1.02.tar.gz ... OK
Configuring Test-NoWarnings-1.02 ... OK
==> Found dependencies: Test::Tester
--> Working on Test::Tester
Fetching http://search.cpan.org/CPAN/authors/id/F/FD/FDALY/Test-Tester-0.107.tar.gz ... OK
Configuring Test-Tester-0.107 ... OK
Building and testing Test-Tester-0.107 ... OK
Successfully installed Test-Tester-0.107
Building and testing Test-NoWarnings-1.02 ... OK
Successfully installed Test-NoWarnings-1.02
--> Working on Params::Util
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Params-Util-1.04.tar.gz ... OK
Configuring Params-Util-1.04 ... OK
Building and testing Params-Util-1.04 ... OK
Successfully installed Params-Util-1.04
--> Working on Test::SubCalls
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Test-SubCalls-1.09.tar.gz ... OK
Configuring Test-SubCalls-1.09 ... OK
==> Found dependencies: Hook::LexWrap
--> Working on Hook::LexWrap
Fetching http://search.cpan.org/CPAN/authors/id/C/CH/CHORNY/Hook-LexWrap-0.24.tar.gz ... OK
Configuring Hook-LexWrap-0.24 ... OK
Building and testing Hook-LexWrap-0.24 ... OK
Successfully installed Hook-LexWrap-0.24
Building and testing Test-SubCalls-1.09 ... OK
Successfully installed Test-SubCalls-1.09
--> Working on Task::Weaken
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Task-Weaken-1.04.tar.gz ... OK
Configuring Task-Weaken-1.04 ... OK
Building and testing Task-Weaken-1.04 ... OK
Successfully installed Task-Weaken-1.04
--> Working on List::MoreUtils
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/List-MoreUtils-0.32.tar.gz ... OK
Configuring List-MoreUtils-0.32 ... OK
Building and testing List-MoreUtils-0.32 ... FAIL
! Installing List::MoreUtils failed. See /root/.cpanm/build.log for details.
--> Working on IO::String
Fetching http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/IO-String-1.08.tar.gz ... OK
Configuring IO-String-1.08 ... OK
Building and testing IO-String-1.08 ... OK
Successfully installed IO-String-1.08
--> Working on Clone
Fetching http://search.cpan.org/CPAN/authors/id/R/RD/RDF/Clone-0.31.tar.gz ... OK
Configuring Clone-0.31 ... OK
Building and testing Clone-0.31 ... FAIL
! Installing Clone failed. See /root/.cpanm/build.log for details.
--> Working on Class::Inspector
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Class-Inspector-1.25.tar.gz ... OK
Configuring Class-Inspector-1.25 ... OK
Building and testing Class-Inspector-1.25 ... OK
Successfully installed Class-Inspector-1.25
! Bailing out the installation for PPI-1.215. Retry with --prompt or --force.
--> Working on B::Keywords
Fetching http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/B-Keywords-1.10.tar.gz ... OK
Configuring B-Keywords-1.10 ... OK
Building and testing B-Keywords-1.10 ... OK
Successfully installed B-Keywords-1.10
--> Working on PPIx::Utilities::Statement
Fetching http://search.cpan.org/CPAN/authors/id/E/EL/ELLIOTJS/PPIx-Utilities-1.001000.tar.gz ... OK
Configuring PPIx-Utilities-1.001000 ... OK
==> Found dependencies: PPI, Readonly, Exception::Class, PPI::Document::Fragment, PPI::Dumper, PPI::Document, Test::Deep
--> Working on Readonly
Fetching http://search.cpan.org/CPAN/authors/id/R/RO/ROODE/Readonly-1.03.tar.gz ... OK
Configuring Readonly-1.03 ... OK
Building and testing Readonly-1.03 ... OK
Successfully installed Readonly-1.03
--> Working on Exception::Class
Fetching http://search.cpan.org/CPAN/authors/id/D/DR/DROLSKY/Exception-Class-1.32.tar.gz ... OK
Configuring Exception-Class-1.32 ... OK
==> Found dependencies: Devel::StackTrace, Class::Data::Inheritable
--> Working on Devel::StackTrace
Fetching http://search.cpan.org/CPAN/authors/id/D/DR/DROLSKY/Devel-StackTrace-1.27.tar.gz ... OK
Configuring Devel-StackTrace-1.27 ... OK
Building and testing Devel-StackTrace-1.27 ... OK
Successfully installed Devel-StackTrace-1.27
--> Working on Class::Data::Inheritable
Fetching http://search.cpan.org/CPAN/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.08.tar.gz ... OK
Configuring Class-Data-Inheritable-0.08 ... OK
Building and testing Class-Data-Inheritable-0.08 ... OK
Successfully installed Class-Data-Inheritable-0.08
Building and testing Exception-Class-1.32 ... OK
Successfully installed Exception-Class-1.32
--> Working on Test::Deep
Fetching http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Test-Deep-0.108.tar.gz ... OK
Configuring Test-Deep-0.108 ... OK
Building and testing Test-Deep-0.108 ... OK
Successfully installed Test-Deep-0.108
Building and testing PPIx-Utilities-1.001000 ... FAIL
! Installing PPIx::Utilities::Statement failed. See /root/.cpanm/build.log for details.
--> Working on Pod::Spell
Fetching http://search.cpan.org/CPAN/authors/id/S/SB/SBURKE/Pod-Spell-1.01.tar.gz ... OK
Configuring Pod-Spell-1.01 ... OK
Building and testing Pod-Spell-1.01 ... OK
Successfully installed Pod-Spell-1.01
--> Working on Perl::Tidy
Fetching http://search.cpan.org/CPAN/authors/id/S/SH/SHANCOCK/Perl-Tidy-20101217.tar.gz ... OK
Configuring Perl-Tidy-20101217 ... OK
Building and testing Perl-Tidy-20101217 ... OK
Successfully installed Perl-Tidy-20101217
--> Working on String::Format
Fetching http://search.cpan.org/CPAN/authors/id/D/DA/DARREN/String-Format-1.16.tar.gz ... OK
Configuring String-Format-1.16 ... OK
Building and testing String-Format-1.16 ... OK
Successfully installed String-Format-1.16
--> Working on Module::Pluggable
Fetching http://search.cpan.org/CPAN/authors/id/S/SI/SIMONW/Module-Pluggable-3.9.tar.gz ... OK
Configuring Module-Pluggable-3.9 ... OK
Building and testing Module-Pluggable-3.9 ... OK
Successfully installed Module-Pluggable-3.9
--> Working on version
Fetching http://search.cpan.org/CPAN/authors/id/J/JP/JPEACOCK/version-0.91.tar.gz ... OK
Configuring version-0.91 ... OK
Building and testing version-0.91 ... OK
Successfully installed version-0.91
--> Working on Exporter
Fetching http://search.cpan.org/CPAN/authors/id/F/FE/FERREIRA/Exporter-5.63.tar.gz ... OK
Configuring Exporter-5.63 ... OK
Building and testing Exporter-5.63 ... OK
Successfully installed Exporter-5.63 (upgraded from 5.58)
--> Working on PPIx::Regexp
Fetching http://search.cpan.org/CPAN/authors/id/W/WY/WYANT/PPIx-Regexp-0.020.tar.gz ... OK
Configuring PPIx-Regexp-0.020 ... OK
==> Found dependencies: PPI::Document, List::MoreUtils
Building and testing PPIx-Regexp-0.020 ... FAIL
! Installing PPIx::Regexp failed. See /root/.cpanm/build.log for details.
--> Working on Config::Tiny
Fetching http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Config-Tiny-2.14.tar.gz ... OK
Configuring Config-Tiny-2.14 ... OK
Building and testing Config-Tiny-2.14 ... OK
Successfully installed Config-Tiny-2.14
--> Working on Email::Address
Fetching http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Email-Address-1.892.tar.gz ... OK
Configuring Email-Address-1.892 ... OK
Building and testing Email-Address-1.892 ... OK
Successfully installed Email-Address-1.892
! Bailing out the installation for Perl-Critic-1.116. Retry with --prompt or --force.
23 distributions installed
[root]#

更新 2

有一个 Perl 到 C 编译器,所以大概这将不得不检查所有执行路径以生成 C 代码,或者至少如果没有,错误的 C 代码可以通过一个 C 编译器来解决问题:

How can I convert Perl to C? Why Not Translate Perl to C? CPAN -perlcc - generate executables from Perl programs

【问题讨论】:

如果我什至可以在 Windows 上安装它,它应该安装在 CentOS 上。 ;-)(您的更新最好在新问题中提出。) +1 @Qtax 感谢您的鼓励建议。我可能会接受你提出单独问题的建议。 您对安装的批评是不合理的概括,缺乏实际建设性的细节!你可以安装RPM。 +1 感谢 daxim,我将研究使用 RPM 而不是通过 cpan。大声思考,因为我有 CentOS,RedHat 是相关的,对吧?所以,红帽包管理器作为一个路由是可行的。我的批评当然不科学,诚然,它是轶事,但基于尝试安装 Perl 模块的几集经验,包括升级 bugzilla,由于某些明显晦涩的原因无法安装图形模块,因此并非所有这些都有效,当时间稀缺时,不喜欢收到大量冗长的输出。 我会在今天/明天晚些时候回来,并更新我的经验。到目前为止,非常感谢大家的贡献。 【参考方案1】:

Perl::Critic (perlcritic.com) 将为您完成一些工作。该模块对您的源代码进行静态分析。它基于《Perl Best Practices》一书,会发现一些错误,并会参考书的页码给你很多关于样式的建议。

【讨论】:

+1 可能会接受这个答案,我会让它打开一段时间。谢谢你。 《Perl 最佳实践》一书的详细信息位于:oreilly.com/catalog/9780596001735 接受了答案,因为这就像我要求的类似 lint 的工具,而且它确实分析了代码。它似乎得到了很好的认可和支持,一本书是 O'Reilly 的书,它确实传达了良好的声誉,并暗示它是一个被广泛采用的标准,足以进入一本书。 Test::LectroTest 和 Devel::Cover 在这里的其他答案中也值得考虑。【参考方案2】:

我认为,如果您首先增强设计,您将获得最大的效果。

您可以尽可能防御性地编写代码,例如:

尽可能静态编码,以便与 Perl::Critic 和编译器等工具配合使用。这可以在编译时检测错误。

“Perl Best Practices”和“Perl Hacks”两本书(均来自 O'Reilly)有一些技巧可以将代码部分从运行时检查转移到编译时检查。

如果您无法避免动态生成的代码,那么没有什么可以替代好的测试套件。我更喜欢一些手动编写的测试以及来自Test::LectroTest 的自动生成的测试。 Devel::Cover 将帮助您了解测试覆盖率。

我不知道有什么工具可以像您要​​求的那样,但是这种工具的运行时间很容易让人无法接受。所有可能的代码路径的组合通常太多而不实用。

【讨论】:

我认为我的代码根本不是动态的。从过去的经验来看,即使未执行的代码中存在错误,程序也可以运行——解释语言的问题。我想在部署之前确保所有代码都正常。 +1 for Test::LectroTest 和 Devel::Cover - 一些想法 - 可能是解决方案的一部分。【参考方案3】: 1234563虽然它不做任何代码路径分析。

对于代码路径部分,我不知道有什么会自动为所有执行路径生成测试,但Devel::Cover 将提供代码覆盖率指标来帮助确定您自己编写的测试是否是缺少任何执行路径。

【讨论】:

是的,我已经使用了严格和警告,并且同意这不会检查未执行的代码。我会尝试 Devel::Cover 但如果我必须安装它,我不会抱太大希望,请参阅我对 Perl::Critic 的更新 - 安装 Perl 模块似乎很痛苦,坦率地说,不应该成为一种美德复杂性。 @Rob:不幸的是,该输出没有显示失败的原因,所以我不能说问题可能是什么,但是,是的,设置 CPAN 可能会很痛苦.但是,一旦配置完成,它通常工作得非常好并且使用起来非常简单。但是,另一种选择是检查您的发行版是否具有可用模块的打包版本。我知道 Debian 打包了大部分/所有主要的 CPAN 模块,但我不能说 CentOS 是否也是如此。 +1 for Devel::Cover- 可能是解决方案的一部分。也感谢您的理解和时间考虑我的 CPAN 问题。

以上是关于如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 的 logging 模块记录所有异常和错误

如何修复 Flutter 中的“正在检查 Dart SDK 版本... << 此时出乎意料”错误?

如何修复颤振中的“未处理的异常:用于空值的空检查运算符”错误?

如何检查所有弹簧占位符是不是存在?

SQL Server 2008 r2:如何检查所有视图的运行时错误?

我的所有变量的运行时检查失败 #2 错误