]> granicus.if.org Git - clang/commitdiff
[analyzer] ConditionBRVisitor: Fix HTML PathDiagnosticPopUpPieces
authorCsaba Dabis <dabis.csaba98@gmail.com>
Fri, 9 Aug 2019 02:20:44 +0000 (02:20 +0000)
committerCsaba Dabis <dabis.csaba98@gmail.com>
Fri, 9 Aug 2019 02:20:44 +0000 (02:20 +0000)
Summary:
A condition could be a multi-line expression where we create the highlight
in separated chunks. PathDiagnosticPopUpPiece is not made for that purpose,
it cannot be added to multiple lines because we have only one ending part
which contains all the notes. So that it cannot have multiple endings and
therefore this patch narrows down the ranges of the highlight to the given
interesting variable of the condition. It prevents HTML-breaking injections.

Reviewed By: NoQ

Differential Revision: https://reviews.llvm.org/D65663

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@368382 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
test/Analysis/Inputs/expected-plists/cxx-for-range.cpp.plist
test/Analysis/Inputs/expected-plists/edges-new.mm.plist
test/Analysis/Inputs/expected-plists/inline-plist.c.plist
test/Analysis/Inputs/expected-plists/objc-radar17039661.m.plist
test/Analysis/Inputs/expected-plists/plist-output.m.plist

index 250793c4baff069b275b455bbe5a5b403fcd9afb..731545022cab00cd6527f08725f85327ebb40882 100644 (file)
@@ -2335,12 +2335,12 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
   // Check if the field name of the MemberExprs is ambiguous. Example:
   // " 'a.d' is equal to 'h.d' " in 'test/Analysis/null-deref-path-notes.cpp'.
   bool IsSameFieldName = false;
-  if (const auto *LhsME =
-          dyn_cast<MemberExpr>(BExpr->getLHS()->IgnoreParenCasts()))
-    if (const auto *RhsME =
-            dyn_cast<MemberExpr>(BExpr->getRHS()->IgnoreParenCasts()))
-      IsSameFieldName = LhsME->getMemberDecl()->getName() ==
-                        RhsME->getMemberDecl()->getName();
+  const auto *LhsME = dyn_cast<MemberExpr>(BExpr->getLHS()->IgnoreParenCasts());
+  const auto *RhsME = dyn_cast<MemberExpr>(BExpr->getRHS()->IgnoreParenCasts());
+
+  if (LhsME && RhsME)
+    IsSameFieldName =
+        LhsME->getMemberDecl()->getName() == RhsME->getMemberDecl()->getName();
 
   SmallString<128> LhsString, RhsString;
   {
@@ -2410,16 +2410,31 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
 
   Out << (shouldInvert ? LhsString : RhsString);
   const LocationContext *LCtx = N->getLocationContext();
-  PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LCtx);
+  const SourceManager &SM = BRC.getSourceManager();
 
   // Convert 'field ...' to 'Field ...' if it is a MemberExpr.
   std::string Message = Out.str();
   Message[0] = toupper(Message[0]);
 
-  // If we know the value create a pop-up note.
-  if (!IsAssuming)
+  // If we know the value create a pop-up note to the value part of 'BExpr'.
+  if (!IsAssuming) {
+    PathDiagnosticLocation Loc;
+    if (!shouldInvert) {
+      if (LhsME && LhsME->getMemberLoc().isValid())
+        Loc = PathDiagnosticLocation(LhsME->getMemberLoc(), SM);
+      else
+        Loc = PathDiagnosticLocation(BExpr->getLHS(), SM, LCtx);
+    } else {
+      if (RhsME && RhsME->getMemberLoc().isValid())
+        Loc = PathDiagnosticLocation(RhsME->getMemberLoc(), SM);
+      else
+        Loc = PathDiagnosticLocation(BExpr->getRHS(), SM, LCtx);
+    }
+
     return std::make_shared<PathDiagnosticPopUpPiece>(Loc, Message);
+  }
 
