stack-addr-ps.cpp revision 26e10bea3d2e9d2979194890e51b98ecea165a96
168957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -fblocks -verify %s 268957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek 368957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek// FIXME: Only the stack-address checking in Sema catches this right now, and 468957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek// the stack analyzer doesn't handle the ImplicitCastExpr (lvalue). 568957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenekconst int& g() { 668957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek int s; 768957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek return s; // expected-warning{{reference to stack memory associated with local variable 's' returned}} 868957a919084ab8bbd1f01d534db1d6f31d0f459Ted Kremenek} 926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 1026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int& g2() { 1126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int s1; 1226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &s2 = s1; // expected-note {{binding reference variable 's2' here}} 1326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return s2; // expected-warning {{reference to stack memory associated with local variable 's1' returned}} 1426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 1526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 1626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int& g3() { 1726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int s1; 1826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &s2 = s1; // expected-note {{binding reference variable 's2' here}} 1926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &s3 = s2; // expected-note {{binding reference variable 's3' here}} 2026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return s3; // expected-warning {{reference to stack memory associated with local variable 's1' returned}} 2126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 2226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 2326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint get_value(); 2426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 2526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int &get_reference1() { return get_value(); } // expected-warning {{returning reference to local temporary}} 2626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 2726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int &get_reference2() { 2826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const int &x = get_value(); // expected-note {{binding reference variable 'x' here}} 2926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return x; // expected-warning {{returning reference to local temporary}} 3026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 3126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 3226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int &get_reference3() { 3326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const int &x1 = get_value(); // expected-note {{binding reference variable 'x1' here}} 3426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const int &x2 = x1; // expected-note {{binding reference variable 'x2' here}} 3526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return x2; // expected-warning {{returning reference to local temporary}} 3626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 3726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 3826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint global_var; 3926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint *f1() { 4026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &y = global_var; 4126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return &y; 4226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 4326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 4426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint *f2() { 4526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int x1; 4626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &x2 = x1; // expected-note {{binding reference variable 'x2' here}} 4726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return &x2; // expected-warning {{address of stack memory associated with local variable 'x1' returned}} 4826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 4926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 5026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint *f3() { 5126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int x1; 5226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int *const &x2 = &x1; // expected-note {{binding reference variable 'x2' here}} 5326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return x2; // expected-warning {{address of stack memory associated with local variable 'x1' returned}} 5426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 5526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 5626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisconst int *f4() { 5726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const int &x1 = get_value(); // expected-note {{binding reference variable 'x1' here}} 5826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const int &x2 = x1; // expected-note {{binding reference variable 'x2' here}} 5926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return &x2; // expected-warning {{returning address of local temporary}} 6026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 6126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 6226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisstruct S { 6326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int x; 6426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis}; 6526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 6626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisint *mf() { 6726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis S s1; 6826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis S &s2 = s1; // expected-note {{binding reference variable 's2' here}} 6926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int &x = s2.x; // expected-note {{binding reference variable 'x' here}} 7026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return &x; // expected-warning {{address of stack memory associated with local variable 's1' returned}} 7126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 7226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 7326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisvoid *lf() { 7426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis label: 7526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis void *const &x = &&label; // expected-note {{binding reference variable 'x' here}} 7626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return x; // expected-warning {{returning address of label, which is local}} 7726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 7826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 7926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidistypedef void (^bptr)(void); 8026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 8126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisbptr bf(int j) { 8226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis __block int i; 8326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis const bptr &qq = ^{ i=0; }; // expected-note {{binding reference variable 'qq' here}} 8426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return qq; // expected-error {{returning block that lives on the local stack}} 8526e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis} 8626e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis 8726e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidistemplate <typename T> 8826e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidisstruct TS { 8926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int *get(); 9026e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int *m() { 9126e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis int *&x = get(); 9226e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis return x; 9326e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis } 9426e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis}; 95