5

在我的代码库上运行 cppcheck 并收到以下错误:

Dangerous iterator comparison using operator< on 'std::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提交和修复的。

4

1 回答 1

6

这是 cppcheck 中的一个错误。

如果我们查看rulestlBoundaries()的代码,它触发的容器是:

"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并且此票豁免:http vector: //sourceforge.net/apps/trac/cppcheck/ticket/313

于 2014-06-16T16:12:50.177 回答