标签: libtooling

在clang-tidy中忽略系统头

tldr;>如何在clang-tidy中隐藏系统头文件中的警告?

我有以下最小示例源文件,它会在系统标头中触发一个铿锵有力的警告:

#include <future>

int main() {
  std::promise<int> p;
  p.set_value(3);
}
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 17.04上使用clang-tidy 4.0.0使用libstdc ++ 7.0.1调用它:

$ clang-tidy main.cpp -extra-arg=-std=c++14
Run Code Online (Sandbox Code Playgroud)

产量

Running without flags.
1 warning generated.
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/mutex:693:5: warning: Address of stack memory associated with local variable '__callable' is still referred to by the global variable '__once_callable' upon returning to the caller.  This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
    }
    ^
/home/user/main.cpp:5:3: note: Calling 'promise::set_value'
  p.set_value(3);
  ^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/future:1094:9: note: Calling '_State_baseV2::_M_set_result'
      { _M_future->_M_set_result(_State::__setter(this, std::move(__r))); }
        ^
/usr/lib/gcc/x86_64-linux-gnu/7.0.1/../../../../include/c++/7.0.1/future:401:2: note: Calling 'call_once' …
Run Code Online (Sandbox Code Playgroud)

c++ clang clang-static-analyzer libtooling clang-tidy

19
推荐指数
2
解决办法
5460
查看次数

如何使用Clang和LibTooling的标准库

我想使用Clang和LibTooling来创建一些C++源代码分析和转换工具.我按照教程构建了Clang和LibTooling ,并且我已经能够使用我构建的Clang二进制文件运行并创建一些分析工具并编译C++程序.但是,如果我包含标准库中的标头(在源文件或我的工具中),则在编译或运行源文件/工具时会遇到问题.例如,如果我对以下C++源文件运行clang-check:

#include <iostream>

