mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-03 19:32:35 +00:00
[analyzer] Don't generate a summary for "freeWhenDone" if method is
inlined. Fixes a false positive that occurs if a user writes their own initWithBytesNoCopy:freeWhenDone wrapper. llvm-svn: 169795
This commit is contained in:
parent
db1450800a
commit
a7b1c47c1a
@ -499,6 +499,9 @@ static bool isFreeWhenDoneSetToZero(const ObjCMethodCall &Call) {
|
||||
|
||||
void MallocChecker::checkPostObjCMessage(const ObjCMethodCall &Call,
|
||||
CheckerContext &C) const {
|
||||
if (C.wasInlined)
|
||||
return;
|
||||
|
||||
// If the first selector is dataWithBytesNoCopy, assume that the memory will
|
||||
// be released with 'free' by the new object.
|
||||
// Ex: [NSData dataWithBytesNoCopy:bytes length:10];
|
||||
|
@ -5,6 +5,16 @@ typedef __typeof(sizeof(int)) size_t;
|
||||
void *malloc(size_t);
|
||||
void free(void *);
|
||||
|
||||
@interface Wrapper : NSData
|
||||
- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len;
|
||||
@end
|
||||
|
||||
@implementation Wrapper
|
||||
- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len {
|
||||
return [self initWithBytesNoCopy:bytes length:len freeWhenDone:1]; // no-warning
|
||||
}
|
||||
@end
|
||||
|
||||
// Done with headers. Start testing.
|
||||
void testNSDatafFreeWhenDoneNoError(NSUInteger dataLength) {
|
||||
unsigned char *data = (unsigned char *)malloc(42);
|
||||
@ -21,6 +31,11 @@ void testNSDataFreeWhenDoneYES2(NSUInteger dataLength) {
|
||||
NSData *nsdata = [[NSData alloc] initWithBytesNoCopy:data length:dataLength freeWhenDone:1]; // no-warning
|
||||
}
|
||||
|
||||
void testNSDataFreeWhenDoneYES2_with_wrapper(NSUInteger dataLength) {
|
||||
unsigned char *data = (unsigned char *)malloc(42);
|
||||
Wrapper *nsdata = [[Wrapper alloc] initWithBytesNoCopy:data length:dataLength]; // no-warning
|
||||
}
|
||||
|
||||
void testNSStringFreeWhenDoneYES3(NSUInteger dataLength) {
|
||||
unsigned char *data = (unsigned char *)malloc(42);
|
||||
NSString *nsstr = [[NSString alloc] initWithBytesNoCopy:data length:dataLength encoding:NSUTF8StringEncoding freeWhenDone:1];
|
||||
|
Loading…
Reference in New Issue
Block a user