On May 17, 2013, at 10:52 AM, Jordan Rose <[email protected]> wrote:

> Small comments:
> 
>> @@ -119,6 +120,62 @@ PathDiagnostic::PathDiagnostic(const Dec
>>     UniqueingDecl(DeclToUnique),
>>     path(pathImpl) {}
>> 
>> +static PathDiagnosticCallPiece *
>> +getFirstStackedCallToHeaderFile(PathDiagnosticCallPiece *CP,
>> +                                const SourceManager &SMgr) {
>> +  assert(SMgr.isFromMainFile(CP->callEnter.asLocation()) &&
>> +         "The call piece should be in the main file.");
>> +
>> +  // Check if CP represents a path through a function outside of the main 
>> file.
>> +  if (!SMgr.isFromMainFile(CP->callEnterWithin.asLocation()))
>> +    return CP;
>> +
>> +  // Check if the last piece in the callee path is a call to a function 
>> outside
>> +  // of the main file.
>> +  const PathPieces &Path = CP->path;
>> +  if (PathDiagnosticCallPiece *CPInner =
>> +      dyn_cast<PathDiagnosticCallPiece>(Path.back())) {
>> +    return getFirstStackedCallToHeaderFile(CPInner, SMgr);
>> +  }
> 
> The inner path might be empty for bugs that have path pruning turned off. I 
> don't think we have many of those, but it's worth checking.
> 
> 
>> +  // Otherwise, the last piece is in the main file.
>> +  return 0;
>> +}
>> +
>> +void PathDiagnostic::resetDiagnosticLocationToMainFile() {
>> +  if (path.empty())
>> +    return;
>> +
>> +  PathDiagnosticPiece *LastP = path.back().getPtr();
>> +  const SourceManager &SMgr = LastP->getLocation().getManager();
>> +  assert(LastP);
> 
> You're using LastP before asserting it here.
> 
> 
>> +  // We only need to check if the report ends inside headers, if the last 
>> piece
>> +  // is a call piece.
>> +  if (PathDiagnosticCallPiece *CP = 
>> dyn_cast<PathDiagnosticCallPiece>(LastP)) {
>> +    CP = getFirstStackedCallToHeaderFile(CP, SMgr);
>> +    if (CP) {
>> +      // Mark the piece.
>> +       CP->setAsLastInMainSourceFile();
>> +
>> +      // Update the path diagnostic message.
>> +      const NamedDecl *ND = dyn_cast<NamedDecl>(CP->getCallee());
>> +      if (ND) {
>> +        SmallString<200> buf;
>> +        llvm::raw_svector_ostream os(buf);
>> +        os << " (within a call to " << ND->getDeclName().getAsString() << 
>> ")";
>> +        appendToDesc(os.str());
>> +      }
> 
> Very recently this became just "<< ND->getDeclName()", which is a bit 
> cleaner. This should probably be single-quoted, too, since this will look 
> weird for, say, copy constructors:
> 
> "(within a call to ArrayRef)"
> vs.
> "(within a call to 'ArrayRef')"
> 
> ...but really we need to refactor all our function/method pretty-printing so 
> that we get nice names like "copy constructor for ArrayRef" and 
> "-fetchEverything:delegate:".
> 
> Also, it might be worth commenting on the non-NamedDecl case of a block, 
> which we don't expect to happen because people don't usually define blocks in 
> header files. (But they could, so we shouldn't assert.)
We would just not print anything. We don't assert..
> 
> 
>> +      // Reset the report containing declaration and location.
>> +      DeclWithIssue = CP->getCaller();
>> +      Loc = CP->getLocation();
>> +      
>> +      return;
>> +    }
>> +  }
>> +}
>> +
>> void PathDiagnosticConsumer::anchor() { }
>> 
>> PathDiagnosticConsumer::~PathDiagnosticConsumer() {
>> 
>> Modified: cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=182058&r1=182057&r2=182058&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp (original)
>> +++ cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp Thu May 16 
>> 17:30:45 2013
>> @@ -215,13 +215,18 @@ static void ReportEvent(raw_ostream &o,
>>                         const SourceManager &SM,
>>                         const LangOptions &LangOpts,
>>                         unsigned indent,
>> -                        unsigned depth) {
>> +                        unsigned depth,
>> +                        bool isKeyEvent = false) {
>> 
>>   Indent(o, indent) << "<dict>\n";
>>   ++indent;
>> 
>>   Indent(o, indent) << "<key>kind</key><string>event</string>\n";
>> 
>> +  if (isKeyEvent) {
>> +    Indent(o, indent) << "<key>key_event</key><string>YES</string>\n";
>> +  }
> 
> The best-practices way to do this is <true/> rather than <string>YES</string>.
> 
> 
>>   // Output the location.
>>   FullSourceLoc L = P.getLocation().asLocation();
>> 
>> @@ -270,7 +275,8 @@ static void ReportPiece(raw_ostream &o,
>>                         const LangOptions &LangOpts,
>>                         unsigned indent,
>>                         unsigned depth,
>> -                        bool includeControlFlow);
>> +                        bool includeControlFlow,
>> +                        bool isKeyEvent = false);
>> 
>> static void ReportCall(raw_ostream &o,
>>                        const PathDiagnosticCallPiece &P,
>> @@ -283,7 +289,8 @@ static void ReportCall(raw_ostream &o,
>>     P.getCallEnterEvent();  
>> 
>>   if (callEnter)
>> -    ReportPiece(o, *callEnter, FM, SM, LangOpts, indent, depth, true);
>> +    ReportPiece(o, *callEnter, FM, SM, LangOpts, indent, depth, true,
>> +                P.isLastInMainSourceFile());
>> 
>>   IntrusiveRefCntPtr<PathDiagnosticEventPiece> callEnterWithinCaller =
>>     P.getCallEnterWithinCallerEvent();
>> @@ -331,7 +338,8 @@ static void ReportPiece(raw_ostream &o,
>>                         const LangOptions &LangOpts,
>>                         unsigned indent,
>>                         unsigned depth,
>> -                        bool includeControlFlow) {
>> +                        bool includeControlFlow,
>> +                        bool isKeyEvent) {
>>   switch (P.getKind()) {
>>     case PathDiagnosticPiece::ControlFlow:
>>       if (includeControlFlow)
>> @@ -344,7 +352,7 @@ static void ReportPiece(raw_ostream &o,
>>       break;
>>     case PathDiagnosticPiece::Event:
>>       ReportEvent(o, cast<PathDiagnosticSpotPiece>(P), FM, SM, LangOpts,
>> -                  indent, depth);
>> +                  indent, depth, isKeyEvent);
>>       break;
>>     case PathDiagnosticPiece::Macro:
>>       ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, SM, LangOpts,

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to