cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
200 lines
4.9 KiB
Objective-C
200 lines
4.9 KiB
Objective-C
// RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify -triple x86_64-apple-darwin10 -fobjc-arc %s
|
|
|
|
#define NON_ARC !__has_feature(objc_arc)
|
|
|
|
// No diagnostics expected under ARC.
|
|
#if !NON_ARC
|
|
// expected-no-diagnostics
|
|
#endif
|
|
|
|
typedef signed char BOOL;
|
|
@protocol NSObject
|
|
- (BOOL)isEqual:(id)object;
|
|
- (Class)class;
|
|
@end
|
|
|
|
@interface NSObject <NSObject> {}
|
|
- (void)dealloc;
|
|
- (id)init;
|
|
@end
|
|
|
|
typedef struct objc_selector *SEL;
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Do not warn about missing -dealloc method. Not enough context to know
|
|
// whether the ivar is retained or not.
|
|
|
|
@interface MissingDeallocWithIvar : NSObject {
|
|
NSObject *_ivar;
|
|
}
|
|
@end
|
|
|
|
@implementation MissingDeallocWithIvar
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Do not warn about missing -dealloc method. These properties are not
|
|
// retained or synthesized.
|
|
|
|
@interface MissingDeallocWithIntProperty : NSObject
|
|
@property (assign) int ivar;
|
|
@end
|
|
|
|
@implementation MissingDeallocWithIntProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithSELProperty : NSObject
|
|
@property (assign) SEL ivar;
|
|
@end
|
|
|
|
@implementation MissingDeallocWithSELProperty
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Warn about missing -dealloc method.
|
|
|
|
@interface MissingDeallocWithCopyProperty : NSObject
|
|
@property (copy) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithCopyProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithCopyProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithRetainProperty : NSObject
|
|
@property (retain) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithRetainProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithRetainProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithMultipleProperties : NSObject
|
|
@property (retain) NSObject *ivar1;
|
|
@property (retain) NSObject *ivar2;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithMultipleProperties' lacks a 'dealloc' instance method but must release '_ivar1' and others}}
|
|
#endif
|
|
@implementation MissingDeallocWithMultipleProperties
|
|
@end
|
|
|
|
@interface MissingDeallocWithIVarAndRetainProperty : NSObject {
|
|
NSObject *_ivar2;
|
|
}
|
|
@property (retain) NSObject *ivar1;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithIVarAndRetainProperty' lacks a 'dealloc' instance method but must release '_ivar1'}}
|
|
#endif
|
|
@implementation MissingDeallocWithIVarAndRetainProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithReadOnlyRetainedProperty : NSObject
|
|
@property (readonly,retain) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithReadOnlyRetainedProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithReadOnlyRetainedProperty
|
|
@end
|
|
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn about iVars that are selectors.
|
|
|
|
@interface TestSELs : NSObject {
|
|
SEL a;
|
|
SEL b;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TestSELs
|
|
- (id)init {
|
|
if( (self = [super init]) ) {
|
|
a = @selector(a);
|
|
b = @selector(b);
|
|
}
|
|
|
|
return self;
|
|
}
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn about iVars that are IBOutlets.
|
|
|
|
@class NSWindow;
|
|
|
|
@interface HasOutlet : NSObject {
|
|
IBOutlet NSWindow *window;
|
|
}
|
|
@end
|
|
|
|
@implementation HasOutlet // no-warning
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187
|
|
// - Disable the missing -dealloc check for classes that subclass SenTestCase
|
|
|
|
@class NSString;
|
|
|
|
@interface SenTestCase : NSObject {}
|
|
@end
|
|
|
|
@interface MyClassTest : SenTestCase {
|
|
NSString *resourcePath;
|
|
}
|
|
|
|
@property (retain) NSObject *ivar;
|
|
|
|
@end
|
|
|
|
@interface NSBundle : NSObject {}
|
|
+ (NSBundle *)bundleForClass:(Class)aClass;
|
|
- (NSString *)resourcePath;
|
|
@end
|
|
|
|
@implementation MyClassTest
|
|
- (void)setUp {
|
|
resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath];
|
|
}
|
|
- (void)testXXX {
|
|
// do something which uses resourcepath
|
|
}
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn for clases that aren't subclasses of NSObject
|
|
|
|
__attribute__((objc_root_class))
|
|
@interface NonNSObjectMissingDealloc
|
|
@property (retain) NSObject *ivar;
|
|
@end
|
|
@implementation NonNSObjectMissingDealloc
|
|
@end
|
|
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't crash on calls to dealloc as a class method.
|
|
|
|
@interface DeallocingClass : NSObject {}
|
|
@end
|
|
@implementation DeallocingClass
|
|
- (void)dealloc {
|
|
[DeallocingClass dealloc]; // FIXME: Should we warn on this specifically?
|
|
}
|
|
#if NON_ARC
|
|
// expected-warning@-2{{method possibly missing a [super dealloc] call}}
|
|
#endif
|
|
@end
|