EN JP CN

ITER.END.DEREF.MUST

ITER.END.DEREF.MUST

end 反復子の逆参照

ITER チェッカーはコンテナー内の反復子に関する問題を検出します。ITER.END.DEREF.MUST チェッカーは、反復子がコンテナーオブジェクトの end() メソッドまたは rend() メソッドの値に対して明示的にチェックされ、逆参照されるインスタンスで、その値が end() または rend() に等しくなる可能性がある場合にフラグを立てます。

脆弱性とリスク

無効な反復子を使用すると、一般に、未定義の動作をします。

軽減と防止

この問題を回避するには、コードにチェックを追加して、反復子が end() または rend() の値に等しくならないことを確認します。

脆弱コード例

1   #include <set>
2   using namespace std;
3   int foo(set<int>& cont)
4   {
5     int x = 0;
6     set<int>::iterator i;
7     for (i = cont.begin(); i != cont.end(); i++)
8     {
9       x += *i;
10       if (x > 100)
11        break;
12     }
13     x += *i;
14     return x;
15   } 

この例の 9 行目でループの break が発生しない場合、ループの後で反復子 'i' の値は cont.end() に等しくなります。この場合、逆参照 'i' は無効になり、未定義の結果を生成します。

修正コード例

1   int foo(set<int>& cont)
2   {
3     int x = 0;
4     set<int>::iterator i;
5     for (i = cont.begin(); i != cont.end(); i++)
6     {
7       x += *i;
8       if (x > 100)
9         break;
10     }

11     if (i != cont.end())
12      x += *i;
13     return x;
14   } 

修正した例では、11 行目に追加されたチェックにより、反復子 'i' が cont.end() に等しくならないことを確認します。

拡張機能

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