13

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

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

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

诚然,即使可以找出智能链接器正在消除什么,它的剔除也可能非常保守。

4

8 回答 8

5

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

我相信,这发生在程序层面。我不知道如何在较粗略的水平上确定这一点。

替代文字

于 2010-11-19T16:29:56.240 回答
4

该线程讨论了删​​除未使用的单元,并讨论了 Icarus Pascal Analyzer 之类的工具。该工具将满足您的所有需求,甚至更多。 如何“自动”从使用条款中删除未使用的单位?

于 2010-11-19T16:51:59.613 回答
2

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

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

于 2010-11-19T19:04:38.900 回答
2

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

Delphi 的免费(开源)代码覆盖工具可在此处获得。运行它后,检查报告中的红线,这些是尚未到达的线。

Delphi Code Coverage 是一个简单的 Delphi 代码覆盖工具,它可以根据详细的 MAP 文件创建代码覆盖率报告。

对于每个单元,都会有一个 unit.html 包含覆盖范围的摘要,然后是标记的源。绿线被覆盖。红线不是覆盖线。其他行没有为其生成代码。还有一个 CodeCoverage_summary.html 文件,它总结了覆盖率并具有指向生成的单元报告的链接。

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

于 2010-11-19T18:53:04.267 回答
0

过去,我使用“生成汇编器”功能使用 Free Pascal 编译源代码,然后制作了一些在源代码上运行的简单过滤程序。(因为这一位有助于了解智能链接是使用链接器“节”粒度完成的)

它有时会让您了解为什么某些事物没有被智能链接出来(例如,因为某些表中的引用可能会被初始化中的某些内容访问)

当然 Delphi 不是 FPC,但是当您有提示要查找什么时,只需在 Delphi 编译后查看边缘中的点,看看它是否是 smartlinked。同样,如果您想知道为什么某些代码已(未)被智能链接出来,分析一个用 FPC 编译为汇编器的小示例程序可以使原因显而易见。(例如,您会找到引用它的 RTTI 表)

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

于 2010-11-19T20:00:17.053 回答
0

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

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

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

于 2010-11-19T18:26:49.300 回答
0

查看http://www.peganza.com/上的工具以帮助您完成一些任务。

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

Pascal Analyzer 是包含 Icarus 功能和大量其他工具的完整版本。

于 2010-11-19T17:52:26.583 回答
0

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

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

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

于 2010-11-19T19:54:05.410 回答