On Wed, Feb 29, 2012 at 3:59 PM, Ted Kremenek <[email protected]> wrote: > Author: kremenek > Date: Wed Feb 29 17:59:20 2012 > New Revision: 151774 > > URL: http://llvm.org/viewvc/llvm-project?rev=151774&view=rev > Log: > [analyzer] when scanning FIDs in a PathDiagnostic, correctly recurse calls > and macros.
Is there a test case for this? I haven't managed to (nor tried to hard) wrap my head around the change & thought a test case would make it clearer what's being enabled/fixed here. - David > > Modified: > cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=151774&r1=151773&r2=151774&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Wed Feb 29 17:59:20 > 2012 > @@ -93,26 +93,43 @@ > // Verify that the entire path is from the same FileID. > FileID FID; > const SourceManager &SMgr = > (*D->path.begin())->getLocation().getManager(); > + llvm::SmallVector<const PathPieces *, 5> WorkList; > + WorkList.push_back(&D->path); > > - for (PathPieces::const_iterator I = D->path.begin(), E = D->path.end(); > - I != E; ++I) { > - FullSourceLoc L = (*I)->getLocation().asLocation().getExpansionLoc(); > + while (!WorkList.empty()) { > + const PathPieces &path = *WorkList.back(); > + WorkList.pop_back(); > + > + for (PathPieces::const_iterator I = path.begin(), E = path.end(); > + I != E; ++I) { > + const PathDiagnosticPiece *piece = I->getPtr(); > + FullSourceLoc L = > piece->getLocation().asLocation().getExpansionLoc(); > > - if (FID.isInvalid()) { > - FID = SMgr.getFileID(L); > - } else if (SMgr.getFileID(L) != FID) > - return; // FIXME: Emit a warning? > - > - // Check the source ranges. > - for (PathDiagnosticPiece::range_iterator RI = (*I)->ranges_begin(), > - RE = (*I)->ranges_end(); > - RI != RE; ++RI) { > - SourceLocation L = SMgr.getExpansionLoc(RI->getBegin()); > - if (!L.isFileID() || SMgr.getFileID(L) != FID) > - return; // FIXME: Emit a warning? > - L = SMgr.getExpansionLoc(RI->getEnd()); > - if (!L.isFileID() || SMgr.getFileID(L) != FID) > + if (FID.isInvalid()) { > + FID = SMgr.getFileID(L); > + } else if (SMgr.getFileID(L) != FID) > return; // FIXME: Emit a warning? > + > + // Check the source ranges. > + for (PathDiagnosticPiece::range_iterator RI = piece->ranges_begin(), > + RE = piece->ranges_end(); > + RI != RE; ++RI) { > + SourceLocation L = SMgr.getExpansionLoc(RI->getBegin()); > + if (!L.isFileID() || SMgr.getFileID(L) != FID) > + return; // FIXME: Emit a warning? > + L = SMgr.getExpansionLoc(RI->getEnd()); > + if (!L.isFileID() || SMgr.getFileID(L) != FID) > + return; // FIXME: Emit a warning? > + } > + > + if (const PathDiagnosticCallPiece *call = > + dyn_cast<PathDiagnosticCallPiece>(piece)) { > + WorkList.push_back(&call->path); > + } > + else if (const PathDiagnosticMacroPiece *macro = > + dyn_cast<PathDiagnosticMacroPiece>(piece)) { > + WorkList.push_back(¯o->subPieces); > + } > } > } > > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=151774&r1=151773&r2=151774&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp Wed Feb 29 > 17:59:20 2012 > @@ -324,19 +324,38 @@ > 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) { > > const PathDiagnostic *D = *DI; > > - for (PathPieces::const_iterator I = D->path.begin(), E = D->path.end(); > - I!=E; ++I) { > - AddFID(FM, Fids, SM, (*I)->getLocation().asLocation()); > - > - for (PathDiagnosticPiece::range_iterator RI = (*I)->ranges_begin(), > - RE= (*I)->ranges_end(); RI != RE; ++RI) { > - AddFID(FM, Fids, SM, RI->getBegin()); > - AddFID(FM, Fids, SM, RI->getEnd()); > + llvm::SmallVector<const PathPieces *, 5> WorkList; > + WorkList.push_back(&D->path); > + > + while (!WorkList.empty()) { > + const PathPieces &path = *WorkList.back(); > + WorkList.pop_back(); > + > + 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()); > + > + for (PathDiagnosticPiece::range_iterator RI = piece->ranges_begin(), > + RE= piece->ranges_end(); RI != RE; ++RI) { > + AddFID(FM, Fids, SM, RI->getBegin()); > + AddFID(FM, Fids, SM, RI->getEnd()); > + } > + > + if (const PathDiagnosticCallPiece *call = > + dyn_cast<PathDiagnosticCallPiece>(piece)) { > + WorkList.push_back(&call->path); > + } > + else if (const PathDiagnosticMacroPiece *macro = > + dyn_cast<PathDiagnosticMacroPiece>(piece)) { > + WorkList.push_back(¯o->subPieces); > + } > } > } > } > > > _______________________________________________ > 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
