我想在代码库中找到未使用的函数 - 包括编译单元.我正在使用gcc作为我的编译器.
这是一个例子:
foo.c(假设合适foo.h):
void foo() {
....
}
void bar() {
....
}
Run Code Online (Sandbox Code Playgroud)
main.c:
#include <stdio.h>
#include "foo.h"
int main(void) {
bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想得到关于foo()不被使用的警告.
有-Wunused-functiongcc选项:
-Wunused-function每当声明静态函数但未定义静态函数或未使用非内联静态函数时发出警告.-Wall启用此警告.
但它只适用于静态函数 - 它不会在上面的例子中产生警告.
我也接受可以为我做这个的工具/脚本/其他编译器的建议 - 尽管gcc如果可能的话我宁愿坚持下去.
我想从一个较大的项目中删除死代码,并希望从未使用的符号开始.反正有没有让链接器列出它已经优化的未使用的符号?我正在使用GNU链接器(LD)和GCC.
如果失败了,任何Binutils(readelf或objdump)都可以执行相同的功能吗?
注意:在将此标记为重复之前,请阅读整个问题,
尤其是第5章:-)
假设你有一个大型的C-项目与众多.h和.c文件.但大多数文件从未使用过.这通常是嵌入式软件项目的情况.微控制器的每个外围设备的驱动程序都存在于项目的某个位置,但您通常只使用其中的一些.如果 - 例如 - 我使用usb驱动程序和uart驱动程序,我将导入我的相应.h文件main.c:
#include "stm32f7xx_usb.h"
#include "stm32f7xx_uart.h"
Run Code Online (Sandbox Code Playgroud)
好的......我过度简化了用例,但你明白了.
让我们就死文件的以下快速和脏定义达成一致:
死
.c文件是永远不会到达函数或数据的文件,因为.h不导入相应的文件.
我知道,这是一个非常不洁的定义.文件.c和.h文件之间并不总是存在一对一的关系.所以也许我应该说:
一
.c,如果没有它的功能/数据通过一个或多个进口暴露的文件已经死了.h的文件.
通常在嵌入式软件中,我们将这些import语句包含在一个#ifdef块中:
#ifdef USE_USB
#include "stm32f7xx_usb.h"
#endif
Run Code Online (Sandbox Code Playgroud)
这意味着状态"dead"或"alive"可以在编译时更改,具体取决于编译时注入的预处理器宏.因此,让我们假设在编译时注入的所有预处理器宏都是已知的.它们可以简单地在makefile中找到.
有时其中一个死文件有错误.当错误冻结整个编译过程时非常令人沮丧 - 特别是因为无论如何都不会使用该文件.在编译之前知道哪些文件已经死了,可能非常有用.
但我真的不知道可以使用什么工具.如何.
PS:当然,无论如何都应该运行某种预编译器或解析器.但那没关系.
我想我越来越接近这个目标了,但我还没有.我会告诉我现在的位置.
传递参数-ffunction-sections和-fdata-sectionsgcc编译器会在生成的目标文件中产生干净分离的函数和数据块.
接下来,我传递参数-Wl,--gc-sections和-Wl,--print-gc-sections海湾合作委员会链接.链接器启动所有不可缓存的数据和函数,从而产生更小的二进制文件.此外,链接器打印出他扔掉的东西:
...
ld.exe: Removing unused section '.text.HAL_UART_Receive_IT' in file …Run Code Online (Sandbox Code Playgroud) 假设有一个广泛的 C++ 框架。该框架有多个模块。我需要开发一种工具,可以扫描框架中的所有 *.cpp、*.h、*.hpp 文件,隔离与一个可执行文件相关的文件,然后从那些编译指定文件不需要的文件中删除所有源代码可执行的。
例如,该框架具有用于查询关系数据库、文档数据库、键值存储、面向列的数据库和图形数据库的模块。
我只想隔离那些与关系数据库相关的文件,然后我想删除所有那些关系数据库中未使用的代码。
假设框架有一个文件,format_string.hpp.该文件包含 73 个函数,可以以各种方式格式化字符串。但是,关系数据库相关模块仅使用该文件中的 15 个函数。因此,我想从该文件中删除其余 58 个函数。
注意:我经常需要研究 C++ 源代码并将该源代码翻译/转换为其他编程语言。这个工具将帮助我理解算法。
删除/清除不是永久性的。它仅用于学习目的。这是为了减少进一步手动检查的源代码量。
问题:
我已经使用 C# 实现了文件隔离部分。
但是,我不知道如何实现第二部分。
我需要使用正则表达式吗?或者我需要一个词法分析器和一个解析器?