EN JP CN

ITER.INAPPROPRIATE.MULTIPLE

ITER.INAPPROPRIATE.MULTIPLE

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

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

脆弱性とリスク

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

脆弱コード例

1   #include <set>
2   using namespace std;
3    
4 
5   void foo(set<int>& cont1, set<int>& cont2, set<int>& cont3)
6   {
7       set<int>::iterator i = cont1.find(100);
8       set<int>::iterator j = cont2.find(200);
9       cont3.insert(i, j);
10  }
11   
12  int main() 
13  {
14      return 0;
13  }

この例では、反復子 'i' と反復子 'j' がそれぞれコンテナー 'cont1' と'cont2' に割り当てられ、'cont3' の範囲を指定するために使用されています。これは未定義の結果を生成します。Klocwork は、ITER.INAPPROPRIATE.MULTIPLE を 9 行目でレポートします。

拡張機能

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