]> granicus.if.org Git - clang/commitdiff
[analyzer] ConditionBRVisitor: Boolean support
authorCsaba Dabis <dabis.csaba98@gmail.com>
Wed, 29 May 2019 20:34:29 +0000 (20:34 +0000)
committerCsaba Dabis <dabis.csaba98@gmail.com>
Wed, 29 May 2019 20:34:29 +0000 (20:34 +0000)
Summary: -

Reviewers: NoQ, george.karpenkov

Reviewed By: NoQ, george.karpenkov

Subscribers: cfe-commits, xazax.hun, baloghadamsoftware, szepet, a.sidorin,
             mikhail.ramalho, Szelethus, donat.nagy, dkrupp

Tags: #clang

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

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

lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
test/Analysis/Inputs/expected-plists/cxx-for-range.cpp.plist
test/Analysis/diagnostics/no-store-func-path-notes.cpp
test/Analysis/inner-pointer.cpp
test/Analysis/use-after-move.cpp

index c45b519582104be40a3f79eec0cdfdd509420d1a..db7559b10b09415bcd4723bf10c7206e2a9185bc 100644 (file)
@@ -2323,10 +2323,17 @@ bool ConditionBRVisitor::printValue(const Expr *CondVarExpr, raw_ostream &Out,
   if (!IsAssuming)
     IntValue = getConcreteIntegerValue(CondVarExpr, N);
 
-  if (IsAssuming || !IntValue.hasValue())
-    Out << (TookTrue ? "not equal to 0" : "0");
-  else
-    Out << *IntValue.getValue();
+  if (IsAssuming || !IntValue.hasValue()) {
+    if (Ty->isBooleanType())
+      Out << (TookTrue ? "true" : "false");
+    else
+      Out << (TookTrue ? "not equal to 0" : "0");
+  } else {
+    if (Ty->isBooleanType())
+      Out << (IntValue.getValue()->getBoolValue() ? "true" : "false");
+    else
+      Out << *IntValue.getValue();
+  }
 
   return true;
 }
index 5be7d0adb9694bd3b2082e0e811ca28995320765..f6bfc87db57af7f8195148897b4e77ed751b023c 100644 (file)
        </array>
      </array>
      <key>extended_message</key>
-     <string>&apos;fail&apos; is 1</string>
+     <string>&apos;fail&apos; is true</string>
      <key>message</key>
-     <string>&apos;fail&apos; is 1</string>
+     <string>&apos;fail&apos; is true</string>
     </dict>
     <dict>
      <key>kind</key><string>control</string>
index 39b7dd9e492650116f86cc885be02e2f0477d12f..c2a3d648018879bb0b6a24af6195b6e9685ae7b4 100644 (file)
@@ -102,7 +102,7 @@ struct C {
 
   C(int pX, int pY, bool Flag) {
     x = pX;
-    if (Flag) // expected-note{{Assuming 'Flag' is not equal to 0}}
+    if (Flag) // expected-note{{Assuming 'Flag' is true}}
               // expected-note@-1{{Taking true branch}}
       return; // expected-note{{Returning without writing to 'this->y'}}
     y = pY;
index 81b750d7e5dd3ac6d069a43e9ca44128fe6ba104..f4646c20fc2949209d154f9d5721cecfc0fe81db 100644 (file)
@@ -38,9 +38,9 @@ void deref_after_scope_char(bool cond) {
   std::string s;
   const char *c2 = s.c_str();
   if (cond) {
-    // expected-note@-1 {{Assuming 'cond' is not equal to 0}}
+    // expected-note@-1 {{Assuming 'cond' is true}}
     // expected-note@-2 {{Taking true branch}}
-    // expected-note@-3 {{Assuming 'cond' is 0}}
+    // expected-note@-3 {{Assuming 'cond' is false}}
     // expected-note@-4 {{Taking false branch}}
     consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}}
     // expected-note@-1 {{Inner pointer of container used after re/deallocation}}
@@ -73,9 +73,9 @@ void deref_after_scope_wchar_t(bool cond) {
   std::wstring s;
   const wchar_t *c2 = s.c_str();
   if (cond) {
-    // expected-note@-1 {{Assuming 'cond' is not equal to 0}}
+    // expected-note@-1 {{Assuming 'cond' is true}}
     // expected-note@-2 {{Taking true branch}}
-    // expected-note@-3 {{Assuming 'cond' is 0}}
+    // expected-note@-3 {{Assuming 'cond' is false}}
     // expected-note@-4 {{Taking false branch}}
     consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}}
     // expected-note@-1 {{Inner pointer of container used after re/deallocation}}
@@ -122,9 +122,9 @@ void multiple_symbols(bool cond) {
   std::string s2;
   const char *c2 = s2.c_str();
   if (cond) {
-    // expected-note@-1 {{Assuming 'cond' is not equal to 0}}
+    // expected-note@-1 {{Assuming 'cond' is true}}
     // expected-note@-2 {{Taking true branch}}
-    // expected-note@-3 {{Assuming 'cond' is 0}}
+    // expected-note@-3 {{Assuming 'cond' is false}}
     // expected-note@-4 {{Taking false branch}}
     consume(c1); // expected-warning {{Inner pointer of container used after re/deallocation}}
     // expected-note@-1 {{Inner pointer of container used after re/deallocation}}
index e58301df8b512a120a92adee8403c3a4cbaec7c3..c25f4393cdf92ddc9a921fe0e0b64e8ef1681c2e 100644 (file)
@@ -395,7 +395,7 @@ void uniqueTest(bool cond) {
   A b;
   b = std::move(a); // peaceful-note {{Object 'a' is moved}}
 
-  if (cond) { // peaceful-note {{Assuming 'cond' is not equal to 0}}
+  if (cond) { // peaceful-note {{Assuming 'cond' is true}}
               // peaceful-note@-1 {{Taking true branch}}
     a.foo(); // peaceful-warning {{Method called on moved-from object 'a'}}
              // peaceful-note@-1 {{Method called on moved-from object 'a'}}