ITER.END.DEREF.MUST
取消引用末端迭代器
ITER 检查器可以发现容器中与迭代器相关的问题。ITER.END.DEREF.MUST 检查器标记按照容器对象的 end() 或 rend() 方法的值显式检查迭代器,然后当其值可能等于 end() 或 rend() 时再取消引用迭代器的实例。
漏洞与风险
使用无效迭代器一般会导致未定义的行为。
缓解与预防
为了避免发生该问题,在代码中添加 check,以确保迭代器的值不等于 end() 或 rend()。
漏洞代码示例
复制
#include <set>
using namespace std;
int foo(set<int>& cont)
{
int x = 0;
set<int>::iterator i;
for (i = cont.begin(); i != cont.end(); i++)
{
x += *i;
if (x > 100)
break;
}
x += *i;
return x;
}
如果在该示例中,第 9 行没有发生循环中断,则迭代器 i 的值将在循环后等于 cont.end()。在该案例中,取消引用“i”无效,并会生成未定义的结果。
修正代码示例
复制
int foo(set<int>& cont)
{
int x = 0;
set<int>::iterator i;
for (i = cont.begin(); i != cont.end(); i++)
{
x += *i;
if (x > 100)
break;
}
if (i != cont.end())
x += *i;
return x;
}
在该修正代码示例中,在第 12 行添加的 check 可以确保迭代器 i 不等于 cont.end()。
相关检查器
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。