xref: /llvm-project/clang/test/Analysis/malloc-free-after-return.cpp (revision 33e5a158964525f0ec10651c2f58b097f81d245b)
1122171e2SReka Kovacs // RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete -verify %s
2122171e2SReka Kovacs 
3122171e2SReka Kovacs #include "Inputs/system-header-simulator-cxx.h"
4122171e2SReka Kovacs 
5122171e2SReka Kovacs struct S {
SS6122171e2SReka Kovacs   S() : Data(new int) {}
~SS7122171e2SReka Kovacs   ~S() { delete Data; }
getDataS8122171e2SReka Kovacs   int *getData() { return Data; }
9122171e2SReka Kovacs 
10122171e2SReka Kovacs private:
11122171e2SReka Kovacs   int *Data;
12122171e2SReka Kovacs };
13122171e2SReka Kovacs 
freeAfterReturnTemp()14122171e2SReka Kovacs int *freeAfterReturnTemp() {
15122171e2SReka Kovacs   return S().getData(); // expected-warning {{Use of memory after it is freed}}
16122171e2SReka Kovacs }
17122171e2SReka Kovacs 
freeAfterReturnLocal()18122171e2SReka Kovacs int *freeAfterReturnLocal() {
19122171e2SReka Kovacs   S X;
20*33e5a158SGeorge Karpenkov   return X.getData(); // expected-warning {{Use of memory after it is freed}}
21*33e5a158SGeorge Karpenkov }
22