bugprone-nondeterministic-pointer-iteration-order¶
查找无序容器中指针的非确定性使用。
一个典型的例子是在指针容器上进行迭代。
{
int a = 1, b = 2;
std::unordered_set<int *> UnorderedPtrSet = {&a, &b};
for (auto i : UnorderedPtrSet)
f(i);
}
另一个例子是排序一个指针容器。
{
int a = 1, b = 2;
std::vector<int *> VectorOfPtr = {&a, &b};
std::sort(VectorOfPtr.begin(), VectorOfPtr.end());
}
对指针容器进行迭代可能会导致不同运行的程序中不同指针的顺序不同。 在某些情况下,这可能是可接受的行为,在其他情况下,这可能是意外行为。 由于这个原因,此检查是建议性的。
此检查仅检测无序集合和映射的基于范围的 for 循环。 它还检测对包含指针的容器进行排序算法的调用。 其他类似的用法将无法找到,并且属于误报。
局限性
此检查目前不检查非确定性迭代顺序是否可能是错误,而是将所有此类迭代标记为 bugprone。
std::reference_wrapper 尚未考虑。
仅考虑 for 循环,其他迭代器可以包含在改进中。