标签: libtooling

从 clang 中的 FunctionDecl 类获取参数信息

如何从 clang 中的 FunctionDecl 类中以字符串形式获取参数信息。我正在尝试,但对这么多继承感到困惑。此外,他们的编译器说 getReturnType() 不是 FunctionDecl 的成员,但 doxygen 文档另有说明。请帮忙。 http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html

using namespace std;
using namespace clang;
using namespace clang::driver;
using namespace clang::tooling;
using namespace llvm;

.......
class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> 
{
    ......
    virtual bool VisitFunctionDecl(FunctionDecl *func) 
    {
            numFunctions++;
            string funcName = func->getNameInfo().getName().getAsString();
            string retName = func->getReturnType().getAsString();
            ...
            return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

错误:-

“class clang::FunctionDecl”没有名为“getReturnType”的成员

c++ clang libtooling

5
推荐指数
1
解决办法
2242
查看次数

如何在Mac OS上构建clang LibTooling?

我想在Mac OS X Yosemite上使用clang的LibTooling。Clang的文档仅显示了如何构建clang和llvm,但我需要的是LibTooling,而不是整个clang(xcode已经提供了clang和llvm)。如何在不构建另一个clang的情况下构建LibTooling?

macos clang libtooling

5
推荐指数
1
解决办法
274
查看次数

将内存文件添加到 clang CompilerInstance

我正在尝试使用 clang 创建一个工具,并且想知道是否可以将包含文件从内存注入到预CompilerInstance处理器。
我的目标是向我的文件添加 a#include <my_globals.hpp>并动态地包含该文件以及适当的内容。所以我有ASTFrontendAction这样的:

class MyFrontendAction : public ASTFrontendAction
{
    virtual bool BeginInvocation(CompilerInstance &ci) override{
        auto buffer = llvm::MemoryBuffer::getMemBufferCopy(...);
        ci.createFileManager();
        ci.createSourceManager(ci.getFileManager());
        ci.createPreprocessor(clang::TU_Complete);
        auto& pp = ci.getPreprocessor();
        auto& preprocessorOpts = pp.getPreprocessorOpts();
        preprocessorOpts.clearRemappedFiles();
        preprocessorOpts.addRemappedFile("my_globals.hpp", buffer.release());
        // this seams not to work
        auto& hsi = pp.getHeaderSearchInfo();
        auto& headerSearchOptions = hsi.getHeaderSearchOpts();
        headerSearchOptions.Verbose = true; // this option is used during job

    }
    std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance& ci, StringRef file) override{/* do my parsing */}

};
Run Code Online (Sandbox Code Playgroud)

只要我不包含头文件,解析就可以工作。如果我这样做,我会得到一个my_globals.hpp file …

c++ clang libtooling

4
推荐指数
1
解决办法
694
查看次数

Clang:如何获取用于常量大小数组声明大小的宏名称

TL; 博士;

如何从 callExpr -> arg_0 -> DeclRefExpr 获取用于常量大小数组声明大小的宏名称。

详细问题说明:

最近我开始着手一项挑战,它需要源到源转换工具来修改带有附加参数的特定函数调用。Reasearching about how I can acheive 向我介绍了这个惊人的工具集 Clang。我一直在学习如何使用 libtooling 中提供的不同工具来实现我的目标。但现在我遇到了一个问题,在这里寻求你的帮助。

考虑下面的程序(我的源代码),我的目标是使用安全版本的 strcpy_s 重写对 strcpy 函数的所有调用,并在新函数调用中添加一个附加参数,即目标指针最大大小。所以,对于下面的程序,我重构的调用就像 strcpy_s(inStr, STR_MAX, argv[1]);

我编写了一个 RecursiveVisitor 类并检查 VisitCallExpr 方法中的所有函数调用,以获取 dest arg 的最大大小,我正在获取第一个 agrument 的 VarDecl 并尝试获取大小(ConstArrayType)。由于源文件已经过预处理,我将 2049 视为大小,但在这种情况下我需要的是宏 STR_MAX。我怎么能得到呢?(使用此信息创建替换,然后使用 RefactoringTool 替换它们)

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 

#define STR_MAX 2049

int main(int argc, char **argv){
  char inStr[STR_MAX];

  if(argc>1){
    //Clang tool required to transaform the below call into strncpy_s(inStr, STR_MAX, argv[1], strlen(argv[1]));
    strcpy(inStr, argv[1]);
  } else { …
Run Code Online (Sandbox Code Playgroud)

clang clang-static-analyzer llvm-clang clang++ libtooling

4
推荐指数
1
解决办法
762
查看次数

Clang libtooling:确定宏扩展位置

我有一个header.h带有宏定义的标头,该宏定义扩展为类定义和一个test.cpp包含header.h并使用该宏的源文件。然后我用来RecursiveASTVisitor访问所有CXXRecordDecl的。

当我访问 CXXRecordDecl(在 test.cpp 中)并查询其扩展的 CXXRecordDecl 时,该位置指向SourceLocation-宏定义的位置。dump()header.h

我需要为这个 CXXRecordDecl 获取的是SourceLocation宏扩展 - 在我的情况下它应该是test.cpp

提前致谢。

llvm clang libtooling

3
推荐指数
1
解决办法
1576
查看次数

Clang:将函数的 AST 从原始文件写入新文件

我是 Clang 的新手,他试图通过 libtooling 分析 AST。我想找到一个特定的函数,并将其 AST 从原始源文件移动到一个新文件。

我已经知道如何通过 MatchFinder 找到该函数。现在,我想知道如何将其 AST 写入新文件(.c 或 .cpp)

提前致谢!

clang libtooling

3
推荐指数
1
解决办法
897
查看次数

Clang使用LibTooling Rewriter生成新文件?

我正在使用LibTooling进行一些分析。我知道如何遍历AST并将一些文本插入某处。例如,

Rewriter mywriter;
mywriter.InsertTextAfter(func->getLocEnd(),"Hello");
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否有任何方法可以保存代码?(天气将其保存到原始文件或生成新文件)

因为分析之后,我只能在终端上读取结果,这对我来说还不够。

c++ llvm clang libtooling

3
推荐指数
1
解决办法
1287
查看次数

如何在 Visual Studio 中使用 LibTooling/Clang?

我正在尝试使用 LibTooling 替换 C 代码文件中的函数和变量名称。因此,我下载了 llvm 并按照说明使用 GMake 和 Visual Studio 2015 在 Windows 中进行设置。

有许多教程(例如教程)我想遵循,但它们都假设您使用的是 Linux/Make,因此它们提供了一个 Makefile,以某种方式管理与 llvm 源代码的集成。

我想要做的是在 Visual Studio 中使用这些示例,但我不知道从哪里开始 - 我可以在给定的 (llvn.sln) 解决方案中创建一个新项目并在那里添加代码吗?我如何告诉 Visual Studio 包含 clang 源(如我提到的那些 Makefile 中所定义)?

cmake clang visual-studio llvm-clang libtooling

2
推荐指数
1
解决办法
2272
查看次数

lang-如何检索“ Expr”作为字符串?

我正在使用Clang / libtooling(ASTComsumer带有Matcher)来访问所有return语句(ReturnStmt)。我需要提取return字符串形式的关键字之后的表达式,以便可以将其放入替换return语句的宏中。

例如,我要替换以下行:

return somefunc() + 1;
Run Code Online (Sandbox Code Playgroud)

FUNCTION_EXIT(somefunc() + 1); // FUNCTION_EXIT is a C macro
Run Code Online (Sandbox Code Playgroud)

return进行一些记录后,宏将从函数中获取。

我正在使用ReturnStmt::getRetValue()该返回值,Expr并尝试以字符串形式获取它(以便可以将其传递给宏),但是我还没有找到一种方法。有没有一种方法可以分类Expr

clang llvm-clang libtooling

2
推荐指数
1
解决办法
567
查看次数