ITER.END.DEREF.MIGHT

可取消引用末端迭代器

ITER 检查器可以发现容器中与迭代器相关的问题。ITER.END.DEREF.MIGHT 检查器可标记当迭代器的值可能等于 end() 或 rend() 时取消引用迭代器的实例。使用迭代器(尽管会对其进行检查)时或在其很难被发现的其他程序分支中时,可能会发生这种取消引用。

漏洞与风险

使用无效迭代器一般会导致未定义的行为。例如,当迭代器可以等于 end() 或 rend() 时取消引用迭代器会导致不可预测的内存访问。

缓解与预防

为了避免发生该问题,在代码中添加 check,以确保迭代器的值不等于 end() 或 rend()。

漏洞代码示例

复制
   #include <set>
   using namespace std;
   int foo(set<int>& cont)
   {
     set<int>::iterator i = cont.begin();
     if (*i < 100)
       return *i;
     return 100;
   } 

如果该示例中的容器“cont”为空,则迭代器“i”的值将等于 cont.end()。在该案例中,取消引用“i”无效,并会生成未定义的结果。

修正代码示例

复制
   int foo(set<int>& cont)
   {
     set<int>::iterator i = cont.begin();
     if ( (i != cont.end()) && (*i < 100) )
       return *i;
     return 100;
   } 

在该修正代码示例中,在第 4 行添加的 check 可以确保迭代器 i 不等于 cont.end()。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。