From adf5a32ec57addb326ff6cd13f1e9e0a6a10bdb8 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Tue, 27 Mar 2018 18:58:28 +0000 Subject: [PATCH] [Sema] Avoid crash for category implementation without interface When we have a category implementation without a corresponding interface (which is an error by itself), semantic checks for property accesses will attempt to access a null interface declaration and then segfault. Error out in such cases instead. Differential Revision: https://reviews.llvm.org/D44916 llvm-svn: 328654 --- clang/lib/Sema/SemaExprMember.cpp | 3 +++ clang/test/SemaObjC/undef-class-property-error.m | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 clang/test/SemaObjC/undef-class-property-error.m diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index d054274..522e4bb 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1568,6 +1568,9 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, // Also must look for a getter name which uses property syntax. Selector Sel = S.PP.getSelectorTable().getNullarySelector(Member); ObjCInterfaceDecl *IFace = MD->getClassInterface(); + if (!IFace) + goto fail; + ObjCMethodDecl *Getter; if ((Getter = IFace->lookupClassMethod(Sel))) { // Check the use of this method. diff --git a/clang/test/SemaObjC/undef-class-property-error.m b/clang/test/SemaObjC/undef-class-property-error.m new file mode 100644 index 0000000..e7e5db4 --- /dev/null +++ b/clang/test/SemaObjC/undef-class-property-error.m @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +@implementation I (C) // expected-error {{cannot find interface declaration for 'I'}} + ++ (void)f { + self.m; // expected-error {{member reference base type 'Class' is not a structure or union}} +} + +@end -- 2.7.4