我如何知道代码中的哪些部分从未被使用过?

2023-11-26

我有遗留的 C++ 代码,我应该从中删除未使用的代码。问题是代码库很大。

我如何找出哪些代码从未被调用/从未使用过?


未使用的代码有两种:

  • 本地的,也就是说,在某些函数中,某些路径或变量未使用(或使用但没有任何意义,例如已写入但从未读取)
  • 全局对象:从未被调用的函数、从未被访问的全局对象

对于第一种情况,一个好的编译器可以提供帮助:

  • -Wunused (GCC, Clang)应该警告未使用的变量,Clang 未使用的分析器甚至已增加以警告从未读取(即使使用)的变量。
  • -Wunreachable-code(旧海湾合作委员会,2010年删除) 应警告从未访问过的本地块(这种情况发生在早期返回或始终评估为 true 的条件时)
  • 据我所知,没有选项可以警告未使用的情况catch块,因为编译器通常无法证明不会抛出异常。

对于第二种,就困难得多。静态地,它需要整个程序分析,即使链接时优化实际上可以删除死代码,但实际上程序在执行时已经发生了很大的变化,几乎不可能向用户传达有意义的信息。

因此有两种方法:

  • 理论上是使用静态分析器。一款可以立即详细检查整个代码并找到所有流程路径的软件。实际上,我不知道有什么可以在这里工作。
  • 务实的方法是使用启发式方法:使用代码覆盖率工具(在 GNU 链中,它是gcov。请注意,应在编译期间传递特定标志才能使其正常工作)。您使用一组良好的不同输入(您的单元测试或非回归测试)运行代码覆盖工具,死代码必然位于未到达的代码中......因此您可以从这里开始。

如果您对这个主题非常感兴趣,并且有时间和意愿自己实际开发一个工具,我建议使用 Clang 库来构建这样一个工具。

  1. 使用Clang库获取AST(抽象语法树)
  2. 从入口点开始执行标记和清除分析

因为 Clang 会为您解析代码,并执行重载解析,所以您不必处理 C++ 语言规则,并且您将能够专注于手头的问题。

然而,这种技术无法识别未使用的虚拟覆盖,因为它们可能被您无法推理的第三方代码调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何知道代码中的哪些部分从未被使用过? 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • 使用 ISO 8601:2004 表示秒的小数部分

    以下是IS0 8601 2004标准的定义 它说秒的小数部分可以用一到六位数字表示 我可以使用全部 6 位数字来表示秒的小数部分吗 如果我使用 6 位数字来表示秒的一小部分 以下表示法是否正确 1毫秒 00100010ms 01000010
  • TensorArray 和 while_loop 在张量流中如何协同工作?

    我正在尝试为 TensorArray 和 while loop 的组合生成一个非常简单的示例 1000 sequence in the length of 100 matrix tf placeholder tf int32 shape 1
  • sqlQuery:无法将 ID 号作为字符获取到 R 中?

    我正在使用RODBC包内的 ORACLE 数据库 DB 一切都做得很好 但我需要从这个数据库获取一个表和一些字符类型的变量 而不是数字 所以 我的查询是这样的 e ManzResul VIII lt sqlQuery con select
  • 将函数分配给变量

    假设我有一个函数 def x print 20 现在我想将该函数分配给一个名为的变量y 这样如果我使用y它调用该函数x再次 如果我只是做作业y x 它返回None 您根本不调用该函数 gt gt gt def x gt gt gt prin
  • 当使用带有“overflow:hidden”的容器时,scroll-margin-top属性不起作用[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的 css 属性有问题scroll margin top 滚动到页面上的元素时添加偏移量 它并不适用于所有情况 特别是这种情况 当元素具有scroll margin top在一个容器
  • 在 Tensorflow 中保存和恢复经过训练的 LSTM

    我使用 BasicLSTMCell 训练了 LSTM 分类器 如何保存我的模型并恢复它以便在以后的分类中使用 我们发现了同样的问题 我们不确定内部变量是否已保存 我们发现您必须在创建 定义 BasicLSTMCell 之后创建保护程序 否则
  • 网络上的 Java 文件锁定

    这可能与之前的帖子类似 但我想具体说明在网络上而不是本地上使用锁定 我想将文件写入共享位置 因此它很可能位于网络上 当然是 Windows 网络 也可能是 Mac 我想防止其他人在写入该文件时读取该文件的任何部分 这不会是一个高度并发的进程
  • R 函数 Sink 不会将消息或警告重定向到文件

    我希望将 stderr 和 stdout 消息重定向到输出文件 这是我尝试过的 sink outputFile type c output message print using print cat using cat n message
  • laravel 按日期对数组进行排序

    你好朋友我有一个数组 如下所示 array 3 0 gt array 6 date gt 2016 05 31 15 08 33 0 gt 31 May 16 1 gt aze 2 gt 2 3 gt hi 4 gt 48784146470
  • 使用一条命令将多个包推送到私有 nuget (VSTS)

    我正在尝试一次将多个 nuget 包推送到私有 VSTS nuget 服务器 我搜索了 doco 但找不到批量 Push 命令 我正在使用下面的命令 该命令似乎会覆盖 VSTS 上现有的 nuget 包 nuget push mynuget
  • 当下拉关闭时,垫选择单击外部不起作用

    我已经使用 Mat select 角度组件制作了下拉菜单 当我单击下拉菜单外部 页面主体 时 我需要触发一个事件
  • 如何从长纪元时间(以毫秒为单位)创建 Java 8 LocalDate?

    我有一个外部 API 它返回的日期为longs 表示为自纪元开始以来的毫秒数 使用旧式 Java API 我只需构造一个Date从它与 Date myDate new Date startDateLong Java 8 中的等价物是什么Lo
  • 延迟表达式求值而不使用“quote”

    我创建了以下函数 示例作为在表等中显示变量标签的通用方法 Function to prettify the output of another function using a var labels attribute This is pa
  • 在verilog中使用for循环生成

    我试图理解为什么我们在verilog 中使用generate 和for 循环 一起使用生成和 for 循环 reg 3 0 temp genvar i generate for i 0 i lt 3 i i 1 begin always p
  • jQuery .attr 检索自定义属性返回未定义

    我在使用 jquery 时遇到以下问题 我有这样的东西 div value span class delete span div 现在我有了这个 fn 但它只返回 未定义 但是如果我要求的话 它确实会返回 id 或类 delete clic
  • 以编程方式生成 BPEL 文件?

    有没有一种方法可以在 Java 中以编程方式生成 BPEL 我尝试使用 BPEL Eclipse Designer API 编写以下代码 Process process null try Resource Factory Registry
  • 精确为零的浮点/双精度相等

    我有一个使用的算法floats or doubles执行一些计算 Example double a double b double c double result c b a if result gt 0 result lt small n
  • 使用操作按钮启用和禁用侧边栏切换按钮

    我正在寻找一个代码片段 使用它 我可以启用 禁用闪亮仪表板标题中的侧边栏切换按钮 library shiny library shinydashboard library shinyjs ui lt shinyUI dashboardPag
  • 在Android中创建文件夹[重复]

    这个问题在这里已经有答案了 import java io File File folder new File Environment getExternalStorageDirectory TollCulator boolean succe
  • 我如何知道代码中的哪些部分从未被使用过?

    我有遗留的 C 代码 我应该从中删除未使用的代码 问题是代码库很大 我如何找出哪些代码从未被调用 从未使用过 未使用的代码有两种 本地的 也就是说 在某些函数中 某些路径或变量未使用 或使用但没有任何意义 例如已写入但从未读取 全局对象 从