From 11150c009a4099f5248141655d6fe834daf02279 Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Mon, 12 Jun 2017 17:59:50 +0000 Subject: [PATCH] [analyzer] Fix a crash when an ObjC object is constructed in AllocaRegion. Memory region allocated by alloca() carries no implicit type information. Don't crash when resolving the init message for an Objective-C object that is being constructed in such region. rdar://problem/32517077 Differential Revision: https://reviews.llvm.org/D33828 llvm-svn: 305211 --- clang/lib/StaticAnalyzer/Core/CallEvent.cpp | 6 ++++++ clang/test/Analysis/DynamicTypePropagation.m | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index ee761689f479b..1858bfd89637e 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -957,6 +957,12 @@ RuntimeDefinition ObjCMethodCall::getRuntimeDefinition() const { return RuntimeDefinition(); DynamicTypeInfo DTI = getDynamicTypeInfo(getState(), Receiver); + if (!DTI.isValid()) { + assert(isa(Receiver) && + "Unhandled untyped region class!"); + return RuntimeDefinition(); + } + QualType DynType = DTI.getType(); CanBeSubClassed = DTI.canBeASubClass(); ReceiverT = dyn_cast(DynType.getCanonicalType()); diff --git a/clang/test/Analysis/DynamicTypePropagation.m b/clang/test/Analysis/DynamicTypePropagation.m index 25a0ae35fd320..63904b8425675 100644 --- a/clang/test/Analysis/DynamicTypePropagation.m +++ b/clang/test/Analysis/DynamicTypePropagation.m @@ -4,6 +4,9 @@ # error Compiler does not support Objective-C generics? #endif +typedef __typeof(sizeof(int)) size_t; +void *memset(void *, int, size_t); + #define nil 0 typedef unsigned long NSUInteger; typedef int BOOL; @@ -21,6 +24,7 @@ - (void) myFunction:(int*)p myParam:(int) n; @end @interface NSArray : NSObject +- (void) init; - (BOOL)contains:(ObjectType)obj; - (ObjectType)getObjAtIndex:(NSUInteger)idx; - (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx; @@ -55,3 +59,11 @@ void testArgument(NSArray *arr, id element) { // MyType! [element myFunction:0 myParam:0 ]; } + +// Do not try this at home! The analyzer shouldn't crash though when it +// tries to figure out the dynamic type behind the alloca's return value. +void testAlloca(size_t NSArrayClassSizeWeKnowSomehow) { + NSArray *arr = __builtin_alloca(NSArrayClassSizeWeKnowSomehow); + memset(arr, 0, NSArrayClassSizeWeKnowSomehow); + [arr init]; // no-crash +}