ITER.END.OUTPARAM.MUST

出力反復子としての 'end’ の使用

明らかにコンテナーの末尾をポイントする OutputIterator を STL アルゴリズムで使用すると、欠陥が報告されます。以下に、OutputIterator を受け入れる STL アルゴリズムのリストを示します。

アルゴリズム 引数番号
adjacent_difference 3
copy 3
copy_if 3
copy_n 3
exclusive_scan 3
fill_n 1
generate_n 1
inclusive_scan 3
merge 5
move 3
partial_sum 3
remove_copy 3
remove_copy_if 3
replace_copy 3
replace_copy_if 3
reverse_copy 3
rotate_copy 4
set_difference 5
set_intersection 5
set_symmetric_difference 5
set_union 5
transform 3
transform_exclusive_scan 3
transform_inclusive_scan 3
unique_copy 3

脆弱性とリスク

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

脆弱コード例

コピー
#include <vector>
#include <algorithm>
 
void noncompliant (std::vector<int> & v)
{
  auto it = v.begin ();
  if (it == v.end ())
  {
    std::fill_n (it, 5, 0);
  }
}

Klocwork で 9 行目について欠陥 ITER.END.OUTPARAM.MUST が報告され、「反復子 'it' は、[r]end() の呼び出しによって返される値と等しい可能性がある場合、9 行目で出力反復子として渡され、7 行目で反復子が [r]end() と比較される」ことが示されます。反復子 'it' がアルゴリズム fill_n への OutputIterator として使用され、明らかにコンテナー 'v' の末尾をポイントします。

修正コード例

コピー
void compliant (std::vector<int> & v)
{
  auto it = v.begin ();
  if (it != v.end ())
  {
    std::fill_n (it, 5, 0);
  }
}

アルゴリズム fill_n に渡される場合に反復子 'it' がコンテナー 'v' の末尾を決してポイントしないようにするためのガードが導入されました。