我有一个C程序,我想跟踪属于与具体输入相对应的执行路径的所有分支条件。例如,考虑一个简单的程序:
#include <stdio.h>
#include <string.h>
int test(char* a) {
if (strcmp(a, "123") == 0)
return 0;
if (strcmp(a, "123") < 0)
return -1;
else
return 1;
}
int main() {
char* a;
return test (a);
}
使用a = "1234"
,程序返回1
,相应的路径条件为strcmp(a, "123") > 0
。我想收集strcmp
,"123"
和此运算符的值(-1)。是否有任何方法可以让我这样做?我首先考虑使用一些C解析器但看起来并不那么简单。要获取参数值,我们必须处理指针分析或外部库调用,我不知道如何解决。
答案 0 :(得分:1)
您无法选择是否需要解析器。你需要它(包括一个完整的预处理器)。你特别不想做的就是推出你自己的解析器;你认为C更复杂,然后你必须担心感兴趣的C的特定方言。
但解析器还不够;你需要一个工具,可以解析声明和表达式到类型的名称,可以提取流程图,可以指向分析,特别是功能点到分析,最后可以构建一个调用图,将所有这些考虑在内。这意味着您需要类似编译器的框架来解决问题。
你也许可以弯曲GCC(很难,它真的想成为编译器)或Clang(希望成为允许其他目的)但是他们想要编译单个程序而你需要一些东西可以处理一组程序(因为C程序通常以这种方式构建)。 我们的DMS软件再造工具包专门用于支持这种自定义任务,并具有所有必需的机器。 (DMS也支持C的特定方言。)
做出框架选择之后,沿着感兴趣的流程路径导航的代码可能不是很简单。通用建议是“解析源代码,应用所有上述分析器,然后使用工具提供的API遍历数据结构”,特别关注遵循控制流路径的API。所有这些代码都不太适合一个例子。根据您选择的框架,它会有很大差异。我没有密切关注GCC或Clang的细节,但我认为它们并没有为你提供任何简单的方法来记下路径的符号描述(例如,条件表达式的结合)。我可以告诉你,DMS(按设计)明确支持构造这样的符号公式。
无论您走哪条路线,您都将面临学习如何处理这些工具的教育成本。它们很复杂;期待你的学习曲线相对较长。