diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2018-12-13 01:30:47 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2018-12-13 01:30:47 +0000 |
commit | e9f1edaae1f7a1f52ce122f98747e1ee81201e02 (patch) | |
tree | 9dc7fdcf4d4cdea5593d68dccbdcc5e7a936f58e | |
parent | 8ee59ca65380969fc9e8eb1eb6e631e9fa9772b3 (diff) | |
download | bcm5719-llvm-e9f1edaae1f7a1f52ce122f98747e1ee81201e02.tar.gz bcm5719-llvm-e9f1edaae1f7a1f52ce122f98747e1ee81201e02.zip |
[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.
llvm-svn: 349000
-rw-r--r-- | clang/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/clang/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m b/clang/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m index b00d71b1a4d..2bf86410f3f 100644 --- a/clang/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m +++ b/clang/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 |