blob: 558986d308d4835aaa4e4e8904817e835574c1a2 [file] [log] [blame]
Argyrios Kyrtzidisc4d2c902011-02-28 19:49:42 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -fblocks -verify %s
Ted Kremenek02737ed2008-03-31 15:02:58 +00002
3int* f1() {
4 int x = 0;
Ted Kremeneka8166152010-06-17 04:21:37 +00005 return &x; // expected-warning{{Address of stack memory associated with local variable 'x' returned}} expected-warning{{address of stack memory associated with local variable 'x' returned}}
Ted Kremenek02737ed2008-03-31 15:02:58 +00006}
7
8int* f2(int y) {
Ted Kremeneka8166152010-06-17 04:21:37 +00009 return &y; // expected-warning{{Address of stack memory associated with local variable 'y' returned}} expected-warning{{address of stack memory associated with local variable 'y' returned}}
Ted Kremenek02737ed2008-03-31 15:02:58 +000010}
11
12int* f3(int x, int *y) {
13 int w = 0;
14
15 if (x)
16 y = &w;
17
Ted Kremeneka8166152010-06-17 04:21:37 +000018 return y; // expected-warning{{Address of stack memory associated with local variable 'w' returned to caller}}
Ted Kremenek02737ed2008-03-31 15:02:58 +000019}
20
Ted Kremenekfab6f222008-10-31 00:19:42 +000021void* compound_literal(int x, int y) {
Ted Kremenekd4a07982008-10-30 18:46:50 +000022 if (x)
Eli Friedman759f2522009-05-16 11:45:48 +000023 return &(unsigned short){((unsigned short)0x22EF)}; // expected-warning{{Address of stack memory}}
Ted Kremenek64cc62d2008-10-30 23:17:05 +000024
25 int* array[] = {};
Ted Kremenekd4a07982008-10-30 18:46:50 +000026 struct s { int z; double y; int w; };
Ted Kremenekfab6f222008-10-31 00:19:42 +000027
28 if (y)
29 return &((struct s){ 2, 0.4, 5 * 8 }); // expected-warning{{Address of stack memory}}
30
31
32 void* p = &((struct s){ 42, 0.4, x ? 42 : 0 });
Ted Kremenekbeb62c52008-10-31 00:20:13 +000033 return p; // expected-warning{{Address of stack memory}}
Ted Kremenek194aade2008-10-27 21:57:17 +000034}
Ted Kremenek02737ed2008-03-31 15:02:58 +000035
Ted Kremenekc979a9b2008-11-02 00:37:31 +000036void* alloca_test() {
Eli Friedmane1d77c32009-02-18 01:02:14 +000037 void* p = __builtin_alloca(10);
Ted Kremenekc979a9b2008-11-02 00:37:31 +000038 return p; // expected-warning{{Address of stack memory}}
39}
40
Ted Kremenekdac5bd42009-07-01 23:24:11 +000041int array_test(int x[2]) {
42 return x[0]; // no-warning
43}
44
Ted Kremenekdc147262009-07-02 22:02:15 +000045struct baz {
46 int x;
47 int y[2];
48};
Ted Kremenekdac5bd42009-07-01 23:24:11 +000049
Ted Kremenekdc147262009-07-02 22:02:15 +000050int struct_test(struct baz byVal, int flag) {
51 if (flag)
52 return byVal.x; // no-warning
53 else {
54 return byVal.y[0]; // no-warning
55 }
Ted Kremenekdac5bd42009-07-01 23:24:11 +000056}
Ted Kremeneka1c57162009-11-26 07:14:50 +000057
58typedef int (^ComparatorBlock)(int a, int b);
59ComparatorBlock test_return_block(void) {
60 ComparatorBlock b = ^int(int a, int b){ return a > b; };
Ted Kremenek88299892011-07-28 23:07:59 +000061 return b; // expected-warning{{Address of stack-allocated block declared on line 60 returned to caller}}
Ted Kremeneka1c57162009-11-26 07:14:50 +000062}
63
64ComparatorBlock test_return_block_neg_aux(void);
65ComparatorBlock test_return_block_neg(void) {
66 ComparatorBlock b = test_return_block_neg_aux();
67 return b; // no-warning
68}
69
Ted Kremenek7960ec32010-01-09 20:05:00 +000070// <rdar://problem/7523821>
71int *rdar_7523821_f2() {
72 int a[3];
73 return a; // expected-warning 2 {{ddress of stack memory associated with local variable 'a' returned}}
74};
75
76