【问题标题】:Finding all possible paths in a c/c++ program by LLVM通过 LLVM 在 c/c++ 程序中查找所有可能的路径
【发布时间】:2016-05-20 03:58:06
【问题描述】:

我正在尝试通过 LLVM 在我的程序中找到任何可能的路径。现在我可以在我的代码中找到所有函数从入口到出口 BB 的路径。然而,这不是我需要的。我需要扩展 CFG(也许通过内联函数调用?!)为整个源代码创建一个 CFG,并在这个扩展的 CFG 中找到路径。 我正在考虑首先使用 -inline pass 来内联所有函数,然后运行我的路径查找器 pass,但正如我所观察到的 -inline 仅适用于代码(cpp 文件)中明确提到的内联函数。我无法遍历数百个函数并将内联添加到所有函数中。我还需要保证所有电话都是内联的,并且没有错过任何电话。我不确定内联是我唯一的选择,甚至这是一个选择。对此的任何想法表示赞赏。

**显然我的源代码中没有递归调用。

【问题讨论】:

  • 看看KLEE项目。

标签: c++ clang llvm inline control-flow-graph


【解决方案1】:

不完全确定您在问什么,但是您可以使用几乎任何程序语言来解析 source.cpp 和 source.h 以查找函数声明/定义并根据某些规则添加 inline

基本上,您会将 source.cpp 视为 .txt 并使用您喜欢的任何 api 将文件作为char * 获取。让它搜索(,然后搜索参数和关闭)

// FindFunctions.cpp
#include "..."
...

char * AddFuncDecChars( _In_ char * file, char * stringToBeInserted)
{
    //Find possible functions with `()`.
    int[] PossFuncs = FindParenths(File);
    // Check to see if space delimited block followed by another block or
    // multiple space delimited blocks with commas.
    int[] VerifiedParens HasSpaceDelimWithPossibleCommas( PossFuncs, 
    File);
    char * Change InsertStringToFunc( File, VerifiedParen,
    stringToBeInserted);
    return Change;
} 

此外,inline 必须在标头中定义而不是 cpp,因此可能必须通过采用 .h.cpp 对将其添加到标头中。

【讨论】:

  • 显然 Visual Studio 可以跨模块进行优化。可能需要考虑。
  • OP 正在寻找使用llvm正确 解析解决方案,而不是无法解析大量有效C++ 函数调用的肮脏黑客。例如,您的解决方案尝试如何处理嵌套函数调用、重载运算符、从 ctor 初始化程序列表调用的函数……?
  • @mindriot 我感谢您提供评论,因为在投下答案时建议您提供评论。问题 cleary 要求 c++ 程序中的“所有可能”路径,该程序显然由许多模块组成。显然,至少根据 OP LLVM 没有处理这个问题(至少我如何解释这个问题)。我假设提问者已经用一个小程序测试了该方法,并且内联函数使得利用 LLVM 分析整个程序成为可能。
  • 我也打算将我的代码作为伪 C++。例如,您如何在不知道大小的情况下使用file?我不是 c++ 标准的专家,但我相信在解析函数声明和定义时需要使用括号,以便添加内联属性并将定义移动到标题中。这不是为了模仿编译器。这里所需要的只是更改源代码并在其中更改文本文件。由于构建环境的关系,我们不能对返回类型或已经使用的属性的解析、参数声明等做很多假设。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多