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 ()));
}
距離を示す引数が固定値ではなくなり、この場合は有効なものとなることが保証されます。