ITER.INAPPROPRIATE

コンテナーオブジェクトが不適切な反復子

ITER チェッカーはコンテナー内の反復子に関する問題を検出します。ITER.INAPPROPRIATE チェッカーは、反復子が 1 つのコンテナーに割り当てられ、別のコンテナーで使用されるインスタンスにフラグを立てます。

脆弱性とリスク

無効な反復子を使用すると、一般に、未定義の動作をします。たとえば、反復子を間違ったコンテナーで使用すると、プログラムが予想できない動作をする可能性があります。反復子が不適切なコンテナーで使用されるコードでは、結果は常に false になり、このため、アルゴリズムは想定した、または意図したとおりには動作しません。

脆弱コード例

コピー
   void foo(set<int>& cont1, set<int>& cont2)
   {
     set<int>::iterator i = cont1.find(100);
     if (i != cont1.end())
       cont2.erase(i);
   }

この例では、反復子 'i' はコンテナー 'cont1' に割り当てられ、その後、間違って 'cont2' で使用されています。

修正コード例

コピー
   void foo(set<int>& cont1, set<int>& cont2)
   {
     set<int>::iterator i = cont1.find(100);
     if (i != cont1.end())
   {
       i = cont2.find(100);
       if (i != cont2.end())
       cont2.erase(i);
   }

修正例では、'cont2' 用の正しい反復子が取得されています。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。