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 循环。 它还检测对包含指针的容器进行排序算法的调用。 其他类似的用法将无法找到,并且属于误报。

局限性