[cfe-commits] r150456 - in /cfe/trunk/tools: c-index-test/c-index-test.c libclang/CIndexDiagnostic.cpp libclang/CIndexDiagnostic.h
Ted Kremenek
kremenek at apple.com
Mon Feb 13 22:26:21 PST 2012
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 <dgregor at apple.com> 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
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list