diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-08-04 01:04:52 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-08-04 01:04:52 +0000 |
commit | a8695180217806bb421cfc6700bec76fc0b1ae56 (patch) | |
tree | fbe7290a6d43aa228973cab09ed8ce5d4b23177d /lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp | |
parent | 522f46f497d9ccecc8bc2f5ec132b9bb7060dee1 (diff) |
[analyzer] Use a more robust check for null in CallAndMessageChecker.
This should fix the failing test on the buildbot as well.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161290 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp b/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp index e09d6885a9..30f45c7685 100644 --- a/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp @@ -232,7 +232,11 @@ void CallAndMessageChecker::checkPreStmt(const CallExpr *CE, return; } - if (L.isZeroConstant()) { + ProgramStateRef StNonNull, StNull; + llvm::tie(StNonNull, StNull) = State->assume(cast<DefinedOrUnknownSVal>(L)); + + // FIXME: Do we want to record the non-null assumption here? + if (StNull && !StNonNull) { if (!BT_call_null) BT_call_null.reset( new BuiltinBug("Called function pointer is null (null dereference)")); @@ -253,7 +257,13 @@ void CallAndMessageChecker::checkPreCall(const CallEvent &Call, emitBadCall(BT_cxx_call_undef.get(), C, CC->getCXXThisExpr()); return; } - if (V.isZeroConstant()) { + + ProgramStateRef State = C.getState(); + ProgramStateRef StNonNull, StNull; + llvm::tie(StNonNull, StNull) = State->assume(cast<DefinedOrUnknownSVal>(V)); + + // FIXME: Do we want to record the non-null assumption here? + if (StNull && !StNonNull) { if (!BT_cxx_call_null) BT_cxx_call_null.reset(new BuiltinBug("Called C++ object pointer " "is null")); |