我有一个 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 解析器,但似乎并没有那么简单。要获取参数的值,我们必须处理指针分析或外部库调用,我不知道如何解决。
最佳答案
您无法选择是否需要解析器。您需要它(包括完整的预处理器)。您特别不想做的是推出自己的解析器; C 比您想象的要复杂得多,然后您必须担心感兴趣的 C 的特定方言。
但是解析器还不够;您需要一个工具,它可以将名称解析为声明,将表达式解析为类型,可以提取流程图,可以进行点分析,尤其是功能点分析,最后是可以构建调用图并考虑所有这些的工具.这意味着您需要类似编译器的框架来解决问题。
你也许可以弯曲 GCC(很难,它真的想成为一个编译器)或 Clang(想要成为,但旨在允许其他目的)来做到这一点,但他们想要编译单独的程序,你需要一些东西可以处理一组程序(因为 C 程序通常以这种方式构建)。 我们的 DMS Software Reengineering Toolkit 专为支持此类自定义任务而设计,并具有所有必需的机制。 (DMS 还支持 C 的特定方言)。
做出框架选择后,沿着感兴趣的流程路径导航的代码可能并不简单。一般建议是,“解析源代码,应用所有上述分析器,然后使用工具提供的 API 遍历数据结构”,特别关注遵循控制流路径的 API。所有这些代码不太可能很好地适合一个示例。根据您选择的框架,它会有很大差异。我不太了解 GCC 或 Clang 的细节,但我认为它们不会为您提供任何简单的方法来写下路径的符号描述(例如,条件表达式的结合)。我可以告诉您,DMS(按设计)明确支持构建这样的符号公式。
无论您走哪条路,您都将面临学习如何使用这些工具的教育成本。它们很复杂;预计您的学习曲线会相对较长。
关于c - 给定输入的程序分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634022/