ITER.END.DEREF.MIGHT
可取消引用末端迭代器
ITER 检查器可以发现容器中与迭代器相关的问题。ITER.END.DEREF.MIGHT 检查器可标记当迭代器的值可能等于 end() 或 rend() 时取消引用迭代器的实例。使用迭代器(尽管会对其进行检查)时或在其很难被发现的其他程序分支中时,可能会发生这种取消引用。
漏洞与风险
使用无效迭代器一般会导致未定义的行为。例如,当迭代器可以等于 end() 或 rend() 时取消引用迭代器会导致不可预测的内存访问。
缓解与预防
为了避免发生该问题,在代码中添加 check,以确保迭代器的值不等于 end() 或 rend()。
漏洞代码示例
复制
#include <set>
using namespace std;
int foo(set<int>& cont)
{
set<int>::iterator i = cont.begin();
if (*i < 100)
return *i;
return 100;
}
如果该示例中的容器“cont”为空,则迭代器“i”的值将等于 cont.end()。在该案例中,取消引用“i”无效,并会生成未定义的结果。
修正代码示例
复制
int foo(set<int>& cont)
{
set<int>::iterator i = cont.begin();
if ( (i != cont.end()) && (*i < 100) )
return *i;
return 100;
}
在该修正代码示例中,在第 4 行添加的 check 可以确保迭代器 i 不等于 cont.end()。
相关检查器
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。