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