如何解决编写 Clang-Tidy 检查,如何确定指针在调用之前是否已初始化?
我正在尝试将一些静态检查从旧的内部 C++ 静态检查器移植到 clang-tidy。 因为我对这个工具真的很陌生,所以我很难做到这一点,我开始认为它不是做我想做的事情的合适工具。
所以基本上我目前正在尝试实现的是对指针初始化的检查。我想在使用之前验证本地指针是否已正确初始化。
例如,如果我采用此代码示例:
void method(const char *);
int main(int argc,char **argv){
const char * ptNotInit;
const char * ptInit = "hello";
method(ptNotInit);
method(ptInit);
return 0;
}
我想在方法(ptNotInit)上得到一个错误,因为我将一个 nullptr 传递给方法。
一开始我尝试了一个非常简单的匹配器:
Finder->addMatcher(varDecl(hasType(pointerType())).bind("pointerDeclaration"),this);
// and
const auto *MatchedPtDecl = Result.Nodes.getNodeAs<VarDecl>("pointerDeclaration");
if ( MatchedPtDecl->hasInit() == false )
// Do an error
所以我在 ptNotInit 和 argv 上得到一个错误,所以我添加了 MatchedPtDecl->isLocalVarDecl() 并且一切看起来都很好。 除了在我的代码示例中我添加:
ptNotInit = "Hello again";
method(ptNotInit);
当我显然在调用方法之前初始化它时,我仍然在 ptNotInit 上收到错误。 我猜VarDecl方法hasInit()只是申请变量的声明,解释为什么返回false?
所以我的问题是,如果 ptNotInit 已初始化,我如何知道何时调用方法(ptNotInit)?
Clang-tidy 看起来很强大,但我不知道如何找到缺少的东西,如果你明白我的意思...... 我尝试编写更复杂的匹配器来找到这样的 init
Finder->addMatcher(binaryOperator(hasOperatorName("="),hasLHS(declRefExpr(hasType(pointerType()),hasDeclaration(varDecl().bind("pointerDeclaration"))).bind("affectation")))
如果我的指针在 = 运算符的左侧,那应该是初始化...好吧为什么不,但最后我想知道没有初始化,我不想匹配初始化语法...也许我把问题倒退了。
任何提示都会有所帮助,或者如果您可以向我指出一个已经实现的检查器做类似的事情,那将是一个很大的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。