a.sidorin created this revision. a.sidorin added reviewers: zaks.anna, dcoughlin. a.sidorin added a subscriber: cfe-commits.
Some FileIDs that may be used by PlistDiagnostics are not added while building a list of pieces. This leads to assertion violation in `GetFID()` function. This patch tries to add such missing FileIDs. It also contains small refactoring of this piece of code. Authors: Aleksei Sidorin, Ilya Palachev. http://reviews.llvm.org/D22090 Files: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp test/Analysis/diagnostics/Inputs/include/SomeMacro.def test/Analysis/diagnostics/Inputs/include/Something.h test/Analysis/diagnostics/plist-diagnostics-include-check.cpp
Index: test/Analysis/diagnostics/plist-diagnostics-include-check.cpp =================================================================== --- /dev/null +++ test/Analysis/diagnostics/plist-diagnostics-include-check.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=debug.ExprInspection -analyzer-output=plist-multi-file -o plist.xml %s + +#include "Inputs/include/Something.h" + +void foo() { + Something() +#define SOME_MACRO .run(); +#include "Inputs/include/SomeMacro.def" +} Index: test/Analysis/diagnostics/Inputs/include/Something.h =================================================================== --- /dev/null +++ test/Analysis/diagnostics/Inputs/include/Something.h @@ -0,0 +1,9 @@ +void clang_analyzer_warnIfReached(); + +class Something { +public: + Something () { } + void run() { + clang_analyzer_warnIfReached(); + } +}; Index: test/Analysis/diagnostics/Inputs/include/SomeMacro.def =================================================================== --- /dev/null +++ test/Analysis/diagnostics/Inputs/include/SomeMacro.def @@ -0,0 +1 @@ +SOME_MACRO Index: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp =================================================================== --- lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -372,40 +372,41 @@ if (!Diags.empty()) SM = &(*(*Diags.begin())->path.begin())->getLocation().getManager(); - - for (std::vector<const PathDiagnostic*>::iterator DI = Diags.begin(), - DE = Diags.end(); DI != DE; ++DI) { + auto AddPieceFID = [&FM, &Fids, SM](const PathDiagnosticPiece *Piece)->void { + AddFID(FM, Fids, SM, Piece->getLocation().asLocation()); + ArrayRef<SourceRange> Ranges = Piece->getRanges(); + for (const SourceRange &Range : Ranges) { + AddFID(FM, Fids, SM, Range.getBegin()); + AddFID(FM, Fids, SM, Range.getEnd()); + } + }; - const PathDiagnostic *D = *DI; + for (const PathDiagnostic *D : Diags) { SmallVector<const PathPieces *, 5> WorkList; WorkList.push_back(&D->path); while (!WorkList.empty()) { - const PathPieces &path = *WorkList.pop_back_val(); - - for (PathPieces::const_iterator I = path.begin(), E = path.end(); I != E; - ++I) { - const PathDiagnosticPiece *piece = I->getPtr(); - AddFID(FM, Fids, SM, piece->getLocation().asLocation()); - ArrayRef<SourceRange> Ranges = piece->getRanges(); - for (ArrayRef<SourceRange>::iterator I = Ranges.begin(), - E = Ranges.end(); I != E; ++I) { - AddFID(FM, Fids, SM, I->getBegin()); - AddFID(FM, Fids, SM, I->getEnd()); - } + const PathPieces &Path = *WorkList.pop_back_val(); + + for (const auto &Iter : Path) { + const PathDiagnosticPiece *Piece = Iter.getPtr(); + AddPieceFID(Piece); + + if (const PathDiagnosticCallPiece *Call = + dyn_cast<PathDiagnosticCallPiece>(Piece)) { + if (IntrusiveRefCntPtr<PathDiagnosticEventPiece> + CallEnterWithin = Call->getCallEnterWithinCallerEvent()) + AddPieceFID(CallEnterWithin.getPtr()); - if (const PathDiagnosticCallPiece *call = - dyn_cast<PathDiagnosticCallPiece>(piece)) { - IntrusiveRefCntPtr<PathDiagnosticEventPiece> - callEnterWithin = call->getCallEnterWithinCallerEvent(); - if (callEnterWithin) - AddFID(FM, Fids, SM, callEnterWithin->getLocation().asLocation()); + if (IntrusiveRefCntPtr<PathDiagnosticEventPiece> + CallEnterEvent = Call->getCallEnterEvent()) + AddPieceFID(CallEnterEvent.getPtr()); - WorkList.push_back(&call->path); + WorkList.push_back(&Call->path); } else if (const PathDiagnosticMacroPiece *macro = - dyn_cast<PathDiagnosticMacroPiece>(piece)) { + dyn_cast<PathDiagnosticMacroPiece>(Piece)) { WorkList.push_back(¯o->subPieces); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits