[analyzer] ConditionBRVisitor: Boolean support

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

llvm-svn: 362027
This commit is contained in:
Csaba Dabis 2019-05-29 20:34:29 +00:00
parent d1f0ec3f64
commit 2e896b8b39
5 changed files with 21 additions and 14 deletions

View File

@ -2323,10 +2323,17 @@ bool ConditionBRVisitor::printValue(const Expr *CondVarExpr, raw_ostream &Out,
if (!IsAssuming) if (!IsAssuming)
IntValue = getConcreteIntegerValue(CondVarExpr, N); IntValue = getConcreteIntegerValue(CondVarExpr, N);
if (IsAssuming || !IntValue.hasValue()) if (IsAssuming || !IntValue.hasValue()) {
Out << (TookTrue ? "not equal to 0" : "0"); if (Ty->isBooleanType())
else Out << (TookTrue ? "true" : "false");
Out << *IntValue.getValue(); else
Out << (TookTrue ? "not equal to 0" : "0");
} else {
if (Ty->isBooleanType())
Out << (IntValue.getValue()->getBoolValue() ? "true" : "false");
else
Out << *IntValue.getValue();
}
return true; return true;
} }

View File

@ -829,9 +829,9 @@
</array> </array>
</array> </array>
<key>extended_message</key> <key>extended_message</key>
<string>&apos;fail&apos; is 1</string> <string>&apos;fail&apos; is true</string>
<key>message</key> <key>message</key>
<string>&apos;fail&apos; is 1</string> <string>&apos;fail&apos; is true</string>
</dict> </dict>
<dict> <dict>
<key>kind</key><string>control</string> <key>kind</key><string>control</string>

View File

@ -102,7 +102,7 @@ struct C {
C(int pX, int pY, bool Flag) { C(int pX, int pY, bool Flag) {
x = pX; 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}} // expected-note@-1{{Taking true branch}}
return; // expected-note{{Returning without writing to 'this->y'}} return; // expected-note{{Returning without writing to 'this->y'}}
y = pY; y = pY;

View File

@ -38,9 +38,9 @@ void deref_after_scope_char(bool cond) {
std::string s; std::string s;
const char *c2 = s.c_str(); const char *c2 = s.c_str();
if (cond) { 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@-2 {{Taking true branch}}
// expected-note@-3 {{Assuming 'cond' is 0}} // expected-note@-3 {{Assuming 'cond' is false}}
// expected-note@-4 {{Taking false branch}} // expected-note@-4 {{Taking false branch}}
consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}} consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}}
// expected-note@-1 {{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; std::wstring s;
const wchar_t *c2 = s.c_str(); const wchar_t *c2 = s.c_str();
if (cond) { 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@-2 {{Taking true branch}}
// expected-note@-3 {{Assuming 'cond' is 0}} // expected-note@-3 {{Assuming 'cond' is false}}
// expected-note@-4 {{Taking false branch}} // expected-note@-4 {{Taking false branch}}
consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}} consume(c); // expected-warning {{Inner pointer of container used after re/deallocation}}
// expected-note@-1 {{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; std::string s2;
const char *c2 = s2.c_str(); const char *c2 = s2.c_str();
if (cond) { 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@-2 {{Taking true branch}}
// expected-note@-3 {{Assuming 'cond' is 0}} // expected-note@-3 {{Assuming 'cond' is false}}
// expected-note@-4 {{Taking false branch}} // expected-note@-4 {{Taking false branch}}
consume(c1); // expected-warning {{Inner pointer of container used after re/deallocation}} consume(c1); // expected-warning {{Inner pointer of container used after re/deallocation}}
// expected-note@-1 {{Inner pointer of container used after re/deallocation}} // expected-note@-1 {{Inner pointer of container used after re/deallocation}}

View File

@ -395,7 +395,7 @@ void uniqueTest(bool cond) {
A b; A b;
b = std::move(a); // peaceful-note {{Object 'a' is moved}} 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}} // peaceful-note@-1 {{Taking true branch}}
a.foo(); // peaceful-warning {{Method called on moved-from object 'a'}} a.foo(); // peaceful-warning {{Method called on moved-from object 'a'}}
// peaceful-note@-1 {{Method called on moved-from object 'a'}} // peaceful-note@-1 {{Method called on moved-from object 'a'}}