From 8f04bba0e5714f154d79ab04dfac62fd5fd8ff07 Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Thu, 13 Dec 2018 01:30:47 +0000 Subject: [PATCH] [analyzer] RunLoopAutoreleaseLeakChecker: Come up with a test for r348822. Statement memoization was removed in r348822 because it was noticed to cause memory corruption. This was happening because a reference to an object in a DenseMap was used after being invalidated by inserting a new key into the map. This test case crashes reliably under ASan (i.e., when Clang is built with -DLLVM_USE_SANITIZER="Address") on at least some machines before r348822 and doesn't crash after it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@349000 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Checkers/RunLoopAutoreleaseLeakChecker.m | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m b/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m index b00d71b1a4..2bf86410f3 100644 --- a/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m +++ b/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m @@ -1,9 +1,15 @@ -// UNSUPPORTED: system-windows -// RUN: %clang_analyze_cc1 -fobjc-arc -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak %s -triple x86_64-darwin -verify -// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP1=1 -fobjc-arc -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak %s -triple x86_64-darwin -verify -// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP2=1 -fobjc-arc -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak %s -triple x86_64-darwin -verify -// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP3=1 -fobjc-arc -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak %s -triple x86_64-darwin -verify -// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP4=1 -fobjc-arc -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak %s -triple x86_64-darwin -verify +// RUN: %clang_analyze_cc1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s +// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP1=1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s +// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP2=1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s +// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP3=1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s +// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP4=1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s +// RUN: %clang_analyze_cc1 -DEXTRA=1 -DAP5=1 -fobjc-arc -triple x86_64-darwin\ +// RUN: -analyzer-checker=core,osx.cocoa.RunLoopAutoreleaseLeak -verify %s #include "../Inputs/system-header-simulator-for-objc-dealloc.h" @@ -122,3 +128,34 @@ int main() { return 0; } #endif + +#ifdef AP5 +@class NSString; +@class NSConstantString; +#define CF_BRIDGED_TYPE(T) __attribute__((objc_bridge(T))) +typedef const CF_BRIDGED_TYPE(id) void * CFTypeRef; +typedef const struct CF_BRIDGED_TYPE(NSString) __CFString * CFStringRef; + +typedef enum { WARNING } Level; +id do_log(Level, const char *); +#define log(level, msg) __extension__({ (do_log(level, msg)); }) + +@interface I +- foo; +@end + +CFStringRef processString(const __NSConstantString *, void *); + +#define CFSTR __builtin___CFStringMakeConstantString + +int main() { + I *i; + @autoreleasepool { + NSString *s1 = (__bridge_transfer NSString *)processString(0, 0); + NSString *s2 = (__bridge_transfer NSString *)processString((CFSTR("")), ((void *)0)); + log(WARNING, "Hello world!"); + } + [[NSRunLoop mainRunLoop] run]; + [i foo]; // no-crash // expected-warning{{Temporary objects allocated in the autorelease pool of last resort followed by the launch of main run loop may never get released; consider moving them to a separate autorelease pool}} +} +#endif -- 2.40.0