gpt4 book ai didi

c - 给定输入的程序分析

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:09 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com