在Delphi中查找未使用的(又名“死”)代码

时间:2010-11-19 16:18:46

标签: delphi dead-code

是否有任何工具可以确定是否使用了函数/过程/方法/整个类?

我见过的工具可以帮助知识渊博的开发人员追踪未使用的代码片段(大多数用于Delphi以外的语言),但大多数都有陡峭的学习曲线和/或需要大量挖掘才能确定是否使用了代码片段或不。

Delphi的智能链接器据称可以减少最终可执行文件的大小。不幸的是,在智能链接器上给出的信息很少并不表示检索从hurd中剔除的内容的方法。

不可否认,即使有可能找出智能链接器正在消除的内容,它的剔除也可能非常保守。

8 个答案:

答案 0 :(得分:5)

虽然笨拙而不是全局,但您可以检查边距中点的源代码,如下所示。这些是可以设置断点的行,因为代码没有消除死码。

我相信,在程序层面会发生这种情况。我不知道如何在较低的水平上确定这一点。

alt text

答案 1 :(得分:4)

该主题讨论了删除未使用的单元,并讨论了像Icarus Pascal Analyzer这样的工具。该工具将满足您的所有需求。 How to "automatically" remove unused units from uses clause?

答案 2 :(得分:2)

您可以使用Code Coverage工具查找未使用的代码。只需运行应用程序并手动执行所有部件。代码覆盖率报告将显示未触及的部分。 (在单元测试上运行该工具没有用,因为未使用的代码仍然可以进行单元测试。)

Delphi的免费(开源)代码覆盖率工具here。运行后,检查报告中的红线,这些是尚未到达的行。

  

Delphi Code Coverage是一个简单的代码   创建的Delphi覆盖工具   代码覆盖率报告基于   详细的MAP文件。

     

每个单位都有一个   unit.html的摘要   覆盖范围,其次是来源   标记了。绿线被覆盖。   红线没有被覆盖的线条。该   其他行没有生成代码   为了它。还有一个   CodeCoverage_summary.html文件   总结了覆盖范围并有链接   到生成的单位报告。

也许作者可以在将来的版本中添加“搜索死代码”功能。

答案 3 :(得分:2)

您还可以查看最常用的商业分析器/覆盖工具,来自http://www.automatedqa.com的AQTime

以下是有关功能的视频:http://www.automatedqa.com/products/aqtime/screencasts/coverage-profiling/

答案 4 :(得分:0)

查看http://www.peganza.com/处的工具,以帮助完成部分任务。

Icarus是免费软件,它会分析您的“使用”条款,以便您删除未使用的引用。

Pascal Analyzer是完整版,包括Icarus功能和大量其他工具。

答案 5 :(得分:0)

也许CodeHealer可以帮助您处理未使用的代码

  

CodeHealer深入执行   分析源代码,寻找   以下方面的问题:

     

审核:质量控制规则,例如未使用或无法访问的代码,使用   Delphi指令名称和关键字为   标识符,隐藏其他标识符   在更高的范围内同名   和更多。   检查:潜在错误,例如未初始化或未引用   标识符,危险类型铸件,   自动类型转换,未定义   函数返回值,未使用   分配的值等等。   指标:量化代码属性,例如圈数   复杂性,对象之间的耦合   (数据抽象耦合),评论   比率,班级数,线数   代码等等。

答案 6 :(得分:0)

对于单位,请使用Pascal Analyzer。您可能需要多次使用它。

对于在类工厂中注册的对象/类(等),您需要手动进行双重检查,因为它们将被完全编译。原因是编译器不知道您是否实际是否使用它们。

对于方法,您需要检查蓝点。不太实际,所以还有另一种方式(从我在调查同一主题时被告知)。您需要在启用详细地图文件的情况下执行完整构建。完成后,您需要比较源以查看映射文件中是否有条目。如果没有,那么代码不会被编译 - 可能是死代码(可能因​​为如果它是组件,那么可能是你不使用该功能)。

答案 7 :(得分:0)

过去我使用“生成汇编程序”功能编译Free Pascal源代码,然后制作一些在源代码上运行的简单过滤程序。 (对于这一位,知道使用链接器“section”粒度完成smartlinking很有用)

它有时会为您提供有关某些内容未被智能链接的见解(例如,因为某些表中存在可能在初始化中被某些内容访问)

当然Delphi不是FPC,但是当您提示要查找的内容时,需要在Delphi编译后查看边距中的点以查看它是否为smartlinked。同样,如果你想知道为什么某些代码已经(没有)被智能链接,那么分析一个用FPC编译成汇编程序的小例子程序就可以明白这个原因。 (例如,您找到带有对它的引用的RTTI表)

FPC路线允许系统路线搜索候选人进行此类测试。