From 0853c7f840ee8e23c8271572e73ebab3d26b8fd5 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 10 Sep 2010 20:20:49 +0000 Subject: [PATCH] Polish diagnostics for null dereferences via ObjC ivar accesses. Finishes up . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113612 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Checker/DereferenceChecker.cpp | 13 +++++++++++++ test/Analysis/misc-ps.m | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/Checker/DereferenceChecker.cpp b/lib/Checker/DereferenceChecker.cpp index af74c79558..50392b28cd 100644 --- a/lib/Checker/DereferenceChecker.cpp +++ b/lib/Checker/DereferenceChecker.cpp @@ -123,6 +123,19 @@ void DereferenceChecker::VisitLocation(CheckerContext &C, const Stmt *S, } break; } + case Stmt::ObjCIvarRefExprClass: { + const ObjCIvarRefExpr *IV = cast(S); + if (const DeclRefExpr *DR = + dyn_cast(IV->getBase()->IgnoreParenCasts())) { + if (const VarDecl *VD = dyn_cast(DR->getDecl())) { + llvm::raw_svector_ostream os(buf); + os << "Instance variable access (via '" << VD->getName() + << "') results in a null pointer dereference"; + } + } + Ranges.push_back(IV->getSourceRange()); + break; + } default: break; } diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 09f397041f..a44eb0c18d 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -1110,3 +1110,22 @@ void rdar6351970_c() { @synchronized(x) {} // expected-warning{{Uninitialized value used as mutex for @synchronized}} } +// rule request: direct structure member access null pointer dereference +@interface RDar6352035 { + int c; +} +- (void)foo; +- (void)bar; +@end + +@implementation RDar6352035 +- (void)foo { + RDar6352035 *friend = 0; + friend->c = 7; // expected-warning{{Instance variable access (via 'friend') results in a null pointer dereference}} +} +- (void)bar { + self = 0; + c = 7; // expected-warning{{Instance variable access (via 'self') results in a null pointer dereference}} +} +@end + -- 2.40.0