+  PathDiagnosticLocation Loc(Cond, SM, LCtx);
   auto event = std::make_shared<PathDiagnosticEventPiece>(Loc, Message);
   if (shouldPrune.hasValue())
     event->setPrunable(shouldPrune.getValue());
@@ -2472,12 +2487,14 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
     return nullptr;
 
   const LocationContext *LCtx = N->getLocationContext();
-  PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LCtx);
 
-  // If we know the value create a pop-up note.
-  if (!IsAssuming)
+  // If we know the value create a pop-up note to the 'DRE'.
+  if (!IsAssuming) {
+    PathDiagnosticLocation Loc(DRE, BRC.getSourceManager(), LCtx);
     return std::make_shared<PathDiagnosticPopUpPiece>(Loc, Out.str());
+  }
 
+  PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LCtx);
   auto event = std::make_shared<PathDiagnosticEventPiece>(Loc, Out.str());
   const ProgramState *state = N->getState().get();
   if (const MemRegion *R = state->getLValue(VD, LCtx).getAsRegion()) {
@@ -2505,11 +2522,17 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
     return nullptr;
 
   const LocationContext *LCtx = N->getLocationContext();
-  PathDiagnosticLocation Loc(Cond, BRC.getSourceManager(), LCtx);
+  PathDiagnosticLocation Loc;
+
+  // If we know the value create a pop-up note to the member of the MemberExpr.
+  if (!IsAssuming && ME->getMemberLoc().isValid())
+    Loc = PathDiagnosticLocation(ME->getMemberLoc(), BRC.getSourceManager());
+  else
+    Loc = PathDiagnosticLocation(Cond, BRC.getSourceManager(), LCtx);
+
   if (!Loc.isValid() || !Loc.asLocation().isValid())
     return nullptr;
 
-  // If we know the value create a pop-up note.
   if (!IsAssuming)
     return std::make_shared<PathDiagnosticPopUpPiece>(Loc, Out.str());
 
index f781c949e4dd39b13f166fa2ff67f70f7c967442..a6416957225003db1406013cd21ce81313bbfd6f 100644 (file)
@@ -612,7 +612,7 @@ HandlePopUpPieceStartTag(Rewriter &R,
   for (const auto &Range : PopUpRanges) {
     html::HighlightRange(R, Range.getBegin(), Range.getEnd(), "",
                          "<table class='variable_popup'><tbody>",
-                         /*IsTokenRange=*/false);
+                         /*IsTokenRange=*/true);
   }
 }
 
@@ -644,12 +644,11 @@ static void HandlePopUpPieceEndTag(Rewriter &R,
     Out << "</tbody></table></span>";
     html::HighlightRange(R, Range.getBegin(), Range.getEnd(),
                          "<span class='variable'>", Buf.c_str(),
-                         /*IsTokenRange=*/false);
-
-  // Otherwise inject just the new row at the end of the range.
+                         /*IsTokenRange=*/true);
   } else {
+    // Otherwise inject just the new row at the end of the range.
     html::HighlightRange(R, Range.getBegin(), Range.getEnd(), "", Buf.c_str(),
-                         /*IsTokenRange=*/false);
+                         /*IsTokenRange=*/true);
   }
 }
 
index e7f6dba2fa43fa18bf60170f16800d699e13c631..edcaaf2cd44b832bb300b4727c8461d7c70b54a0 100644 (file)
         </dict>
         <dict>
          <key>line</key><integer>11</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>11</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
index b4c79018c666533be916798f7a2af2ed82b228a5..ab04dadbf479c98d27b8ac50c41768f8c6372ac4 100644 (file)
         </dict>
         <dict>
          <key>line</key><integer>146</integer>
