问题标签 [libtooling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
136 浏览

c++ - 使用 Clang 插件将不推荐使用的标签添加到声明中

我有一个带有要弃用的函数声明的示例文件。我想添加此C++ 标记以使编译器在调用此函数时发出警告,如下所示:

我写了一个示例插件:

但是当我调用它时,它不会发出任何警告。如果我转储 ast,我会看到已添加弃用属性,但我没有收到任何警告。

如果我使用 HandleTopLevelDecls 它可以工作,但我需要匹配器来实现我想要的。

我的猜测是在遍历 ast 之后添加标签(第一个提示:getNodeAs 返回一个 const obj),因此添加标签为时已晚。

但是我认为通过覆盖 getActionType 我可以实现该结果,但似乎情况并非如此?

0 投票
0 回答
138 浏览

c++ - 使用 clang::rewriter 在多个文件上使用 Clang 工具 SIGBUS

我想使用 clang 运行一些源到源的转换。而不是使用 JSONCompilationDatabase 为输入 Im 使用 commonoptions。它对单个文件运行良好,但在多个文件上运行时,特别是在文件被覆盖后,它会收到 SIGBUS。问题必须与 clang::rewriter 有关,因为如果我删除 InsertText 或 overwritechangedfiles 调用它就可以工作。

GDB 也没有太大帮助,因为回溯位于 Clang 的 API 中。有关堆栈跟踪,请参见下文。

到目前为止的代码:

堆栈跟踪:

0 投票
1 回答
475 浏览

c++ - 如何在clang中打印完全合格的Expr?

我正在使用 clang 8.0.1 开发我的反射工具。现在我需要用所有完全限定的名称打印 Expr。

我已经尝试了将 FullyQualifiedName 位设置为 true 的内置 prettyPrint 函数。但它仍然给出不正确的结果。

对于这段代码:

它给了我

代替

而对于

作为 custom_attr 的值,它给了我

(仅Transform::static_over

这是我的打印代码:

0 投票
0 回答
40 浏览

clang - 有什么办法可以找到所有的宏扩展位置吗?

我想找到所有宏扩展位置来替换宏的定义。

我不知道我可以使用什么 API 来获取宏扩展位置。

我想找到所有宏扩展位置并将它们替换为 5.(4 位置)

0 投票
0 回答
156 浏览

c++ - 开发的 clangtool 在源代码树(运行时)之外找不到头文件

我正在开发一个基于 clang 的工具,我用它来处理由 clang 生成的 AST。现在我正在 llvm-project 树中进行开发(我克隆了整个存储库),如本教程中所述。如前所述,我创建了 CMakeLists.txt,并执行了教程中所示的 cmake 命令。

项目编译,输出二进制文件位于 build/bin 中,其他二进制文件位于 llvm-project 源代码树中。当我从 build/bin 执行我的二进制文件时,在解析输入的 c++ 文件时,一切顺利。

但是,当我将生成的二进制文件复制到我的主目录或其他任何地方并执行它时,在解析时,它无法找到标准头文件,例如 stddef.h:

我的问题是为什么它可以在一个地方而不是另一个地方找到标题?在其中一个论坛中,我发现:一些头文件(stddef.h、stdarg.h 和其他)随 Clang 一起提供——这些被称为内置包含。Clang 在相对于 clang 二进制文件位置的目录中搜索它们。

我检查了二进制文件最初所在的构建目录,它包含 lib/clang/include 目录,其中还有文件 stddef.h。是否有可能通过就地执行二进制文件,它找到了这条路径,当我将它复制到其他地方时,它找不到正确的路径?

编辑

我执行的命令是:

0 投票
0 回答
94 浏览

c++ - 使用 Libtooling ASTFrontendAction 解析函数调用约定时出错

我正在使用 Libtooling 来解析 Windows SDK 标头,但是在获取函数调用约定时存在问题,libtooling 总是返回__cdellWINAPI调用__stdcall约定,这是 Win32 API 的默认调用约定。

这是一个输入示例

这是我的函数访问者函数RecursiveASTVisitor

最后输出func->dumpColor();输入示例!

出于兼容性原因,我也使用/不使用此选项运行它,但根本没有区别:-(

任何想法?

更新

我发现了问题,这是因为#Clang 的默认编译配置。它是 64 位(在 64 位工具链中),并且在 64 位模式下无法__stdcall使用如果我使用 32 位版本(或 -m32 选项),那么它将正常工作

知道为什么它会在 64 位模式下发生吗?

0 投票
1 回答
173 浏览

c++ - 使用 clang Libtooling API 打印参数 (ParmVarDecl) 或字段 (FieldDecl) 的完全限定类型

类似于这个问题:Print the type of a parameter (ParmVarDecl) with clang API,我想将参数/字段类型作为字符串获取,但重要的是我希望类型是完全限定的,例如

我想拥有std::vector<n::A>,没有std::vector<A>

我试过这个解决方案:http ://clang-developers.42468.n3.nabble.com/Getting-the-fully-scoped-type-of-a-function-parameter-td4028221.html (getAsCXXRecordDecl() 和 getQualifiedNameAsString ()),但在这两种情况下都为我decl.getType()->getAsCXXRecordDecl()返回nullptr

更新:另外,这个解决方案如何在 clang 中打印完全合格的 Expr?没有帮助,因为我正在使用的 clang 7 中没有 PrintCanonicalTypes。

我想我必须升级到 clang 8 并再试一次。

0 投票
0 回答
276 浏览

c++ - 用于启用 RTTI 的 Windows 的预构建 libTooling(LLVM/Clang 工具)标头和 dll

这可能不是问这个问题的正确地方,但我在其他任何地方都找不到答案。

我想在 llvm 源代码树之外使用 libTooling 库创建一个静态分析器。在官方 llvm 网站上,我只找到了用于 clang 编译器的预构建二进制文件,但没有找到其他工具。

我知道我可以使用 RTTI=ON 标志来编译自己,但是使用我拥有的低端计算机,需要 5 个多小时,而且我也不想在我的计算机上复制 llvm 源代码。

先感谢您。

0 投票
1 回答
661 浏览

c++ - 如何获取使用全局变量的所有函数名称?

我正在使用 clang 开发 libtooling。我开发了一个工具来查找全局变量以及这些全局变量的引用位置。

现在,我想获取使用这些全局变量的函数名称。

这是示例代码

在这里,我想Var在 Function 中引用该全局变量display

如何使用 LibTooling clang 获取此输出?请让我知道是否有任何解决方案。

0 投票
1 回答
1549 浏览

c++ - 如何使用 clang libtooling 获取宏及其扩展?

我正在研究clang libtooling。

到目前为止,我设法通过visitDeclRefExpr(DeclRefExpr *DR)

但是我可以得到一个宏列表,其名称和扩展为字符串。

示例程序.c

我可以得到如下输出吗

如何使用 clang libtooling 实现此输出。如何使用 clang libtooling 实现?

请让我知道是否有解决此问题的方法。