ITER.ADVANCE.NONADJACENT

反復子間の距離は 1 より大きい値にする

最後の引数が -1、0、1 以外の場合に以下の関数を使用して反復子を進めると、欠陥が報告されます。

  • 演算子 +

  • 演算子 +=

  • 演算子 -

  • 演算子 -=

  • std::prev

  • std::next

脆弱性とリスク

バッファオーバーフローは最も一般的なセキュリティ脆弱性であり、この欠陥はその脆弱性のサブクラスです (C++ STL 固有)。

脆弱コード例

コピー
#include <vector>
#include <iterator>
 
void noncompliant (const std::vector<int> & c)
{
  const size_t dist = 20;
  auto it = std::next (c.begin (), dist);
}

Klocwork で 7 行目について欠陥 ITER.ADVANCE.NONADJACENT が報告され、「7 行目で反復子 'c.begin()' の増分/減分値が 1 を超えている」ことが示されます。反復子 'it' の距離は 20 になっています。

修正コード例

コピー
#include <algorithm>
 
void compliant (const std::vector<int> & c)
{
  const size_t dist = 20;
  auto it = std::next (c.begin (), std::min (dist, c.size ()));
}

距離を示す引数が固定値ではなくなり、この場合は有効なものとなることが保証されます。

関連チェッカー