如何根据configure file / makefile文件删除死代码或无用代码

问题描述 投票:-1回答:1

编译C / C ++项目时,编译时不需要项目源中的某些文件和代码。例如,测试文件夹(一些测试脚本),示例文件夹和死代码。如何识别未编译为二进制文件的源文件?不希望编译是必要的。因为我需要自动处理许多项目,如果没有手动操作,很难编译所有项目。

我知道编译可以自动删除死代码,但在我的情况下我无法编译整个项目,在源代码中,还有许多其他代码不涉及最终编译,如测试文件夹中的代码,工具文件夹......我希望检测这些代码,至于死代码,我知道很难通过静态分析来检测它,所以忽略它,只关心整个文件和未编译的整个文件夹。

我为什么要这样做?我想提取一些功能(字符串,函数调用图,int常量......)来表示这个项目,并将这些功能与从二进制文件中提取的相同功能进行比较,看看有什么不同之处。因此,如果我从测试文件夹中的代码中提取功能,并且代码未在最终的二进制文件中编译。比较这些功能时会出现很大的错误。

c makefile cmake static-analysis
1个回答
0
投票

当您向optimize询问时,编译器通常会 - 但不总是 - 消除死代码(但是自动删除所有死代码是不可能的,因为undecidable因为与halting problem等效)。请注意as-if rule允许编译器进行此类优化。因此在实践中您不需要删除相应的源代码。

一些行业有编码规则(例如在DO-178C中)禁止死源代码的要求。检测这是非常困难的并且通常是不可能的(参见例如Rice's theorem),因此需要许多复杂的static program analysis技术和外部code review并且花费很多(例如,将软件开发的成本增加超过30倍)。

您的build automation系统(例如cmake或Makefile等)可能(通常是)Turing-complete;因此,即使删除完全无用的C ++源文件也是一项不可能完成的任务。甚至POSIX shell(用于构建你的东西​​的命令)也难以分析(参见Yann Regis-Gianas在FOSDEM2018上的优秀Parsing Posix [S]hell演讲)。

© www.soinside.com 2019 - 2024. All rights reserved.