From: Aleksei Sidorin Date: Mon, 23 Apr 2018 15:41:44 +0000 (+0000) Subject: [analyzer] Don't crash on printing ConcreteInt of size >64 bits X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8aec086b16680d94a1f4a8ec22fa9274106167da;p=clang [analyzer] Don't crash on printing ConcreteInt of size >64 bits Printing of ConcreteInts with size >64 bits resulted in assertion failure in get[Z|S]ExtValue() because these methods are only allowed to be used with integers of 64 max bit width. This patch fixes the issue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@330605 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/SVals.cpp b/lib/StaticAnalyzer/Core/SVals.cpp index a75376543e..2105bcc6fc 100644 --- a/lib/StaticAnalyzer/Core/SVals.cpp +++ b/lib/StaticAnalyzer/Core/SVals.cpp @@ -300,13 +300,9 @@ void SVal::dumpToStream(raw_ostream &os) const { void NonLoc::dumpToStream(raw_ostream &os) const { switch (getSubKind()) { case nonloc::ConcreteIntKind: { - const nonloc::ConcreteInt& C = castAs(); - if (C.getValue().isUnsigned()) - os << C.getValue().getZExtValue(); - else - os << C.getValue().getSExtValue(); - os << ' ' << (C.getValue().isUnsigned() ? 'U' : 'S') - << C.getValue().getBitWidth() << 'b'; + const auto &Value = castAs().getValue(); + os << Value << ' ' << (Value.isSigned() ? 'S' : 'U') + << Value.getBitWidth() << 'b'; break; } case nonloc::SymbolValKind: diff --git a/test/Analysis/sval-dump-int128.c b/test/Analysis/sval-dump-int128.c new file mode 100644 index 0000000000..a290776f3c --- /dev/null +++ b/test/Analysis/sval-dump-int128.c @@ -0,0 +1,7 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection %s -verify + +void clang_analyzer_dump(unsigned __int128 x); + +void testDumpInt128() { + clang_analyzer_dump((unsigned __int128)5 << 64); // expected-warning{{92233720368547758080 U128b}} +}