ITER.END.DEREF.MUST

取消引用末端迭代器

ITER 检查器可以发现容器中与迭代器相关的问题。ITER.END.DEREF.MUST 检查器标记按照容器对象的 end() 或 rend() 方法的值显式检查迭代器,然后当其值可能等于 end() 或 rend() 时再取消引用迭代器的实例。

漏洞与风险

使用无效迭代器一般会导致未定义的行为。

缓解与预防

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

漏洞代码示例

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

如果在该示例中,第 9 行没有发生循环中断,则迭代器 i 的值将在循环后等于 cont.end()。在该案例中,取消引用“i”无效,并会生成未定义的结果。

修正代码示例

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

     if (i != cont.end())
      x += *i;
     return x;
   }

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

扩展

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