[cfe-commits] r151774 - in /cfe/trunk/lib/StaticAnalyzer/Core: PathDiagnostic.cpp PlistDiagnostics.cpp
Ted Kremenek
kremenek at apple.com
Thu Mar 1 17:32:23 PST 2012
Hi David,
A testcase was tricky. Added in r151872 (along with other fixes).
On Feb 29, 2012, at 4:19 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Wed, Feb 29, 2012 at 3:59 PM, Ted Kremenek <kremenek at apple.com> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list