首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >旧C/C++项目中的死代码检测

旧C/C++项目中的死代码检测
EN

Stack Overflow用户
提问于 2008-10-23 01:18:25
回答 8查看 36.8K关注 0票数 68

如何在C/C++代码中检测死代码?我有一个相当大的代码库来工作,至少有10-15%是死代码。有没有基于Unix的工具来识别这个领域?有些代码仍然使用了大量的预处理器,自动化过程能处理吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-10-23 01:38:59

为此,您可以使用代码覆盖率分析工具,并在代码中查找未使用的位置。

gcc工具链的一个流行工具是gcov,以及图形前端lcov (http://ltp.sourceforge.net/coverage/lcov.php)。

如果您使用的是gcc,则可以使用gcov支持进行编译,这是通过'--coverage‘标志启用的。接下来,使用这个支持gcov的构建来运行您的应用程序或测试套件。

基本上,gcc在编译过程中会发出一些额外的文件,应用程序在运行时也会发出一些覆盖率数据。您必须收集所有这些文件(.gcdo和.gcda文件)。我不会在这里详细介绍,但是您可能需要设置两个环境变量来以合理的方式收集覆盖率数据: GCOV_PREFIX和GCOV_PREFIX_STRIP……

运行之后,您可以将所有覆盖率数据放在一起,并通过lcov工具套件运行它。合并来自不同测试运行的所有覆盖率文件也是可能的,尽管有点涉及。

无论如何,你最终得到了一组很好的网页,显示了一些覆盖率信息,指出了没有覆盖率的代码片段,因此没有使用。

当然,您需要仔细检查代码部分是否在任何情况下都没有使用,这在很大程度上取决于您的测试对代码库的执行情况。但至少,这将给出一个关于可能的死代码候选人的想法……

票数 30
EN

Stack Overflow用户

发布于 2008-10-23 06:50:24

用-Wunreachable-code在gcc下编译。

我认为这个版本越新,你就会得到越好的结果,但我的印象可能是错误的,因为我认为这是他们一直在积极努力的东西。请注意,这确实进行了流分析,但我不相信它会告诉您“代码”在离开预处理器时已经死了,因为编译器从来没有解析过它。它也不会检测到,例如,从未调用过的导出函数,或者碰巧不可能的特殊情况处理代码,因为没有任何东西使用该参数调用函数-你需要代码覆盖率(并运行功能测试,而不是单元测试。单元测试应该有100%的代码覆盖率,因此执行的代码路径对于应用程序来说是“死的”)。不过,考虑到这些限制,这是在代码库中开始查找最完全粗体的例程的一种简单方法。

This CERT advisory lists some other tools for static dead code detection

票数 17
EN

Stack Overflow用户

发布于 2008-10-23 06:30:40

您的方法取决于可用性(自动化)测试。如果您有一个您信任的测试套件,可以覆盖足够多的功能,您可以使用覆盖分析,正如前面的答案所建议的那样。

如果你没有那么幸运,你可能想看看源代码分析工具,比如SciTools的Understand,它可以帮助你使用大量内置的分析报告来分析你的代码。我使用这个工具的经验可以追溯到两年前,所以我不能给你太多细节,但我记得他们有一个令人印象深刻的支持,错误修复和问题答案的周转时间非常快。

我在static source code analysis上找到了一个页面,上面还列出了许多其他工具。

如果这对您也没有足够的帮助,并且您对找出与预处理器相关的死代码特别感兴趣,我建议您发布一些关于代码的更多详细信息。例如,如果它主要与#ifdef设置的各种组合有关,您可以编写脚本来确定设置的(组合),并找出实际上从未构建过的组合,等等。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/229069

复制
相关文章
.NET Core 如何判断程序是否在远程桌面(RDP)下运行
由于疫情的关系,很久没发文章了。今天终于稳定下来在家办公,抽空分享一个刚学会的技巧。最近在家办公的程序员可能避免不了要用远程桌面,那么问题来了,你的 .NET Core 程序有没有办法知道自己是否在 Windows 远程桌面环境下运行呢?
Edi Wang
2020/02/18
2.7K0
Spring 官宣,干掉原生 JVM!
原文:spring.io/blog/2021/03/11/announcing-spring-native-beta
Guide哥
2021/05/20
1.3K0
Spring 官宣,干掉原生 JVM!
Spring新版本抛弃JVM,可独立部署,网友:要自立门户???
来源:spring.io/blog/2021/03/11/announcing-spring-native-beta
用户2242639
2021/10/20
8600
Spring新版本抛弃JVM,可独立部署,网友:要自立门户???
公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。
java进阶架构师
2021/05/28
1.6K0
Spring新版本抛弃JVM,可独立部署,网友:要自立门户???
Spring Native 中文文档
https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#getting-started-buildpacks
爱撸猫的杰
2022/01/05
10.5K0
Spring 官宣,抛弃原生 JVM!网友:这是要单干啊!
Spring 团队日前发布了 Spring Native Beta 版。通过 Spring Native,Spring 应用将有机会与 GraalVM 原生镜像的方式运行。为了更好地支持原生运行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了优化原生配置的注解。
终码一生
2022/04/14
1.7K0
Spring 官宣,抛弃原生 JVM!网友:这是要单干啊!
轻量灵动:革新轻量级服务开发
Tech 导读 Java虽然在市场份额占比巨大,但是在万物云原生下,因它启动时长,资源消耗较大,不易水平扩展等方面都成为了明显的短板,导致市场份额也逐渐减少。而GraalVM弥补了这些缺陷,本文将从实战方向带你打开,原生镜像之路。
京东技术
2023/08/22
3340
轻量灵动:革新轻量级服务开发
Spring Native beta 版发布, 技术融合越来越快
经过一年半的工作,我很高兴地宣布,Spring Native beta 版发布,并且可在 start.spring.io 中直接使用!
用户4172423
2021/04/02
1.6K0
Spring Native beta 版发布,  技术融合越来越快
Java程序判断是否是回文
利用函数库,将输入的字符串倒置,看倒置后的字符串和原来的字符串是否一样,然后得出结论。
算法与编程之美
2023/08/22
2010
Java程序判断是否是回文
java如何运行_如何运行java程序[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 我们在编写Java程序以后都会在集成开发环境中运行程序,那么该如何的在命令行中运行Java程序呢?下面动力节点java学院小编为大家介绍如何运行java程序?
全栈程序员站长
2022/09/08
5.1K0
java如何运行_如何运行java程序[通俗易懂]
Java在云原生的破局利器——AOT(JIT与AOT)
JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,与之相对的AOT(Ahead-of-Time,预编译)方式,似乎长久以来和Java语言都没有什么太大的关系。但是近年来随着Serverless、云原生等概念和技术的火爆,Java JVM和JIT的性能问题越来越多地被诟病,在Golang、Rust、NodeJS等新一代语言的包夹下,业界也不断出现“云原生时代,Java已死”的言论。那么,Java是否可以使用AOT方式进行编译,摆脱性能的桎梏,又是否能够在云原生时代焕发新的荣光?本文会带着这样的疑问,去探索Java AOT技术的历史和现状。
燃192
2023/02/28
3.7K0
Java在云原生的破局利器——AOT(JIT与AOT)
过两年 JVM 可能就要被 GraalVM 替代了
GraalVM 是 Oracle 大力发展和想要推广的新一代 JVM ,目前很多框架都已经渐渐支持 GraalVM 了,比如我们在用的 Spring 也已经推出了对 GraalVM 兼容的工具包了。
古时的风筝
2022/12/18
9.7K0
过两年 JVM 可能就要被 GraalVM 替代了
Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单
  AOT是Spring6.0提供的一个新特性,Ahead of Time 提前编译。
用户4919348
2023/05/27
3.2K0
Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单
Spring6 正式发布!重磅更新,是否可以拯救 Java
Spring Framework6 和 Spring Boot3 是一个跨越式的升级整个框架支持的最低 JDK 版本直接跨越到 JDK17,无论框架层还是基础设施层都做了巨大的改变,Spring 6.0 新框架具体做了哪些功能的升级与改进,是否有必要升级与使用呢?可以继续看一看。
宋小生
2022/11/28
8.6K0
Spring6 正式发布!重磅更新,是否可以拯救 Java
编写java判断闰年_用Java程序判断是否是闰年的简单实例[通俗易懂]
我们知道,(1)如果是整百的年份,能被400整除的,是闰年;(2)如果不是整百的年份,能被4整除的,也是闰年。每400年,有97个闰年。鉴于此,程序可以作以下设计:
全栈程序员站长
2022/09/08
1.4K0
java如何判断对象为空_java对象如何判断是否为空
在实际书写代码的时候,经常会因为对象为空,而抛出空指针异常java.lang.NullPointerException。
全栈程序员站长
2022/06/25
13.5K0
java如何判断对象为空_java对象如何判断是否为空
Spring Native Beta 正式发布,原生更香!
最近,Spring 发布了 Spring Native 的 beta 版本,该功能已经在 start.spring.io 上可用了。
深度学习与Python
2021/03/30
7640
Spring Native Beta 正式发布,原生更香!
在Java中如何高效判断数组中是否包含某个元素
原文地址:http://www.hollischuang.com/archives/1269
Java后端技术
2018/08/09
5.3K0
Spring6 AOT 提前编译
JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译
鱼找水需要时间
2023/06/24
3330
Spring6 AOT 提前编译
Spring Native Beta 正式发布,干掉原生 JVM!
Spring 发布了 Spring Native 的 beta 版本,并在http://start.spring.io上运行它。
码农架构
2021/06/13
1.5K0
Spring Native Beta 正式发布,干掉原生 JVM!

相似问题

在标准的Java程序中,我如何判断是否运行在GraalVM中?

23

使用GraalVM模块导入时GraalVM上下文中的错误

27

如何判断Perl脚本是否在CGI上下文中执行?

40

是否有可能在Java "GraalVM“程序中运行Python程序?

10

如何使用编译后的源GraalVM运行Java程序?

123
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文