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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (96)

我有一些遗留的C++代码,我想删掉这里面没用的代码。

怎样才能找出那些代码从未被调用/从未使用过?

提问于
用户回答回答于

有两种未使用的代码:

  • 本地函数,即在某些函数中,某些路径或变量未使用(或使用但没有意义,比如写的但从不读取)
  • 全局对象:从未调用的函数,从未被访问的全局对象。

对于第一类,一个好的编译器可以帮助:

  • -Wunused(GCC, Clang)应该警告未使用的变量,Clang未使用的分析器甚至被增量来警告从未读取的变量(即使使用过)。
  • -Wunreachable-code(老版的GCC,2010年下架)应该警告从未被访问的本地块(它发生在早期返回或总是计算为true的条件中)。
  • 我不知道有什么办法可以警告未使用的。catch块,因为编译器通常无法证明不会抛出任何异常。

对于第二种,静态地,它需要整个程序分析,即使链接时间优化实际上可以删除死代码,但在实际操作中,程序在执行过程中已经进行了大量的转换,几乎无法向用户传递有意义的信息。

因此,有两种办法:

  • 理论上的方法是使用静态分析仪。一种软件,它将同时检查整个代码并找到所有的流程路径。在实践中,我不知道在这里有什么行得通。
  • 一个实用的方法是使用启发式:使用代码覆盖工具(在GNU链中,它是gcov请注意,在编译过程中应传递特定标志,以便使其正常工作)。运行代码覆盖工具时,需要有一组很好的不同输入(单元测试或非回归测试),死代码必须在未到达的代码中...所以您可以从这里开始。

你可以使用Clang库来构建这样一个工具。

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

因为Clang将为您解析代码,并执行重载解析,因此您不必处理c++语言规则。

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

热门问答

linux如何限制单一ip对服务器的日访问量?

小爱同学

腾讯云 · 技术支持 (已认证)

推荐
您根据当前网站规模和业务了解下【网站管家 WAF】,企业站点可有效抵御恶意攻击,垃圾访问。 图片.png 您反馈网站短信验证码被盗刷,也可结合自己业务,可自行部署iptables进行手动拦截。或其他方式 例如您的网站是nginx,在web配置文件中开启配置HttpLimitR...... 展开详请

兼容性测试只能上传apk测试的吗?

WeTest质量开放平台团队专注游戏,提升品质
推荐

目前不支持公众号的兼容测试,还请知晓

关于群自动解散的问题?

安稳

腾讯科技 · 工单技术支持 (已认证)

推荐
您好,临时群是没有的。云通信的群组只有私有群(Private)、公开群(Public)、聊天室(ChatRoom)、音视频聊天室(AVChatRoom)和在线成员广播大群(BChatRoom)这五种。 您说的这个需求,思路:创建群组时,服务端记录一下时间,到达约定解散的时间以后,...... 展开详请

腾讯云短信接收方对控制台发出的短信做出回应,比如说回复短信“你好”,控制台是否能收到回复的内容?

您好,国内短信可在 短信控制台->国内短信->统计分析->短信记录->回复记录 查看用户回复的短信。 同时可配置文本短信回复回调,配置后会推送相关回复到用户服务器。 统计分析:https://cloud.tencent.com/document/product/382/18062...... 展开详请

不同账号的三台服务器用内网ping不通?

不同账号的服务器本来就已经独立划分,内网肯定是不通的,公网各自都有自己的公网,通是一定的,具体不同账号内网不通你可以参考私有网络VPC的定义。同地域不同账户的不同 VPC 相互隔离,但可以通过建立 同账户同地域对等连接同账户跨地域对等连接 实现内网互联。

对象存储单个文件大于5GB不能改变存储类型为归档存储,那么我上传的时候可以直接指定为归档存储吗?

Lew

腾讯云对象存储 · 工程师 (已认证)

推荐已采纳

可以的,coscmd upload a.txt a.txt -H "{'x-cos-storage-class':'Archive'}" -H 参数可以添加自定义的header

所属标签

扫码关注云+社区