C语言 如何删除基于配置文件/makefile文件的死代码或无用代码



当我们编译一个 C/C++ 项目时,编译不需要项目源代码中的一些文件和代码。例如,测试文件夹(一些测试脚本(、示例文件夹和死代码。如何识别这些未编译为二进制文件的源文件?不希望有必要进行编译。因为我需要自动处理许多项目,并且很难在没有手动操作的情况下编译所有项目。

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

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

当你要求编译器进行优化时,死代码通常会(但并非总是(被编译器消除(但自动删除所有死代码是不可能的,因为由于与停止问题等效,因此无法判定(。请注意允许编译器执行此类优化的 as-if 规则。因此,在实践中,您不需要删除相应的源代码。

一些行业将禁止死源代码作为编码规则(例如在DO-178C中(。检测这是非常困难的,通常是不可能的(参见例如赖斯定理(,因此需要大量复杂的静态程序分析技术和外部代码审查,并且成本很高(例如,将软件开发成本增加30倍以上(。

你的构建自动化系统(例如cmake或Makefile等(可能是(通常是(图灵完备的;所以即使删除完全无用的C++源文件通常也是不可能完成的任务。即使是POSIX shell(用于构建事物的命令(也很难分析(参见Yann Regis-Gianas在FOSDEM2018的优秀解析Posix [S]hell演讲(。

最新更新