int main() {
  std::cout << "Hello";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到"致命错误:找不到'iostream'文件".(注意:我可以编译C++程序,例如那些使用用户定义类的程序,而不是使用标准库的C++程序.)为了解决这个问题,我构建了libc ++(遵循指南,在llvm/project中构建它)我构建LLVM和Clang的目录,但是我仍然无法使用Clang和使用libc ++的工具.现在,如果我尝试使用以下方法编译测试文件:

export CPLUS_INCLUDE_PATH="~/clang-llvm/llvm/projects/libcxx/include"
export LD_LIBRARY_PATH="~/clang-llvm/llvm/projects/libcxx/lib"
~/clang-llvm/llvm/build/bin/clang++ ~/Documents/main.cpp
Run Code Online (Sandbox Code Playgroud)

然后我得到"致命错误:'找不到'unistd.h'文件".所以我的问题是:我如何正确地指出Clang和我的工具使用libc ++?

我正在运行OS X Yosemite 10.10并使用Clang 3.6.0.

c++ macos clang libc++ libtooling

14
推荐指数
1
解决办法
2452
查看次数

OCLint ASTMatcher规则.匹配NS_ENUM

我正在尝试创建一个匹配typedef enumtypedef NS_ENUM声明的OCLint规则,但收效甚微.我有一个Objective-C文件(TestClass.m),其中包含以下枚举声明:

typedef NS_ENUM(NSInteger, TestEnum) {
    TestEnumNone,
    TestEnumSome,
    TestEnumAll
};

typedef enum {
    othertestvalue = 0,
    othertestvalue1,
    othertestvalue2
} OtherTestEnum;
Run Code Online (Sandbox Code Playgroud)

使用此命令转储AST:

clang -Xclang -ast-dump -fsyntax-only Classes/TestClass.m -- | grep Enum
Run Code Online (Sandbox Code Playgroud)

给我这个输出包含这个:

|-TypedefDecl 0x7f9d3accd630 <col:1, col:28> col:28 TestEnum 'enum TestEnum':'enum TestEnum'
|-EnumDecl 0x7f9d3accd6a8 prev 0x7f9d3accd530 </System/Library/Frameworks/CoreFoundation.framework/Headers/CFAvailability.h:171:57, Classes/TestClass.m:71:1> line:67:28 TestEnum 'NSInteger':'long'
| |-EnumConstantDecl 0x7f9d3accd738 <line:68:5> col:5 TestEnumNone 'NSInteger':'long'
| |-EnumConstantDecl 0x7f9d3accd788 <line:69:5> col:5 TestEnumSome 'NSInteger':'long'
| `-EnumConstantDecl 0x7f9d3accd7d8 <line:70:5> col:5 TestEnumAll 'NSInteger':'long'
|-EnumDecl 0x7f9d3accd828 <line:73:9, line:77:1> line:73:9 …
Run Code Online (Sandbox Code Playgroud)

c++ clang abstract-syntax-tree oclint libtooling

10
推荐指数
1
解决办法
233
查看次数

使用Clang的libtooling匹配#includes(或#defines)的正确方法是什么?

我正在编写一个libtooling重构工具.我有一个类,比方说Foo,在一个标题中定义foo.h.我想看看是否foo.h包含在文件中.目前,要检查是否bar.cc包含foo.h,我只是匹配使用recordDecl(hasName("Foo")).这是有效的,因为预处理class Foo { ... };后将存在于bar.ccAST 内部,如果bar.cc包含foo.h.

但是,如果,例如,bar.cc包括cat.h哪些包括,则这不起作用foo.h.我想bar.cc明确包括foo.h.

此外,我希望能够匹配#define宏.

我编写工具的方式使得这两个目标无法实现,因为我匹配的AST已经过预处理.我正在努力做甚么可能吗?我Preprocessor在Clang的Doxygen页面上找到了类参考,但我还没有找到我正在寻找的东西.

c++ clang libtooling

8
推荐指数
1
解决办法
1779
查看次数

如何在 clang 的 AST 中找到隐式删除的默认构造函数?

考虑以下结构体定义foo.cc

struct Foo
{
  int &bar;
};
Run Code Online (Sandbox Code Playgroud)

因为bar具有引用类型,所以隐式普通默认构造函数Foo::Foo()被隐式删除。然而,这个事实似乎并没有反映在 clang 生成的 AST 中。例如,运行clang -Xclang -ast-dump foo.cc结果为:

struct Foo
{
  int &bar;
};
Run Code Online (Sandbox Code Playgroud)

所以这里看起来像存在一个隐式的普通默认构造函数,但没有提到它被删除。同样,clang::CXXRecordDeclAPI 似乎也没有提供确定这一点的方法。但此时(语义分析之后)该信息不应该可用吗?如何使用 clang AST API 来查明某个类的隐式普通默认构造函数是否被隐式删除?

c++ clang abstract-syntax-tree libtooling

7
推荐指数
1
解决办法
310
查看次数

clang:自定义属性在AST中不可见

我按照官方手册中的说明在clang中实现了自定义属性:http : //clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute

所以我在Attr.td中添加了以下代码:

def MyAttr: InheritableAttr {

let Spellings = [GNU<"my_attr">, CXX11<"me", "my_attr">, GCC<"my_attr">, Declspec<"my_attr">];
  let Subjects = SubjectList<[Var, Function, CXXRecord]>;

  let Documentation = [MyAttrDocs];

}
Run Code Online (Sandbox Code Playgroud)

以及文档AttrDocs.td。重建clang后,它显然知道属性,因为使用它时我没有收到未知的属性警告。我什至可以使用libtooling访问新的属性类,但是即使将行添加let ASTNode = 1到属性定义中,该属性也不会显示在AST中。

还有什么我需要考虑的吗,或者可能是什么问题?

c++ attributes clang abstract-syntax-tree libtooling

6
推荐指数
1
解决办法
1560
查看次数

clang libTooling:如何找到 AST 项目来自哪个标题?

在网络上找到的 clang 工具示例总是在玩具示例上运行,这些示例通常都是非常简单的 C 程序。

我正在构建一个对 C++ 代码执行源到源转换的工具,这显然是一项非常非常具有挑战性的任务,但 clang 可以胜任这项任务。

我现在面临的问题是,clang 为任何使用 STL 的 C++ 代码生成的 AST 是巨大的。例如,我有一些 C++ 代码,其中clang++ -ast-dump ... | wc -l67,018 行令人毛骨悚然的 AST gobbledygook!

其中 99% 是标准库的东西,我的目标是在我的源到源元编程任务中忽略它们。所以,为了实现这一点,我想简单地过滤掉文件。假设我只想查看我正在分析的项目标头中的类定义(并忽略所有标准库标头的内容),我只需要弄清楚我CXXRecordDecl的每个标头来自哪个标头!

这能做到吗?

编辑:希望是一种解决方法。现在试试这个......重要的是它必须告诉我decls来自的标题,而不是对应于翻译单元的cpp文件。

c++ clang abstract-syntax-tree libtooling

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

使用 libtooling 获取完全限定的模板模板参数名称

我正在尝试使用模板模板参数libtooling来打印CXXRecordDecl模板类的实例化。不幸的是,模板模板参数的字符串表示不是完全限定的(例如,它缺少命名空间)。

我正在CXXRecordDecl使用以下代码打印:

clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);
Run Code Online (Sandbox Code Playgroud)

这是一个示例,我希望输出为ns::A<ns::B>,但我得到ns::A<B>

clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);
Run Code Online (Sandbox Code Playgroud)

如何使用模板模板参数打印类的完全限定名称?

在相关说明中,有没有办法在不调用 的情况下做到这一点getCanonicalTypeInternal,这听起来像是一个内部函数?

[编辑 #1]我也试过decl->getQualifiedNameAsString(),它完全省略了模板参数和输出ns::A

[编辑#2] Cling 用一组问题交换另一组问题。它确实为模板模板参数正确生成了完全限定的类型。但是,它会为函数(和函数指针)的参数和返回类型生成非限定名称。例如,下面的代码产生输出ns::A<void (B)>而不是ns::A<void (ns::B)>

namespace ns {

template <template <class> class T>
class A {
  T<int> x;
};

template <class T>
class B {
  T y;
};

} // namespace ns

int main(int argc, …
Run Code Online (Sandbox Code Playgroud)

c++ clang template-templates libtooling

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

如何在clang AST中获取无效/未解析类型的实际名称

考虑以下代码

int function()
{
  unknownType variable;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,“unknownType”在编译时没有被解析,所以 clang 会将默认类型作为 int 放入 AST 并将声明标记为无效。

现在的问题是在遍历 AST 时,如何获取名称“unknownType”。使用现有API获取类型名称将给出int,其来源范围也是无效的。

有人遇到过这样的问题吗?请帮忙?

谢谢,赫曼特

c++ parsing abstract-syntax-tree llvm-clang libtooling

5
推荐指数
0
解决办法
237
查看次数

如何多次使用 Clang LibTooling

使用 Clang LibTooling 的最小源,这是一种非常常见的方式:

#include "pch.h"

#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/CommandLine.h"
#include "clang/Driver/Options.h"
#include "clang/AST/AST.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Frontend/ASTConsumers.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "clang/Rewrite/Core/Rewriter.h"
#include <iostream>

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

class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> {
public:
    explicit ExampleVisitor(CompilerInstance *CI) {}
};

class ExampleASTConsumer : public ASTConsumer {
private:
    CompilerInstance *CI;
public: 
    explicit ExampleASTConsumer(CompilerInstance *CI) : CI(CI) …
Run Code Online (Sandbox Code Playgroud)

c++ clang libtooling

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