[lldb-dev] Invalid iterator dereference in TypeMap::ForEach when it's invoked with TypeMaptoList callback

Ravitheja Addepally via lldb-dev lldb-dev at lists.llvm.org
Wed Nov 18 00:54:47 PST 2015


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

BR,
A Ravi Theja

On Tue, Nov 17, 2015 at 10:42 AM, Ravitheja Addepally <
ravithejawork at gmail.com> wrote:

> Hello,
>
>                 Yeah you are right Mikhail, thanks for pointing it out, I
> must ask, is there any bug already logged for this issue ?
>
> Ravi
>
> On Mon, Nov 16, 2015 at 5:24 PM, Mikhail Filimonov via lldb-dev <
> lldb-dev at lists.llvm.org> wrote:
>
>> 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
>>
>>
>>
>>
>>
>>
>> ------------------------------
>> This email message is for the sole use of the intended recipient(s) and
>> may contain confidential information.  Any unauthorized review, use,
>> disclosure or distribution is prohibited.  If you are not the intended
>> recipient, please contact the sender by reply email and destroy all copies
>> of the original message.
>> ------------------------------
>>
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20151118/260f1aac/attachment-0001.html>


More information about the lldb-dev mailing list