2013-10-28 112 views
2

我有一个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

您正在问一个工具问题。 SO狂热者可能会关闭这个。 –

+0

@IraBaxter我在问工具/方法:)。安,我会编辑它。 –

回答

1

您没有得到关于是否需要解析器的选择。你需要它(包括一个完整的预处理器)。你特别不想做的事就是推出你自己的解析器; C的思维方式比较复杂,然后你不得不担心C的具体方言。

但是解析器是不够的;您需要一个能够将名称解析为声明和表达式到类型的工具,这些工具可以提取流图,可以指向分析,特别是分析函数点,最后还可以构建一个调用图,将所有这些考虑在内。这意味着你需要类似编译器的框架来解决这个问题。你可能会弯曲GCC(很难,它真的想成为一个编译器)或Clang(想成为,但被设计为允许其他目的)来做到这一点,但他们想编译单个程序,并且你需要一些东西可以处理一组程序(因为C程序通常是以这种方式构建的)。 我们的DMS软件再造工具包专为支持这种定制任务而设计,并具有所有必需的机器。 (DMS也支持C的特定方言)。

做出框架选择后,沿着感兴趣的流程路径导航的代码不可能很简单。通用的建议将是“解析源代码,应用所有上述分析器,然后使用工具提供的API来操作数据结构”,并明显关注遵循控制流路径的API。所有这些代码在示例中都不太适合。它会根据您选择的框架而有很大差异。我并没有深入GCC或Clang的细节,但我认为他们不提供任何简单的方法来写下路径的符号描述(例如,条件表达式的联合)。我可以告诉你,DMS(设计)有明确的支持来构建像这样的符号公式。

无论你走哪条路,你都会面临学习如何处理这些工具的教育成本。它们很复杂;期望你的学习曲线相对较长。

相关问题