通过LLVM查找C / C ++程序中所有可能的路径

Finding all possible paths in a c/c++ program by LLVM

本文关键字:有可能 路径 LLVM 查找 通过 程序      更新时间:2023-10-16

我正在尝试通过LLVM在我的程序中找到任何可能的路径。现在,我可以在代码中找到所有函数从进入到退出BB的路径。然而,这不是我需要的。我需要的是扩展 CFG(也许通过内联函数调用?!)为整个源代码提供一个 CFG 并在这个扩展的 CFG 中找到路径。我正在考虑首先使用 -inline pass 先内联所有函数,然后运行我的探路器通路,但正如我观察到的那样,-inline 仅适用于代码(cpp 文件)中明确内联提到的函数。我无法浏览数百个函数并内联添加到所有这些函数中。我还需要保证所有呼叫都是内联的,并且不会错过任何呼叫。我不确定内联是我唯一的选择,甚至不是一个选择。对此的任何想法都是值得赞赏的。

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

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

基本上,您将源代码.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对将其添加到标头中。