Invalid iterator dereference in TypeMap::ForEach when it's invoked with TypeMaptoList callback

Hi guys and thank you for the excellent community project!

Recently I’ve stumbled on a pesky, but trivial Invalid iterator dereference bug in SymbolContext and TypeMap implementations at revisions

https://github.com/llvm-mirror/lldb/blob/e528da256d14ecac7df858462b44dca931879509/source/Symbol/SymbolContext.cpp#L823

and

https://github.com/llvm-mirror/lldb/blob/5ac1fc5bc961688505334395598a2bb174eabd3b/source/Symbol/TypeMap.cpp#L172

From the code below it is obvious that TypeMap::ForEach calls the pre-increment operator on m_types iterator right after it has been invalidated by m_types.erase

SymbolContext::SortTypeList(TypeMap &type_map, TypeList &type_list ) const

{

TypeMaptoList callbackM2L (type_map, type_list);

type_map.ForEach(callbackM2L);

return ;

}

void

TypeMap::ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback)

{

for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)

{

if (!callback(pos->second))

break;

}

}

bool

TypeMap::RemoveTypeWithUID (user_id_t uid)

{

iterator pos = m_types.find(uid);

if (pos != m_types.end())

{

m_types.erase(pos);

return true;

}

return false;

}

class TypeMaptoList

{

public:

TypeMaptoList(TypeMap &typem, TypeList &typel) :

type_map(typem),type_list(typel)

{

}

bool

operator() (const lldb::TypeSP& type)

{

if(type)

{

type_list.Insert(type);

type_map.RemoveTypeWithUID(type->GetID());

if (type_map.Empty())

return false;

}

return true;

}

private:

TypeMap &type_map;

TypeList &type_list;

};

Regards,

Mikhail Filimonov

Thanks for the heads-up Mikhail.

Ravi,

this looks like your code. Could you take a look at this?

pl

Hello, Ravi - you're welcome. I haven't filled a bug in lldb bug tracker, just mailed to dev list.

Mikhail

Hello,

Yeah you are right Mikhail, thanks for pointing it out, I must ask, is there any bug already logged for this issue ?

Ravi

Hello,
Pavel- my question is how do we solve it ? should Mikhail log a bug ? for this issue

BR,
A Ravi Theja

I fixed this:

% svn commit
Sending include/lldb/Symbol/TypeMap.h
Sending source/Symbol/SymbolContext.cpp
Sending source/Symbol/TypeMap.cpp
Transmitting file data ...
Committed revision 253618.

Thanx, The invalid iterator problem was only in the last iteration, but I think you modified all the For Loops.