1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify -Wno-objc-root-class -fblocks %s |
2 | #include "Inputs/system-header-simulator-objc.h" |
3 | |
4 | @class NSString; |
5 | typedef __typeof(sizeof(int)) size_t; |
6 | void *malloc(size_t); |
7 | void free(void *); |
8 | |
9 | // RDar10579586 - Test use of malloc() with Objective-C string literal as a |
10 | // test condition. Not really a malloc() issue, but this also exercises |
11 | // the check that malloc() returns uninitialized memory. |
12 | @interface RDar10579586 |
13 | struct rdar0579586_str { |
14 | char str_c; |
15 | }; |
16 | @end |
17 | |
18 | void rdar10579586(char x); |
19 | |
20 | @implementation RDar10579586 |
21 | + (NSString *)foobar |
22 | { |
23 | struct rdar0579586_str *buffer = ((void*)0); |
24 | NSString *error = ((void*)0); |
25 | |
26 | if ((buffer = malloc(sizeof(struct rdar0579586_str))) == ((void*)0)) |
27 | error = @"buffer allocation failure"; |
28 | |
29 | if (error != ((void*)0)) |
30 | return error; |
31 | |
32 | rdar10579586(buffer->str_c); // expected-warning {{1st function call argument is an uninitialized value}} |
33 | free(buffer); |
34 | return ((void*)0); |
35 | } |
36 | @end |
37 | |
38 | @interface MyArray : NSObject { |
39 | id * objects; |
40 | } |
41 | @end |
42 | |
43 | void _ArrayCreate() { |
44 | MyArray *array = (MyArray *)malloc(12); |
45 | array = [array init]; |
46 | free(array); // no-warning |
47 | } |
48 | |
49 | void testNSDataTruePositiveLeak() { |
50 | char *b = (char *)malloc(12); |
51 | NSData *d = [[NSData alloc] initWithBytes: b length: 12]; // expected-warning {{Potential leak of memory pointed to by 'b'}} |
52 | } |
53 | |
54 | id wrapInNSValue() { |
55 | void *buffer = malloc(4); |
56 | return [NSValue valueWithPointer:buffer]; // no-warning |
57 | } |