问题标签 [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.
c++ - 无法在 clang 中 dyn_cast 指向 DeclRefExpr 的表达式指针
我正在研究clang libtooling,我需要赋值操作的左侧,
所以我曾经VisitBinaryOperator(BinaryOperator *B)
得到左手边,我对它做了一些研究并通过以下方式实现
这是我的示例程序
对于这个程序VisitBinaryOperator
函数应该进入 if 条件,因为 b[0],b[1],abc[1] 在 main 函数中被引用。
但控制不仅仅进入内部,而且我也无法调试它。
请让我知道这个问题的答案。
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?
clang - 在 Clang 中使用 ParentMap
网上好像没有例子,根据文档Path,ParentMap的构造函数接受“Stmt *ASTRoot”,这可能意味着稍后ParentMap实例会在“ASTRoot”下的AST子树下找到parent。但是如何获取翻译单元的根节点呢?我试过了
目标是围绕根节点创建一个 ParentMap,然后在扫描过程中在其他 Visit*** 回调中使用它。但是 decl->getBody() 为空。decl->dump() 将打印所有内容,甚至第二次扫描 AST decl->getBody() 仍然为空。
如何获得 AST 的根 Stmt?使用 ParentMap 的正确/更好的方法是什么?
c++ - 如何在 clang libtooling 中编写我们自己的 DiagnosticConsumer?
当我将源文件作为输入提供给我的 libtooling 工具时,我想捕获源文件错误和警告。
例如考虑程序
主程序
所以铿锵发出警告implicitly declaring library function 'printf' with type 'int'.
如何在 clang libtooling 中捕获这些警告DiagnosticConsumer
?
visual-c++ - 是否可以将 Clang libtooling 与其他编译器一起使用?
我们有一个针对各种平台的产品。其中一些平台的编译使用 MSVC 而不是 clang。
我们使用 clang libtooling 接口,我们提供了一个 compile_commands.json 文件来指示如何编译每个翻译单元。clang 如何使用提供的 compile_commands.json 信息?它是否使用所有标志,但通过自己的编译器运行它?是否可以将 libtooling 与具有 MSVC 编译说明的 compile_commands.json 一起使用?每个平台的 compile_commands.json 是由我们的内部构建系统创建的,类似于 cmake 生成它的方式。
c++ - 使用 Clang LibTooling 扫描在模板化父类中调用本地类的 C++ 源
要扫描的源代码:
当使用 Clang LibTooling 扫描 AST 时,上面的代码在 VS2019 中运行良好:
在扫描源中访问此行的 CallExpr 时:
被调用者为 null,CallExpr 的转储为:
Clang 不会在扫描过程中报告错误(因为代码工作正常)。
在 LLVM 源代码中有:
为什么HC类型被认为是未知的?在不发出任何警告/错误的情况下扫描 AST 时是否会出现未知类型?如何访问这样的调用并提取有关其被调用者的信息?扫码有问题吗?
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
c++ - 如何多次使用 Clang LibTooling
使用 Clang LibTooling 的 Minimul 源代码,这是一种非常常见的方式:
调试应用程序的参数是:
这很好。
输出是(来自 main() 上面的方法“run”):
问题是 main() 使用相同的上述参数调用 run() 3 次,其中仅包含要扫描的 1 个源文件,但每次存储在 CommonOptionsParser 中的源扫描列表的大小都会增加一(每个项目在该列表是来自 argv 的相同文件输入),它似乎只是每次都将要扫描的源文件附加到列表中。
以上所有内容都保存在每次运行中新创建的临时变量中,那么 LibTooling 如何以及为什么保持上次运行的状态以及如何“重置”这些状态?
c++ - 如何让 RecursiveASTVisitor 中止当前子树
在使用 Clang LibTooling 的 RecursiveASTVisitor 时,如何告诉库中止对当前访问的 AST 节点下的子树的扫描?
RecursiveASTVisitor 在 AST 上使用深度优先遍历,很容易中止某些子树并继续遍历。
例如(请阅读代码中的注释):
我认为从 Visit*** 方法返回 false 会达到这个目标,但它确实告诉 lib 一起结束遍历,而不是跳过子树。
由于目标只是标题中描述的目标,因此不考虑 ASTMatchers。
c++ - 如何在 Clang LibTooling 中获取有关调用析构函数的信息?
在 C++ 中,编译器应在诸如删除关键字/作用域结束等位置隐式插入对析构函数的调用。在 C++ 中,对析构函数的调用应在编译时固定(尽管被调用者可以在运行时使用 vtables 决定)。(上面说的对吗?)
但是在使用 Clang LibTooling 时的 Clang AST 转储中,没有对 AST 中的析构函数的隐式调用。为了比较,在 AST 中有隐式生成的默认构造函数和析构函数节点,即使它们不存在于扫描的源代码中。
对于delete关键字,AST中有一个CXXDeleteExpr节点,但不包含析构函数的CXXDestructorDecl,只包含要删除的对象的类型。
对于其他类型的析构函数调用,AST 中根本没有节点。
然后在 Clang LibTooling 中如何获取有关在哪些位置调用析构函数的信息?