xref: /llvm-project/clang/test/Analysis/stackaddrleak.cpp (revision 73dcbd411b4573a4283d30307e48fde0f84423e5)
1*73dcbd41SBalazs Benics // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
2*73dcbd41SBalazs Benics 
3*73dcbd41SBalazs Benics using size_t = decltype(sizeof(int));
operator new(size_t,void * p)4*73dcbd41SBalazs Benics void *operator new(size_t, void *p) { return p; }
5*73dcbd41SBalazs Benics 
6*73dcbd41SBalazs Benics struct myfunction {
7*73dcbd41SBalazs Benics   union storage_t {
8*73dcbd41SBalazs Benics     char buffer[100];
9*73dcbd41SBalazs Benics     size_t max_align;
10*73dcbd41SBalazs Benics   } storage;
11*73dcbd41SBalazs Benics 
myfunctionmyfunction12*73dcbd41SBalazs Benics   template <typename Func> myfunction(Func fn) {
13*73dcbd41SBalazs Benics     new (&storage.buffer) Func(fn);
14*73dcbd41SBalazs Benics   }
15*73dcbd41SBalazs Benics   void operator()();
16*73dcbd41SBalazs Benics };
17*73dcbd41SBalazs Benics 
create_func()18*73dcbd41SBalazs Benics myfunction create_func() {
19*73dcbd41SBalazs Benics   int n;
20*73dcbd41SBalazs Benics   auto c = [&n] {};
21*73dcbd41SBalazs Benics   return c; // expected-warning {{Address of stack memory associated with local variable 'n' is still referred to by a temporary object on the stack upon returning to the caller.  This will be a dangling reference}}
22*73dcbd41SBalazs Benics }
gh_66221()23*73dcbd41SBalazs Benics void gh_66221() {
24*73dcbd41SBalazs Benics   create_func()();
25*73dcbd41SBalazs Benics }
26