From 00deddb6d8a0e620fd164c5439317f7752da4639 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Tue, 2 Jul 2013 16:50:24 +0000 Subject: [PATCH] [analyzer] Pointers-to-members are (currently) Locs, not NonLocs. While we don't model pointers-to-members besides "null" and "non-null", we were using Loc symbols for valid pointers and NonLoc integers for the null case. This hit the assert committed in r185401. Fixed by using a true (Loc) null for null member pointers. llvm-svn: 185444 --- clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp | 2 +- clang/test/Analysis/pointer-to-member.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp index e9dda5ceeab7..888963359b4d 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp @@ -371,7 +371,7 @@ void ExprEngine::VisitCast(const CastExpr *CastE, const Expr *Ex, } case CK_NullToMemberPointer: { // FIXME: For now, member pointers are represented by void *. - SVal V = svalBuilder.makeIntValWithPtrWidth(0, true); + SVal V = svalBuilder.makeNull(); state = state->BindExpr(CastE, LCtx, V); Bldr.generateNode(CastE, Pred, state); continue; diff --git a/clang/test/Analysis/pointer-to-member.cpp b/clang/test/Analysis/pointer-to-member.cpp index c9150e8ca594..37d04399b7b7 100644 --- a/clang/test/Analysis/pointer-to-member.cpp +++ b/clang/test/Analysis/pointer-to-member.cpp @@ -33,6 +33,7 @@ void testConditionalUse() { void testComparison() { clang_analyzer_eval(&A::getPtr == &A::getPtr); // expected-warning{{TRUE}} + clang_analyzer_eval(&A::getPtr == 0); // expected-warning{{FALSE}} // FIXME: Should be TRUE. clang_analyzer_eval(&A::m_ptr == &A::m_ptr); // expected-warning{{UNKNOWN}}