ITER.END.DEREF.MIGHT

end 反復子の逆参照の可能性

ITER チェッカーはコンテナー内の反復子に関する問題を検出します。ITER.END.DEREF.MIGHT チェッカーは、反復子の値が end() または rend() に等しくなる可能性があるときに、その反復子が逆参照されているインスタンスにフラグを立てます。このタイプの逆参照は、チェックを無視して反復子を使用する、または場所を特定しにくいプログラムのその他の分岐で反復子を使用することによって発生します。

脆弱性とリスク

無効な反復子を使用すると、一般に、未定義の動作をします。たとえば、反復子が end() または rend() に等しくなる可能性のある場合に反復子を逆参照すると、予想できないメモリアクセスを起こす可能性があります。

軽減と防止

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

脆弱コード例

コピー
   #include <set>
   using namespace std;
   int foo(set<int>& cont)
   {
     set<int>::iterator i = cont.begin();
     if (*i < 100)
       return *i;
     return 100;
   } 

この例でコンテナー 'cont' が空の場合、反復子 'i' の値は cont.end() に等しくなります。この場合、逆参照 'i' は無効になり、未定義の結果を生成します。

修正コード例

コピー
   int foo(set<int>& cont)
   {
     set<int>::iterator i = cont.begin();
     if ( (i != cont.end()) && (*i < 100) )
       return *i;
     return 100;
   } 

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

拡張機能

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