2014-06-16 8 views
5

मेरी कोड के आधार पर cppcheck Ran और निम्न त्रुटि प्राप्त:मैं 'std :: deque' पर ऑपरेटर <का उपयोग क्यों नहीं कर सकता?

Dangerous iterator comparison using operator< on 'std::deque'. 

लेकिन एक Deque के इटरेटर एक यादृच्छिक अभिगम इटरेटर है, और रैंडम एक्सेस iterators असमानता ऑपरेटरों समर्थन करते हैं। तो क्या देता है?

उदाहरण:

#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

सुनिश्चित करें कि आप एक ही कंटेनर से दो iterators तुलना कर रहे हैं सुनिश्चित करें। मुझे नहीं पता कि इसमें कितनी दूर cppcheck जाता है, इसलिए यह हमेशा उस संभावना के कारण शिकायत कर सकता है। – ghostofstandardspast

+1

कृपया इस त्रुटि को ट्रिगर करने वाली रेखा दिखाएं। – dasblinkenlight

+1

हमें प्रश्न कोड –

उत्तर

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 भी रैंडम एक्सेस iterators के लिए गारंटी है।

इस नियम के पीछे तर्क यह है कि प्रोग्रामर गलती से लिख सकते है:

for (auto it = container.begin(); it < container.end(); ++it) 
    ... 

सादृश्य द्वारा बराबर पूर्णांक अनुक्रमित for पाश के साथ, और यह वास्तव में किसी प्रकार का साथ गैर यादृच्छिक अभिगम iterators के लिए संकलन हो सकता है सूचक में रूपांतरण।

यह मूल Trac आइटम है कि नियम जोड़ा है: http://sourceforge.net/apps/trac/cppcheck/ticket/247 और इस टिकट vector छूट: http://sourceforge.net/apps/trac/cppcheck/ticket/313

+1

नोट: 'primary_queue' पर कोई पुनरावर्तक नहीं है (यह एक कंटेनर एडाप्टर है)। –

संबंधित मुद्दे