-         <key>col</key><integer>13</integer>
+         <key>col</key><integer>8</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>146</integer>
-         <key>col</key><integer>13</integer>
+         <key>col</key><integer>8</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>178</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>178</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>181</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>267</integer>
-      <key>col</key><integer>18</integer>
+      <key>col</key><integer>19</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>267</integer>
-         <key>col</key><integer>18</integer>
+         <key>col</key><integer>19</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>267</integer>
-           <key>col</key><integer>18</integer>
+           <key>col</key><integer>19</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>267</integer>
-           <key>col</key><integer>18</integer>
+           <key>col</key><integer>22</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
      <key>location</key>
      <dict>
       <key>line</key><integer>457</integer>
-      <key>col</key><integer>9</integer>
+      <key>col</key><integer>10</integer>
       <key>file</key><integer>0</integer>
      </dict>
      <key>ranges</key>
        <array>
         <dict>
          <key>line</key><integer>457</integer>
-         <key>col</key><integer>9</integer>
+         <key>col</key><integer>10</integer>
          <key>file</key><integer>0</integer>
         </dict>
         <dict>
          <array>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>10</integer>
            <key>file</key><integer>0</integer>
           </dict>
           <dict>
            <key>line</key><integer>457</integer>
-           <key>col</key><integer>9</integer>
+           <key>col</key><integer>14</integer>
            <key>file</key><integer>0</integer>
           </dict>
          </array>
        </dict>
       </array>
     </dict>
+    <dict>
+     <key>kind</key><string>control</string>
+     <key>edges</key>
+      <array>
+       <dict>
+        <key>start</key>
+         <array>
+          <dict>
+           <key>line</key><integer>587</integer>
+           <key>col</key><integer>11</integer>
+           <key>file</key><integer>0</integer>
+          </dict>
+          <dict>
+           <key>line</key><integer>587</integer>
+           <key>col</key><integer>11</integer>
+           <key>file</key><integer>0</integer>
+          </dict>
+         </array>
+        <key>end</key>
+         <array>
+          <dict>
+           <key>line</key><integer>587</integer>
+           <key>col</key><integer>11</integer>
+           <key>file</key><integer>0</integer>
+          </dict>
+          <dict>
+           <key>line</key><integer>587</integer>
+           <key>col</key><integer>11</integer>
+           <key>file</key><integer>0</integer>
+          </dict>
+         </array>
+       </dict>
+      </array>
+    </dict>
     <dict>
      <key>kind</key><string>pop-up</string>
      <key>location</key>
       <key>col</key><integer>11</integer>
       <key>file</key><integer>0</integer>
      </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>587</integer>
-         <key>col</key><integer>11</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>587</integer>
-         <key>col</key><integer>16</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
      <key>extended_message</key>
      <string>Field &apos;b&apos; is equal to 2</string>
      <key>message</key>
index db6b5af0d56844e15181d231f6d74b70fd3e5bf6..1ee17de4b5fa99a952c6d8cbd8df2be06d50c516 100644 (file)
         </dict>
         <dict>
          <key>line</key><integer>45</integer>
-         <key>col</key><integer>12</integer>
+         <key>col</key><integer>7</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
index 926f8274264994b03559e22d8f43da2e11ae3f34..3c87e3909bec516f1d109b734af9fdbf6148aeac 100644 (file)
         </dict>
         <dict>
          <key>line</key><integer>38</integer>
-         <key>col</key><integer>37</integer>
+         <key>col</key><integer>20</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
index 5b1de9121f35c02cd10954c70c5e73b8fe589e8a..ee8bf06e59fd9743651381b4384e4cd0abaa32ee 100644 (file)
         </dict>
         <dict>
          <key>line</key><integer>96</integer>
-         <key>col</key><integer>13</integer>
+         <key>col</key><integer>8</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>96</integer>
-         <key>col</key><integer>13</integer>
+         <key>col</key><integer>8</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>127</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>
         </dict>
         <dict>
          <key>line</key><integer>127</integer>
-         <key>col</key><integer>14</integer>
+         <key>col</key><integer>9</integer>
          <key>file</key><integer>0</integer>
         </dict>
        </array>