如何从 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”的成员
我想在Mac OS X Yosemite上使用clang的LibTooling。Clang的文档仅显示了如何构建clang和llvm,但我需要的是LibTooling,而不是整个clang(xcode已经提供了clang和llvm)。如何在不构建另一个clang的情况下构建LibTooling?
我正在尝试使用 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 …
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) 我有一个header.h带有宏定义的标头,该宏定义扩展为类定义和一个test.cpp包含header.h并使用该宏的源文件。然后我用来RecursiveASTVisitor访问所有CXXRecordDecl的。
当我访问 CXXRecordDecl(在 test.cpp 中)并查询其扩展的 CXXRecordDecl 时,该位置指向SourceLocation-宏定义的位置。dump()header.h
我需要为这个 CXXRecordDecl 获取的是SourceLocation宏扩展 - 在我的情况下它应该是test.cpp。
提前致谢。
我是 Clang 的新手,他试图通过 libtooling 分析 AST。我想找到一个特定的函数,并将其 AST 从原始源文件移动到一个新文件。
我已经知道如何通过 MatchFinder 找到该函数。现在,我想知道如何将其 AST 写入新文件(.c 或 .cpp)
提前致谢!
我正在使用LibTooling进行一些分析。我知道如何遍历AST并将一些文本插入某处。例如,
Rewriter mywriter;
mywriter.InsertTextAfter(func->getLocEnd(),"Hello");
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否有任何方法可以保存代码?(天气将其保存到原始文件或生成新文件)
因为分析之后,我只能在终端上读取结果,这对我来说还不够。
我正在尝试使用 LibTooling 替换 C 代码文件中的函数和变量名称。因此,我下载了 llvm 并按照说明使用 GMake 和 Visual Studio 2015 在 Windows 中进行设置。
有许多教程(例如本教程)我想遵循,但它们都假设您使用的是 Linux/Make,因此它们提供了一个 Makefile,以某种方式管理与 llvm 源代码的集成。
我想要做的是在 Visual Studio 中使用这些示例,但我不知道从哪里开始 - 我可以在给定的 (llvn.sln) 解决方案中创建一个新项目并在那里添加代码吗?我如何告诉 Visual Studio 包含 clang 源(如我提到的那些 Makefile 中所定义)?
我正在使用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?