Cppcheck Dangerous iterator usage after erase()-method
Julien Nabet
serval2412 at yahoo.fr
Sun Sep 16 04:03:50 PDT 2012
On 16/09/2012 12:26, Noel Grandin wrote:
> On Sat, Sep 15, 2012 at 9:13 PM, Markus Mohrhard
> <markus.mohrhard at googlemail.com> wrote:
>> Hey,
>>
>>
>>> Here are the lines:
>>> 178 void SwBlink::FrmDelete( const SwRootFrm* pRoot )
>>> 179 {
>>> 180 for( SwBlinkList::iterator it = aList.begin(); it !=
>>> aList.end(); )
>>> 181 {
>>> 182 if( pRoot == (*it).GetRootFrm() )
>>> 183 aList.erase( it );
>>> 184 else
>>> 185 ++it;
>>> 186 }
>>> 187 }
>>>
>>> I must recognize, I don't understand how can it work above all if we go in
>>> the "if" since there's no increment.
>>>
>>> Any idea?
>> It can't. Line 183 is supposed to be:
>>
>> aList.erase(it++);
>>
> No, it should be
> it = aList.erase(it);
>
> Once you have called erase(), the iterator becomes invalid, so it must
> be replaced by the iterator returned by erase(), which returns the
> next valid position,
Except that SwBlinkList inherits from boost::ptr_set, I don't know how
iterator works with this class.
Some container returns an iterator when you call erase method, some not.
Sometimes it depends on if you use C++11
Moreover what kind of things can invalidate iterator still seem hard to
remember (see
http://cb.nowan.net/blog/2004/12/30/what-will-invalidate-your-iterators/).
So I let experts decide :)
Julien
More information about the LibreOffice
mailing list