草庐IT

clang_complete

全部标签

c++ - 如何使用 Clang 查找所有成员字段读/写?

给定一个C++源代码,我想找到每个函数写入和读取的类字段。使用Clang前端执行此操作的最佳方法是什么?(我不要求对所有步骤进行详细解释;但是,作为一个有效解决方案的起点会很棒。)到目前为止,我尝试使用RecursiveASTVisitor解析语句,但很难跟踪节点连接。另外,我无法弄清楚如何跟踪以下内容:int&x=m_int_field;x++;这显然修改了m_int_field;但是给定一个Stmt是不可能知道的;所以AST遍历本身似乎不够。对我来说,一个好处是能够分别计算字段和子字段(例如,访问成员结构的三个字段)。示例:typedefstructY{intm_structfie

c++ - 使用 clang++ 和 g++ 的 SFINAE 和 CRTP 的一些魔法

代码下面的代码给出了不同的输出,带有和不带有*注释的行:#include#includetemplateusingbool_void_t=void;templatestructis_complete:std::false_type{};templatestructis_complete>:std::true_type{};templatestructBase{staticconstexprboolvalue=is_complete{};//usingmagic=bool_void_t;//*};structFoo:Base{};intmain(){std::cout输出Thelinem

c++ - clang 静态分析器跳过一些检查

我正在使用clang静态分析器4.0.0。对于下面的例子intfun(){intaa=1,bb=0;intcc=aa/bb;//1)devidebyzero.//Reportedbyclangint*pt=nullptr;inta=*pt;//2)nullpointerdereference.//NOTReportedbyclangintb;intc=a+b;//3)Unusedinitialization.//Reportedbyclangreturncc;}Clang静态分析器仅报告两个问题1和3,并跳过问题2。而如果我像这样改变问题的顺序intfun(){int*pt=nullp

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

采用以下代码:#includeconstexprstd::arraya{};static_assert(std::next(std::begin(a))==std::begin(a)+1);使用-std=c++17GCC可以完美地编译它,但Clang会提示该表达式不是整型常量表达式。看起来问题出在std::next上,但是在C++17中应该是constexpr。尽管如此,std::next在std库中,而不是在编译器本身中,因此发生了一些奇怪的事情。为了让事情变得更好,如果您将-stdlib=libc++传递给Clang,该示例将完美编译。这是怎么回事?谁对谁错?编辑这个问题似乎与cl

c++ - 为什么 GCC 在 Clang 不使用它的地方插入 mfence?

为什么GCC和Clang会为此代码(x86_64,-O3-std=c++17)生成如此不同的asm?#includeintglobal_var=0;intfoo_seq_cst(inta){std::atomicia;ia.store(global_var+a,std::memory_order_seq_cst);returnia.load(std::memory_order_seq_cst);}intfoo_relaxed(inta){std::atomicia;ia.store(global_var+a,std::memory_order_relaxed);returnia.loa

c++ - "vtable"链接器错误(涉及带有 "=default"的虚拟析构函数)- Clang 3.1 中的潜在错误?

我的代码中出现链接器错误。我已将其精确定位为以下最基本的要点。这段代码给出了链接器错误"vtableforFoo",referencedfrom:Foo::Foo()classFoo{public:Foo();virtual~Foo()=default;};Foo::Foo(){}但是这段代码没有给出任何错误:classFoo{public:Foo();virtual~Foo(){}};Foo::Foo(){}为什么?我认为=default基本上应该和那些空方括号做同样的事情。更新:我正在使用“AppleLLVM编译器4.1”,它是Xcode4.5.2的一部分。这可能是这个编译器中的错

c++ - 模板类中静态字段的初始化列表因 clang 而失败

以下代码片段在g++和clang++下运行良好://bsp1.ccclassA{public:A(int,charconst*);intvalue;constchar*name;};classB{public:staticconstAmany_as[];};AconstB::many_as[]{{0,"zero"},{1,"one"},{2,"two"},{3,"three"},{77,0}};当我更改要模板化的类B时://bsp2.ccclassA{public:A(int,charconst*);intvalue;constchar*name;};templateclassB{pu

c++ - 为 clang 工具启用 RTTI?

我正在尝试使用clang的libTooling来构建一个基本的源到源转换工具。我想使用boost::regex和boost::filesystem,但链接到它们需要异常并启用RTTI。根据clangmailinglist,应该可以在不破坏任何东西的情况下启用RTTI。就是说,我找不到指示构建系统启用RTTI的设置或变量。(我正在使用cmake)。我可以将-frtti和-fexceptions标志添加到编译器命令,但clang构建系统正在添加它自己的-fno-rtti,-fno-exceptions标志似乎具有更高的优先级。 最佳答案

c++ - 使用 g++ 4.9.0 打包扩展失败,但适用于 clang++ 3.4

对于下面的代码:templatestructSet{};templateusingTail=Set;templatestructMemberOf;templatestructMemberOf>{staticconstexprboolvalue=true;};templatestructMemberOf>{staticconstexprboolvalue=false;};templatestructMemberOf>{staticconstexprboolvalue=false||MemberOf>::value;};g++4.9.0给出:ts.cpp:27:63:error:packe

c++ - 无法使用 clang 编译代码,但可以使用 gcc

我正在尝试修复一个开源C++项目中的一些错误,而原作者目前忙于他的学术生活而无法提供帮助。通过macports安装的gcc-4.9代码编译得很好。我一直在命令行上使用lldb进行调试。但是,如果可能的话,我希望使用clang编译代码,因为这样我可以同时使用Xcode和lldb并使错误更容易隔离。当我尝试使用clang编译代码时,出现以下错误:Infileincludedfrom./src/include/hash.h:25:./src/include/hash_stream.h:18:11:error:calltofunction'operator>>'thatisneithervis