diff options
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 4 | ||||
-rw-r--r-- | clang/test/Analysis/malloc.mm | 5 | ||||
-rw-r--r-- | clang/test/Analysis/system-header-simulator-objc.h | 6 |
3 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 35c6073bca7..b0fcb250795 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -482,7 +482,7 @@ void MallocChecker::checkPostStmt(const CallExpr *CE, CheckerContext &C) const { } static bool isFreeWhenDoneSetToZero(CallOrObjCMessage Call, Selector &S) { - for (unsigned i = 1; i < Call.getNumArgs(); ++i) + for (unsigned i = 1; i < S.getNumArgs(); ++i) if (S.getNameForSlot(i).equals("freeWhenDone")) if (Call.getArgSVal(i).isConstant(0)) return true; @@ -1435,7 +1435,7 @@ bool MallocChecker::doesNotFreeMemory(const CallOrObjCMessage *Call, // White list the ObjC functions which do free memory. // - Anything containing 'freeWhenDone' param set to 1. // Ex: dataWithBytesNoCopy:length:freeWhenDone. - for (unsigned i = 1; i < Call->getNumArgs(); ++i) { + for (unsigned i = 1; i < S.getNumArgs(); ++i) { if (S.getNameForSlot(i).equals("freeWhenDone")) { if (Call->getArgSVal(i).isConstant(1)) return false; diff --git a/clang/test/Analysis/malloc.mm b/clang/test/Analysis/malloc.mm index 23297ec97cb..64135b2366a 100644 --- a/clang/test/Analysis/malloc.mm +++ b/clang/test/Analysis/malloc.mm @@ -206,4 +206,9 @@ void foo(NSPointerArray* pointerArray) { // Freeing the buffer is allowed. void* buffer = [pointerArray pointerAtIndex:0]; free(buffer); +} + +void noCrashOnVariableArgumentSelector() { + NSMutableString *myString = [NSMutableString stringWithString:@"some text"]; + [myString appendFormat:@"some text = %d", 3]; }
\ No newline at end of file diff --git a/clang/test/Analysis/system-header-simulator-objc.h b/clang/test/Analysis/system-header-simulator-objc.h index 20a26cdbaaa..a647b374040 100644 --- a/clang/test/Analysis/system-header-simulator-objc.h +++ b/clang/test/Analysis/system-header-simulator-objc.h @@ -85,7 +85,13 @@ typedef double NSTimeInterval; - (id)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding; - (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer; + (id)stringWithUTF8String:(const char *)nullTerminatedCString; ++ (id)stringWithString:(NSString *)string; @end @class NSString, NSURL, NSError; + +@interface NSMutableString : NSString +- (void)appendFormat:(NSString *)format, ... __attribute__((format(__NSString__, 1, 2))); +@end + @interface NSData : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; + (id)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length; + (id)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b; |