Fixed in 150461. On Feb 13, 2012, at 10:26 PM, Ted Kremenek wrote:
> Just got back online. Looking at it now. > > On Feb 13, 2012, at 9:38 PM, David Blaikie wrote: > >> On Mon, Feb 13, 2012 at 9:35 PM, Douglas Gregor <[email protected]> wrote: >>> >>> On Feb 13, 2012, at 6:46 PM, Ted Kremenek wrote: >>> >>>> Author: kremenek >>>> Date: Mon Feb 13 20:46:03 2012 >>>> New Revision: 150456 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=150456&view=rev >>>> Log: >>>> Implement new DiagnosticsRenderer that packages notes retrieved by >>>> clang_getDiagnosticSetFromTU() as >>>> child diagnostics of primary diagnostics. By using the >>>> DiagnosticRenderer, these Diagnostics now >>>> match with those generated for serialized diagnostics. >>> >>> I'm seeing occasional use-after-free errors in test/Index/fix-its.c after >>> this patch. Backtrace follows. >> >> I'm seeing this quite consistently on this test (on Ubuntu, for >> whatever that's worth) & idly poking to see if I can find a fix. >> Buildbots have been reporting this for a while so I assume Ted isn't >> around to see the mail. >> >>> >>> - Doug >>> >>> #1 0x00007fff8e69e805 in free () >>> #2 0x00000001000c00ba in clang_disposeString (string={data = 0x103200c70, >>> private_flags = 1}) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CXString.cpp:126 >>> #3 0x0000000100088e83 in ~CXDiagnosticCustomNoteImpl (this=0x103200c10) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:55 >>> #4 0x0000000100088c55 in ~CXDiagnosticCustomNoteImpl (this=0x103200c10) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:54 >>> #5 0x0000000100088c79 in ~CXDiagnosticCustomNoteImpl (this=0x103200c10) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:54 >>> #6 0x00000001000870f7 in clang::CXDiagnosticSetImpl::~CXDiagnosticSetImpl >>> (this=0x103200ad8) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:39 >>> #7 0x0000000100086f65 in clang::CXDiagnosticSetImpl::~CXDiagnosticSetImpl >>> (this=0x103200ad8) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:35 >>> #8 0x00000001000871bc in clang::CXDiagnosticImpl::~CXDiagnosticImpl >>> (this=0x103200ad0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:43 >>> #9 0x000000010006fc55 in clang::CXStoredDiagnostic::~CXStoredDiagnostic >>> (this=0x103200ad0) at CIndexDiagnostic.h:118 >>> #10 0x000000010006f615 in clang::CXStoredDiagnostic::~CXStoredDiagnostic >>> (this=0x103200ad0) at CIndexDiagnostic.h:118 >>> #11 0x00000001000bf6d9 in clang::CXStoredDiagnostic::~CXStoredDiagnostic >>> (this=0x103200ad0) at CIndexDiagnostic.h:118 >>> #12 0x00000001000870f7 in clang::CXDiagnosticSetImpl::~CXDiagnosticSetImpl >>> (this=0x103200aa0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:39 >>> #13 0x0000000100086f65 in clang::CXDiagnosticSetImpl::~CXDiagnosticSetImpl >>> (this=0x103200aa0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:35 >>> #14 0x0000000100086f39 in clang::CXDiagnosticSetImpl::~CXDiagnosticSetImpl >>> (this=0x103200aa0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndexDiagnostic.cpp:35 >>> #15 0x000000010001af11 in clang_disposeTranslationUnit (CTUnit=0x103309be0) >>> at /Users/dgregor/Projects/llvm/tools/clang/tools/libclang/CIndex.cpp:2623 >>> #16 0x0000000100003f10 in perform_test_load (Idx=0x103200a50, >>> TU=0x103309be0, filter=0x7fff5fbff81a "all", prefix=0x0, >>> Visitor=0x100002470 <FilteredPrintingVisitor>, PV=0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/c-index-test/c-index-test.c:725 >>> #17 0x00000001000040fb in perform_test_load_source (argc=2, >>> argv=0x7fff5fbff690, filter=0x7fff5fbff81a "all", Visitor=0x100002470 >>> <FilteredPrintingVisitor>, PV=0) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/c-index-test/c-index-test.c:780 >>> #18 0x00000001000074fd in cindextest_main (argc=5, argv=0x7fff5fbff678) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/c-index-test/c-index-test.c:2658 >>> #19 0x0000000100009407 in thread_runner (client_data_v=0x7fff5fbff628) at >>> /Users/dgregor/Projects/llvm/tools/clang/tools/c-index-test/c-index-test.c:2708 >>> #20 0x0000000100febabe in ExecuteOnThread_Dispatch (Arg=0x7fff5fbff5b8) at >>> /Users/dgregor/Projects/llvm/lib/Support/Threading.cpp:75 >>> #21 0x00007fff8e64c8bf in _pthread_start () >>> #22 0x00007fff8e64fb75 in thread_start () >>> >>>> Modified: >>>> cfe/trunk/tools/c-index-test/c-index-test.c >>>> cfe/trunk/tools/libclang/CIndexDiagnostic.cpp >>>> cfe/trunk/tools/libclang/CIndexDiagnostic.h >>>> >>>> Modified: cfe/trunk/tools/c-index-test/c-index-test.c >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=150456&r1=150455&r2=150456&view=diff >>>> ============================================================================== >>>> --- cfe/trunk/tools/c-index-test/c-index-test.c (original) >>>> +++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Feb 13 20:46:03 2012 >>>> @@ -418,13 +418,21 @@ >>>> } >>>> } >>>> >>>> -void PrintDiagnostics(CXTranslationUnit TU) { >>>> - int i, n = clang_getNumDiagnostics(TU); >>>> - for (i = 0; i != n; ++i) { >>>> - CXDiagnostic Diag = clang_getDiagnostic(TU, i); >>>> +void PrintDiagnosticSet(CXDiagnosticSet Set) { >>>> + int i = 0, n = clang_getNumDiagnosticsInSet(Set); >>>> + for ( ; i != n ; ++i) { >>>> + CXDiagnostic Diag = clang_getDiagnosticInSet(Set, i); >>>> + CXDiagnosticSet ChildDiags = clang_getChildDiagnostics(Diag); >>>> PrintDiagnostic(Diag); >>>> - clang_disposeDiagnostic(Diag); >>>> - } >>>> + if (ChildDiags) >>>> + PrintDiagnosticSet(ChildDiags); >>>> + } >>>> +} >>>> + >>>> +void PrintDiagnostics(CXTranslationUnit TU) { >>>> + CXDiagnosticSet TUSet = clang_getDiagnosticSetFromTU(TU); >>>> + PrintDiagnosticSet(TUSet); >>>> + clang_disposeDiagnosticSet(TUSet); >>>> } >>>> >>>> void PrintMemoryUsage(CXTranslationUnit TU) { >>>> >>>> Modified: cfe/trunk/tools/libclang/CIndexDiagnostic.cpp >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexDiagnostic.cpp?rev=150456&r1=150455&r2=150456&view=diff >>>> ============================================================================== >>>> --- cfe/trunk/tools/libclang/CIndexDiagnostic.cpp (original) >>>> +++ cfe/trunk/tools/libclang/CIndexDiagnostic.cpp Mon Feb 13 20:46:03 2012 >>>> @@ -18,6 +18,8 @@ >>>> >>>> #include "clang/Frontend/ASTUnit.h" >>>> #include "clang/Frontend/FrontendDiagnostic.h" >>>> +#include "clang/Frontend/DiagnosticRenderer.h" >>>> +#include "clang/Frontend/DiagnosticOptions.h" >>>> #include "llvm/ADT/SmallString.h" >>>> #include "llvm/ADT/Twine.h" >>>> #include "llvm/Support/MemoryBuffer.h" >>>> @@ -40,6 +42,109 @@ >>>> >>>> CXDiagnosticImpl::~CXDiagnosticImpl() {} >>>> >>>> +namespace { >>>> +class CXDiagnosticCustomNoteImpl : public CXDiagnosticImpl { >>>> + CXString Message; >>>> + CXSourceLocation Loc; >>>> +public: >>>> + CXDiagnosticCustomNoteImpl(StringRef Msg, CXSourceLocation L) >>>> + : CXDiagnosticImpl(CustomNoteDiagnosticKind), >>>> + Message(createCXString(Msg)), Loc(L) {} >>>> + >>>> + virtual ~CXDiagnosticCustomNoteImpl() { >>>> + clang_disposeString(Message); >>>> + } >>>> + >>>> + CXDiagnosticSeverity getSeverity() const { >>>> + return CXDiagnostic_Note; >>>> + } >>>> + >>>> + CXSourceLocation getLocation() const { >>>> + return Loc; >>>> + } >>>> + >>>> + CXString getSpelling() const { >>>> + return Message; >>>> + } >>>> + >>>> + CXString getDiagnosticOption(CXString *Disable) const { >>>> + if (Disable) >>>> + *Disable = createCXString("", false); >>>> + return createCXString("", false); >>>> + } >>>> + >>>> + unsigned getCategory() const { return 0; } >>>> + unsigned getNumRanges() const { return 0; } >>>> + CXSourceRange getRange(unsigned Range) const { return >>>> clang_getNullRange(); } >>>> + unsigned getNumFixIts() const { return 0; } >>>> + CXString getFixIt(unsigned FixIt, CXSourceRange *ReplacementRange) >>>> const { >>>> + if (ReplacementRange) >>>> + *ReplacementRange = clang_getNullRange(); >>>> + return createCXString("", false); >>>> + } >>>> +}; >>>> + >>>> +class CXDiagnosticRenderer : public DiagnosticNoteRenderer { >>>> +public: >>>> + CXDiagnosticRenderer(const SourceManager &SM, >>>> + const LangOptions &LangOpts, >>>> + const DiagnosticOptions &DiagOpts, >>>> + CXDiagnosticSetImpl *mainSet) >>>> + : DiagnosticNoteRenderer(SM, LangOpts, DiagOpts), >>>> + CurrentSet(mainSet), MainSet(mainSet) {} >>>> + >>>> + virtual ~CXDiagnosticRenderer() {} >>>> + >>>> + virtual void beginDiagnostic(DiagOrStoredDiag D, >>>> + DiagnosticsEngine::Level Level) { >>>> + >>>> + const StoredDiagnostic *SD = D.dyn_cast<const StoredDiagnostic*>(); >>>> + if (!SD) >>>> + return; >>>> + >>>> + if (Level != DiagnosticsEngine::Note) >>>> + CurrentSet = MainSet; >>>> + >>>> + CXStoredDiagnostic *CD = new CXStoredDiagnostic(*SD, LangOpts); >>>> + CurrentSet->appendDiagnostic(CD); >>>> + >>>> + if (Level != DiagnosticsEngine::Note) >>>> + CurrentSet = &CD->getChildDiagnostics(); >>>> + } >>>> + >>>> + virtual void emitDiagnosticMessage(SourceLocation Loc, PresumedLoc PLoc, >>>> + DiagnosticsEngine::Level Level, >>>> + StringRef Message, >>>> + ArrayRef<CharSourceRange> Ranges, >>>> + DiagOrStoredDiag D) { >>>> + if (!D.isNull()) >>>> + return; >>>> + >>>> + CXSourceLocation L = translateSourceLocation(SM, LangOpts, Loc); >>>> + CXDiagnosticImpl *CD = new CXDiagnosticCustomNoteImpl(Message, L); >>>> + CurrentSet->appendDiagnostic(CD); >>>> + } >>>> + >>>> + virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, >>>> + DiagnosticsEngine::Level Level, >>>> + ArrayRef<CharSourceRange> Ranges) {} >>>> + >>>> + virtual void emitCodeContext(SourceLocation Loc, >>>> + DiagnosticsEngine::Level Level, >>>> + SmallVectorImpl<CharSourceRange>& Ranges, >>>> + ArrayRef<FixItHint> Hints) {}; >>>> + >>>> + virtual void emitNote(SourceLocation Loc, StringRef Message) { >>>> + CXSourceLocation L = translateSourceLocation(SM, LangOpts, Loc); >>>> + CurrentSet->appendDiagnostic(new CXDiagnosticCustomNoteImpl(Message, >>>> + L)); >>>> + } >>>> + >>>> + CXDiagnosticSetImpl *CurrentSet; >>>> + CXDiagnosticSetImpl *MainSet; >>>> +}; >>>> +} >>>> + >>>> CXDiagnosticSetImpl *cxdiag::lazyCreateDiags(CXTranslationUnit TU, >>>> bool checkIfChanged) { >>>> ASTUnit *AU = static_cast<ASTUnit *>(TU->TUData); >>>> @@ -75,12 +180,14 @@ >>>> if (!TU->Diagnostics) { >>>> CXDiagnosticSetImpl *Set = new CXDiagnosticSetImpl(); >>>> TU->Diagnostics = Set; >>>> + DiagnosticOptions DOpts; >>>> + CXDiagnosticRenderer Renderer(AU->getSourceManager(), >>>> + AU->getASTContext().getLangOptions(), >>>> + DOpts, Set); >>>> >>>> for (ASTUnit::stored_diag_iterator it = AU->stored_diag_begin(), >>>> ei = AU->stored_diag_end(); it != ei; ++it) { >>>> - CXStoredDiagnostic *D = >>>> - new CXStoredDiagnostic(*it, AU->getASTContext().getLangOptions()); >>>> - Set->appendDiagnostic(D); >>>> + Renderer.emitStoredDiagnostic(*it); >>>> } >>>> } >>>> return static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics); >>>> >>>> Modified: cfe/trunk/tools/libclang/CIndexDiagnostic.h >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexDiagnostic.h?rev=150456&r1=150455&r2=150456&view=diff >>>> ============================================================================== >>>> --- cfe/trunk/tools/libclang/CIndexDiagnostic.h (original) >>>> +++ cfe/trunk/tools/libclang/CIndexDiagnostic.h Mon Feb 13 20:46:03 2012 >>>> @@ -54,7 +54,8 @@ >>>> >>>> class CXDiagnosticImpl { >>>> public: >>>> - enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind }; >>>> + enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind, >>>> + CustomNoteDiagnosticKind }; >>>> >>>> virtual ~CXDiagnosticImpl(); >>>> >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> [email protected] >>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
