gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:22:35 25 4
gpt4 key购买 nike

扫描源代码:

template <typename T>
class HB {
T m;
public:
void HBfunc1();
};

template <typename T>
void HB<T>::HBfunc1() {
class HC {
public:
void HCfunc2() { };
};
HC().HCfunc2();
}

void TestTemplate() { HB<int>().HBfunc1(); };

使用Clang LibTooling扫描AST时,以上代码在VS2019中可以正常工作:
virtual bool VisitCallExpr(CallExpr *call) {

std::cout << "VisitCallExpr: ";
if (call->getDirectCallee()) {
std::cout << " "<<call->getDirectCallee()->getQualifiedNameAsString();
}
else {
Decl *callee = call->getCalleeDecl();
if (!callee) {
std::cout << "\nNow dump call:\n";
call->dump();
}
}
std::cout<<"\n";
return true;
}

在扫描源中为此行访问CallExpr时:
HC().HCfunc2();

被调用者为null,而CallExpr的转储为:
VisitCallExpr:
Now dump call:
CallExpr 0x1c2ef83b3a0 '<dependent type>'
`-CXXDependentScopeMemberExpr 0x1c2ef83b348 '<dependent type>' lvalue .HCfunc2
`-CXXUnresolvedConstructExpr 0x1c2ef83b320 'class HC' 'class HC'

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

在LLVM源代码中有:
// This represents the type of an expression whose type is
// totally unknown, e.g. 'T::foo'. It is permitted for this to
// appear in situations where the structure of the type is
// theoretically deducible.
BUILTIN_TYPE(Dependent, DependentTy)

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

最佳答案

在这种情况下,通过将函数调用标记为未解析的(又称为依赖),Clang变得比较保守。 相关的内容仅出现在模板中。这意味着某些语法结构可能取决于模板参数。
HC类不是通常的类,您将拥有与HC的实例化数量一样多的单独的HB类。因此,如果HC不使用T,则将其放置在HBfunc1内几乎没有意义。否则,它确实是依赖的。 Clang倾向于安全,并且避免在smod不是依赖上下文定义时假设smth不是依赖

由于这些原因,拥有这样的AST节点绝对是正常的。这不是解析器错误,所有操作均按预期进行。根据有关被 call 者的确切信息,简短的答案是-分析模板时无法进行。但是,clang为每个实例生成AST。这些具有通常的AST结构,并且可以轻松访问。

我希望这些信息对你有用!

关于c++ - 使用Clang LibTooling扫描已调用模板化父类中的本地类的C++源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59477164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com