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