<div dir="ltr"><p class="">Hello,</p>

<p class="">                Yeah
you are right Mikhail, thanks for pointing it out, I must ask, is there any bug
already logged for this issue ? </p>

<p class="">Ravi</p></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 16, 2015 at 5:24 PM, Mikhail Filimonov via lldb-dev <span dir="ltr"><<a href="mailto:lldb-dev@lists.llvm.org" target="_blank">lldb-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div>
<p class="MsoNormal">Hi guys and thank you for the excellent community project!<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Recently I’ve stumbled on a pesky, but trivial Invalid iterator dereference bug in SymbolContext and TypeMap implementations at revisions<u></u><u></u></p>
<p class="MsoNormal"><a href="https://github.com/llvm-mirror/lldb/blob/e528da256d14ecac7df858462b44dca931879509/source/Symbol/SymbolContext.cpp#L823" target="_blank">https://github.com/llvm-mirror/lldb/blob/e528da256d14ecac7df858462b44dca931879509/source/Symbol/SymbolContext.cpp#L823</a><u></u><u></u></p>
<p class="MsoNormal">and<u></u><u></u></p>
<p class="MsoNormal"><a href="https://github.com/llvm-mirror/lldb/blob/5ac1fc5bc961688505334395598a2bb174eabd3b/source/Symbol/TypeMap.cpp#L172" target="_blank">https://github.com/llvm-mirror/lldb/blob/5ac1fc5bc961688505334395598a2bb174eabd3b/source/Symbol/TypeMap.cpp#L172</a><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">SymbolContext::SortTypeList(TypeMap &type_map, TypeList &type_list ) const<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">        TypeMaptoList callbackM2L (type_map, type_list);<u></u><u></u></p>
<p class="MsoNormal">        type_map.ForEach(callbackM2L);<u></u><u></u></p>
<p class="MsoNormal">                return ;<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">void<u></u><u></u></p>
<p class="MsoNormal">TypeMap::ForEach (std::function <bool(lldb::TypeSP &type_sp)> const &callback)<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">    for (auto pos = m_types.begin(), end = m_types.end(); pos != end; ++pos)<u></u><u></u></p>
<p class="MsoNormal">    {<u></u><u></u></p>
<p class="MsoNormal">        if (!callback(pos->second))<u></u><u></u></p>
<p class="MsoNormal">            break;<u></u><u></u></p>
<p class="MsoNormal">    }<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">bool<u></u><u></u></p>
<p class="MsoNormal">TypeMap::RemoveTypeWithUID (user_id_t uid)<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">    iterator pos = m_types.find(uid);<u></u><u></u></p>
<p class="MsoNormal">    <u></u><u></u></p>
<p class="MsoNormal">    if (pos != m_types.end())<u></u><u></u></p>
<p class="MsoNormal">    {<u></u><u></u></p>
<p class="MsoNormal">        m_types.erase(pos);<u></u><u></u></p>
<p class="MsoNormal">        return true;<u></u><u></u></p>
<p class="MsoNormal">    }<u></u><u></u></p>
<p class="MsoNormal">    return false;<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">class TypeMaptoList<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">public:<u></u><u></u></p>
<p class="MsoNormal">    TypeMaptoList(TypeMap &typem, TypeList &typel) :<u></u><u></u></p>
<p class="MsoNormal">        type_map(typem),type_list(typel)<u></u><u></u></p>
<p class="MsoNormal">    {<u></u><u></u></p>
<p class="MsoNormal">    }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    bool<u></u><u></u></p>
<p class="MsoNormal">    operator() (const lldb::TypeSP& type)<u></u><u></u></p>
<p class="MsoNormal">    {<u></u><u></u></p>
<p class="MsoNormal">        if(type)<u></u><u></u></p>
<p class="MsoNormal">        {<u></u><u></u></p>
<p class="MsoNormal">            type_list.Insert(type);<u></u><u></u></p>
<p class="MsoNormal">            type_map.RemoveTypeWithUID(type->GetID());<u></u><u></u></p>
<p class="MsoNormal">            if (type_map.Empty())<u></u><u></u></p>
<p class="MsoNormal">                return false;<u></u><u></u></p>
<p class="MsoNormal">        }<u></u><u></u></p>
<p class="MsoNormal">        return true;<u></u><u></u></p>
<p class="MsoNormal">    }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">private:<u></u><u></u></p>
<p class="MsoNormal">    TypeMap &type_map;<u></u><u></u></p>
<p class="MsoNormal">    TypeList &type_list;<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Regards,<u></u><u></u></p>
<p class="MsoNormal">Mikhail Filimonov<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>

<div>
<hr>
</div>
<div>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. </div>
<div>
<hr>
</div>
</div>

<br>_______________________________________________<br>
lldb-dev mailing list<br>
<a href="mailto:lldb-dev@lists.llvm.org">lldb-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev</a><br>
<br></blockquote></div><br></div>