c - 给定输入的程序分析

标签 c code-analysis dynamic-analysis

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

相关文章:

visual-studio-2010 - 有没有办法比较 VS 2010 代码分析、指标和代码覆盖率结果或进行增量分析?

c - 在 C 程序中列出全局变量

c++ - 检测单元测试中的特定函数调用

c - 查找 C 代码中的错误的首选工具有哪些?

sql - 协助编写复杂 SQL 查询的最佳工具?

c - 如何提供中断上下文和进程上下文之间的同步

C 中的组合前增量和后增量

c - 在小数组中查找未被占用的空间

c++ - CMake 传递的变量编译器无法编译简单程序

c# - 在具有 13 个事件处理程序订阅的方法中,圈复杂度如何达到 27?