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' の末尾を決してポイントしないようにするためのガードが導入されました。