[cfe-dev] intermittent libclang Sema::LookupSpecialMember crash
Ben Hendrickson
ben.hendrickson at gmail.com
Fri Mar 22 15:29:52 PDT 2013
On Mon, Mar 18, 2013 at 11:49 AM, Argyrios Kyrtzidis <akyrtzi at gmail.com>wrote:
> Are you able to provide a preprocessed file where this occurs ?
>
I set about making such a file this morning, but first found that when I
upgrade from 3.2 to the latest version in SVN the crash goes away. I doubt
anyone is going to care about backporting a fix for 3.2, so am assuming
getting clean file (i.e. without internal code from where I work) that it
reproduces on no longer matters.
I assume your custom build has assertions enabled, right ?
>
I did.
> You could also maybe try running under valgrind.
>
It was too slow to run under long enough to reproduce the bug.
> On Feb 25, 2013, at 2:32 PM, Ben Hendrickson <ben.hendrickson at gmail.com>
> wrote:
>
> There is an infrequent crash in libclang.so when calling
> clang_reparseTranslationUnit, which I encounter when using the
> YouCompleteMe vim plugin (which does auto-completion using libclang.so).
> It looks to me to be a libclang bug, and have traced it back enough that
> perhaps someone familiar with the Sema code could quickly find the error
> (I've cc'ed the author of YouCompleteMe in case he could add something).
>
> I encountered this on the prebuilt x64 ubuntu 3.2 binaries, and
> investigated using the source code from
> http://llvm.org/svn/llvm-project/cfe/branches/release_32 r170678.
>
> By recompiling libclang.so and every time I see the crash adding
> increasingly relevant logging statements, here is what I've found:
>
> Sema::LookupSpecialMember has the line:
> llvm::tie(I, E) = RD->lookup(Name);
> Which calls DeclContext::lookup which calls
> StoredDeclsList::getLookupResult to get iterators to the beginning and end
> of an vector to loop over. This is iterating over NamedDecl pointers.
> When it crashes, this array of pointers has around 10 elements in it, and
> one of them (towards the middle of the array) is invalid (the value of the
> pointer is always less than or equal to 0x35 - so clearly invalid -
> although is never actually NULL) and thus crashes when it does the first
> thing in this loop, the "if (Cand->isInvalidDecl())" call as this=0x35 for
> the call to isInvalidDecl which doesn't work out.
>
> After the call to RD->lookup(Name) line, I can add a check to make sure
> the pointers in the array are all above 0x35, and indeed they are.
> Nevertheless, at some point actually step through the pointers in the
> array, one will be less than 0x35, and we'll crash. So at some point in
> the loop, a pointer later in the array is getting changed. This means one
> can hack around the bug by making a local copy of the array one is
> iterating over immediately after the RD->lookup call. Indeed, I've done
> that, and have not seen a crash since. For example:
>
> llvm::tie(I, E) = RD->lookup(Name);
> > int decl_count = E - I;
> > NamedDecl* Cands[decl_count];
> > for (int i = 0; i < decl_count; i++) {
> > Cands[i] = I[i];
> > }
> > I = Cands;
> > E = Cands + decl_count;
> assert((I != E) &&
> "lookup for a constructor or assignment operator was empty");
>
> Of course, this hack couldn't be checked in, and really whatever is
> modifying the later elements in the array should be fixed. .
>
> I've also looked at the code for the YouCompleteMe vim plugin, and do not
> believe the bug in from that project. Although modifying that project to
> always rebuild translation units from scratch instead of reparsing existing
> ones also avoids the crash.
>
> Files I see this crashes on generally are long and are making use of
> template meta programming, but even on these files, the crashes are
> infrequent.
>
> I hope this is useful. As a c++ programmer, I deeply appreciate the Clang
> project.
>
> Cheers,
> Ben
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130322/131cc231/attachment.html>
More information about the cfe-dev
mailing list