ITER.END.DEREF.MUST
end 反復子の逆参照
ITER チェッカーはコンテナー内の反復子に関する問題を検出します。ITER.END.DEREF.MUST チェッカーは、反復子がコンテナーオブジェクトの end() メソッドまたは rend() メソッドの値に対して明示的にチェックされ、逆参照されるインスタンスで、その値が end() または rend() に等しくなる可能性がある場合にフラグを立てます。
脆弱性とリスク
無効な反復子を使用すると、一般に、未定義の動作をします。
軽減と防止
この問題を回避するには、コードにチェックを追加して、反復子が end() または rend() の値に等しくならないことを確認します。
脆弱コード例
コピー
#include <set>
using namespace std;
int foo(set<int>& cont)
{
int x = 0;
set<int>::iterator i;
for (i = cont.begin(); i != cont.end(); i++)
{
x += *i;
if (x > 100)
break;
}
x += *i;
return x;
}
この例の 9 行目でループの break が発生しない場合、ループの後で反復子 'i' の値は cont.end() に等しくなります。この場合、逆参照 'i' は無効になり、未定義の結果を生成します。
修正コード例
コピー
int foo(set<int>& cont)
{
int x = 0;
set<int>::iterator i;
for (i = cont.begin(); i != cont.end(); i++)
{
x += *i;
if (x > 100)
break;
}
if (i != cont.end())
x += *i;
return x;
}
修正した例では、12 行目に追加されたチェックにより、反復子 'i' が cont.end() に等しくならないことを確認します。
関連チェッカー
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。