如何解决clang-tidy如何确定是否存在空指针取消引用?
我收到 clang-tidy 的警告,抱怨vector
模板的基于范围的循环,该模板是 vector 的自定义实现。对于代码:
non_std::vector<int> v;
for (const int& e : v) {
}
clang-tidy抱怨取消引用空指针:
取消引用空指针(从变量'__begin3'中加载)[clang-analyzer- core.NullDereference]
从逻辑上讲,没有空指针取消引用。根据链接https://en.cppreference.com/w/cpp/language/range-for,基于范围的循环等效于(假设C ++ 17):
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
我已使用此等效代码重写了代码,但遇到了同样的问题。以下是clang-tidy的输出:
note: Assuming '__begin' is not equal to '__end' for (; __begin != __end; ++__begin) { ^ note: Loop condition is true. Entering loop body for (; __begin != __end; ++__begin) { ^ note: Null pointer value stored to '__begin' for (; __begin != __end; ++__begin) { ^ note: Assuming '__begin' is not equal to '__end' for (; __begin != __end; ++__begin) { ^ note: Loop condition is true. Entering loop body for (; __begin != __end; ++__begin) { ^ note: Dereference of null pointer (loaded from variable '__begin') const int& e = *__begin; ^
以下是我认为等效的代码:
non_std::vector<int> v;
{
auto && __range = v;
auto __begin = __range.begin();
auto __end = __range.end();
for ( ; __begin != __end; ++__begin) {
const int &e = *__begin;
}
}
对于循环体内的代码,Clang做出了错误的假设“将空指针值存储到'__begin'”。 std::vector
的相同代码不会引起此警告。
clang-tidy如何确定是否存在空指针取消引用?如何处理自定义容器的基于范围的循环?我可以使用自定义向量做任何事情来防止此问题吗?
以下是描述something similar的链接:
我的猜测是,clang-tidy具有std::vector
的快捷方式(假设实现正确),而对其他实现则不太宽容。
P.S。元素的int
类型在此仅出于简化目的。自定义矢量实现是一种广泛使用的专有库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。