如何根据配置文件/ makefile文件删除无效代码或无效代码

时间:2018-09-16 07:34:01

标签: c makefile cmake static-analysis

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

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

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

1 个答案:

答案 0 :(得分:0)

当您要求optimize时,编译器通常会(但并非总是)消除无效代码(但是自动删除 all 无效代码是不可能的 >,因为undecidablehalting problem等效。请注意as-if rule允许编译器进行此类优化。因此,实际上您不需要删除相应的源代码。

某些行业有一个编码规则(例如在DO-178C中),要求禁止无效的源代码。检测到这是极其困难的,并且通常是不可能的(例如,参见Rice's theorem),因此需要大量复杂的static program analysis技术和外部code review并花费很多(例如,增加软件成本)开发速度提高了30倍以上。

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