在我的代码库中运行cppcheck并收到以下错误:
Dangerous iterator comparison using operator< on 'std::deque'.
但是deque的迭代器是一个随机访问迭代器,随机访问迭代器支持不等式运算符。那是什么给出了什么?
示例:
#include <deque>
int main()
{
std::deque<int> d;
std::deque<int>::iterator di1 = d.begin();
std::deque<int>::iterator di2 = d.end();
if (di1 < di2)
{
// (error) Dangerous iterator comparison using operator< on 'std::deque'.
}
return 0;
}
编辑:此错误已通过cppcheck ticket #5926提交并修复。
答案 0 :(得分:6)
这是cppcheck中的一个错误。
如果我们查看rule stlBoundaries()
的代码,它触发的容器是:
"bitset|deque|list|forward_list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset"
但是,除deque
之外,priority_queue
也保证具有随机访问迭代器。
这条规则的基本原理是程序员可能会不小心写下:
for (auto it = container.begin(); it < container.end(); ++it)
...
类似于等效的整数索引for
循环,这可能实际上是为非随机访问迭代器编译的,并且某种转换为指针。
这是添加规则的原始trac项目:http://sourceforge.net/apps/trac/cppcheck/ticket/247并且此免票证vector
:http://sourceforge.net/apps/trac/cppcheck/ticket/313