Author: dergachev Date: Wed Dec 12 17:30:47 2018 New Revision: 349000 URL: http://llvm.org/viewvc/llvm-project?rev=349000&view=rev Log: [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. Modified: cfe/trunk/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m Modified: cfe/trunk/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m?rev=349000&r1=348999&r2=349000&view=diff ============================================================================== --- cfe/trunk/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m (original) +++ cfe/trunk/test/Analysis/Checkers/RunLoopAutoreleaseLeakChecker.m Wed Dec 12 17:30:47 2018 @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits