问题标签 [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 投票
1 回答
207 浏览

c++ - 无法在 clang 中 dyn_cast 指向 DeclRefExpr 的表达式指针

我正在研究clang libtooling,我需要赋值操作的左侧,

所以我曾经VisitBinaryOperator(BinaryOperator *B)得到左手边,我对它做了一些研究并通过以下方式实现

这是我的示例程序

对于这个程序VisitBinaryOperator函数应该进入 if 条件,因为 b[0],b[1],abc[1] 在 main 函数中被引用。

但控制不仅仅进入内部,而且我也无法调试它。

请让我知道这个问题的答案。

0 投票
0 回答
227 浏览

c++ - 如何在 clang libtooling 中启用 try-catch?

我想在 clang libtooling 中使用 try catch 语句,但默认情况下它采用编译选项作为-fno-rtti and -fno-exceptions

如果我在 clang libtooling 中使用 try-catch 语句,则会抛出错误消息

samplecode

Cannot Use try with Exception Disabled.

如何为 clang libtooling 程序启用 try catch?

0 投票
1 回答
122 浏览

clang - 在 Clang 中使用 ParentMap

网上好像没有例子,根据文档Path,ParentMap的构造函数接受“Stmt *ASTRoot”,这可能意味着稍后ParentMap实例会在“ASTRoot”下的AST子树下找到parent。但是如何获取翻译单元的根节点呢?我试过了

目标是围绕根节点创建一个 ParentMap,然后在扫描过程中在其他 Visit*** 回调中使用它。但是 decl->getBody() 为空。decl->dump() 将打印所有内容,甚至第二次扫描 AST decl->getBody() 仍然为空。

如何获得 AST 的根 Stmt?使用 ParentMap 的正确/更好的方法是什么?

0 投票
0 回答
55 浏览

c++ - 如何在 clang libtooling 中编写我们自己的 DiagnosticConsumer?

当我将源文件作为输入提供给我的 libtooling 工具时,我想捕获源文件错误和警告。

例如考虑程序

主程序

所以铿锵发出警告implicitly declaring library function 'printf' with type 'int'.

如何在 clang libtooling 中捕获这些警告DiagnosticConsumer

0 投票
1 回答
128 浏览

visual-c++ - 是否可以将 Clang libtooling 与其他编译器一起使用?

我们有一个针对各种平台的产品。其中一些平台的编译使用 MSVC 而不是 clang。

我们使用 clang libtooling 接口,我们提供了一个 compile_commands.json 文件来指示如何编译每个翻译单元。clang 如何使用提供的 compile_commands.json 信息?它是否使用所有标志,但通过自己的编译器运行它?是否可以将 libtooling 与具有 MSVC 编译说明的 compile_commands.json 一起使用?每个平台的 compile_commands.json 是由我们的内部构建系统创建的,类似于 cmake 生成它的方式。

0 投票
1 回答
80 浏览

c++ - 使用 Clang LibTooling 扫描在模板化父类中调用本地类的 C++ 源

要扫描的源代码:

当使用 Clang LibTooling 扫描 AST 时,上面的代码在 VS2019 中运行良好:

在扫描源中访问此行的 CallExpr 时:

被调用者为 null,CallExpr 的转储为:

Clang 不会在扫描过程中报告错误(因为代码工作正常)。

在 LLVM 源代码中有:

为什么HC类型被认为是未知的?在不发出任何警告/错误的情况下扫描 AST 时是否会出现未知类型?如何访问这样的调用并提取有关其被调用者的信息?扫码有问题吗?

0 投票
1 回答
164 浏览

clang - 如何从 Clang LibTooling 中的 Expr 获取 ASTContext?

对于 Decl,有 getASTContext(),但是作为 Decl 的 AST 节点,为什么 Expr 没有这样的功能以及如何从 Expr 中获取 ASTContext?

注意:Decl 是https://clang.llvm.org/doxygen/classclang_1_1Decl.html,Expr 是https://clang.llvm.org/doxygen/classclang_1_1Expr.html

0 投票
3 回答
314 浏览

c++ - 如何多次使用 Clang LibTooling

使用 Clang LibTooling 的 Minimul 源代码,这是一种非常常见的方式:

调试应用程序的参数是:

这很好。

输出是(来自 main() 上面的方法“run”):

问题是 main() 使用相同的上述参数调用 run() 3 次,其中仅包含要扫描的 1 个源文件,但每次存储在 CommonOptionsParser 中的源扫描列表的大小都会增加一(每个项目在该列表是来自 argv 的相同文件输入),它似乎只是每次都将要扫描的源文件附加到列表中。

以上所有内容都保存在每次运行中新创建的临时变量中,那么 LibTooling 如何以及为什么保持上次运行的状态以及如何“重置”这些状态?

0 投票
1 回答
287 浏览

c++ - 如何让 RecursiveASTVisitor 中止当前子树

在使用 Clang LibTooling 的 RecursiveASTVisitor 时,如何告诉库中止对当前访问的 AST 节点下的子树的扫描?

RecursiveASTVisitor 在 AST 上使用深度优先遍历,很容易中止某些子树并继续遍历。

例如(请阅读代码中的注释):

我认为从 Visit*** 方法返回 false 会达到这个目标,但它确实告诉 lib 一起结束遍历,而不是跳过子树。

由于目标只是标题中描述的目标,因此不考虑 ASTMatchers。

0 投票
0 回答
201 浏览

c++ - 如何在 Clang LibTooling 中获取有关调用析构函数的信息?

在 C++ 中,编译器应在诸如删除关键字/作用域结束等位置隐式插入对析构函数的调用。在 C++ 中,对析构函数的调用应在编译时固定(尽管被调用者可以在运行时使用 vtables 决定)。(上面说的对吗?)

但是在使用 Clang LibTooling 时的 Clang AST 转储中,没有对 AST 中的析构函数的隐式调用。为了比较,在 AST 中有隐式生成的默认构造函数和析构函数节点,即使它们不存在于扫描的源代码中。

对于delete关键字,AST中有一个CXXDeleteExpr节点,但不包含析构函数的CXXDestructorDecl,只包含要删除的对象的类型。

对于其他类型的析构函数调用,AST 中根本没有节点。

然后在 Clang LibTooling 中如何获取有关在哪些位置调用析构函数的信息?