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);
     }
   } 

この例では、関数は、'x' に等しいリスト 'cont' からすべての要素を削除することになっています。しかし、'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 knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。