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++ 解析のチューニングを参照してください。