It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center
8年前关闭。
我将与我们的团队一起为一个在线事件编写一个使用C语言的死代码删除算法。
要求是。。。。。
读取一个C程序源文件,它有许多形式的死代码。
我们的输出应该是一个文件,没有任何死代码。
在网上冲浪的时候,我们发现了一些链接。。。
How can I know which parts in the code are never used?
Dead code detection in legacy C/C++ project
在看到这些链接之前,我们有一个基本的想法。。。
读取输入C文件,使用普通文件流逐行读取并存储在字符串数组中。
然后分析这些字符串并确定非常基本的死代码,如if(0)和if(1)等。。
做一个堆栈,用来维护括号。还有更多。。。
但这有一个很大的问题,这个想法将导致我们做更多的字符串操作,而不是删除死代码。
但在看到这些联系之后。。。
我们开始知道
Clang库、抽象语法树、控制流图等。。。
但我们对那些图书馆和概念还很陌生。
我们开始知道它们是用来解析C代码的。
因此,我们需要一些关于这些AST,CFG的基本思想和一些基本的指导,解释我们如何使用
在我们的密码里。。。
我们能把那个叮当图书馆当作一个像数学一样的普通图书馆吗?
我们在哪里可以下载那个库?
我们可以在windows中使用这些Clang库吗?

最佳答案

我可以向您解释控制流图的概念,但我不熟悉库本身。
这个概念很简单。将任何连续的代码行(即没有ifgoto或函数调用或标签)想象为图的一个节点。每个goto或函数调用都会创建从当前节点到goto标签所在节点或其调用的函数的定向链接。请记住,函数本身可以是一个图,而不是一个简单的节点,因为它内部可能有ifs或其他函数调用。每个函数调用还创建从函数的叶节点(其中函数returns)到函数调用后包含代码的节点的定向链接。(这可以创建许多从函数图传出的链接,因为函数可以在代码的许多部分中调用)
同样,如果您有一个if,那么您有从当前节点到if语句的else部分和if部分的两个方向链接(除非您像您所说的那样检测到if(0)if(1),在这种情况下,只有一个链接指向正确的位置)
图形的根是main的入口点。现在,要找到死代码,您必须简单地从根位置遍历图形(例如使用DFS或BFS),最后查看哪些节点没有被访问。这向您展示了死代码,也就是代码中的位置,无论程序朝哪个方向运行,它都无法到达这些位置。
如果您想自己实现,可以采用递归方法(类似于解析代码,但更简单)。例如,如果您看到if,您会说:

typedef char *line;
FlowGraph *get_flow_graph(line *code)
{
    FlowGraph *current_node = malloc(sizeof *current_node);
    current_node->flow_to = malloc(some_maximum * sizeof *current_node->flow_to);
    current_node->flow_to_count = 0;
    ...
    if (is_if_statement(code[0]))
    {
        FlowGraph *if_part = get_flow_graph(code + 1);
        FlowGraph *else_part = get_flow_graph(code + find_matching_else(code));
        current_node->flow_to[current_node->flow_to_count++] = if_part;
        current_node->flow_to[current_node->flow_to_count++] = else_part;
    }
    else
    ...
}

07-24 09:44
查看更多