ITER.CONTAINER.MODIFIED

无效迭代器

ITER 检查器可以发现容器中与迭代器相关的问题。ITER.CONTAINER.MODIFIED 检查器会标记迭代器因某个运算修改了其容器对象而失效后仍在使用的实例。

漏洞与风险

使用无效迭代器一般会导致未定义的行为。例如,在某个函数修改了迭代器的容器后使用迭代器会导致意外的程序操作。包含迭代器和已修改容器的代码会损坏,并且算法也不会按照预期或意图执行。

漏洞代码示例

复制
   void foo(list<int>& cont, int x)
   {
     list<int>::iterator i;
     for (i = cont.begin(); i != cont.end(); i++)
     {
       if (*i == x)
         cont.erase(i);
     }
   } 

在该示例中,函数应该移除列表“cont”中所有等于“x”的元素。然而,调用“cont.erase(i)”会使迭代器“i”失效,这样“i”的后续增量就会成为无效操作。

修正代码示例

复制
   void foo(list<int>& cont, int x)
   {
     list<int>::iterator i;
     for (i = cont.begin(); i != cont.end();)
     {
       if (*i == x)
         i =cont.erase(i);
       else i++;
     }
   } 

在该修正代码示例中,迭代器在失效后被重新分配。

扩展

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