xref: /openbsd-src/gnu/llvm/clang/docs/analyzer/checkers/newdelete_example.cpp (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick void f(int *p);
2*e5dd7070Spatrick 
testUseMiddleArgAfterDelete(int * p)3*e5dd7070Spatrick void testUseMiddleArgAfterDelete(int *p) {
4*e5dd7070Spatrick   delete p;
5*e5dd7070Spatrick   f(p); // warn: use after free
6*e5dd7070Spatrick }
7*e5dd7070Spatrick 
8*e5dd7070Spatrick class SomeClass {
9*e5dd7070Spatrick public:
10*e5dd7070Spatrick   void f();
11*e5dd7070Spatrick };
12*e5dd7070Spatrick 
test()13*e5dd7070Spatrick void test() {
14*e5dd7070Spatrick   SomeClass *c = new SomeClass;
15*e5dd7070Spatrick   delete c;
16*e5dd7070Spatrick   c->f(); // warn: use after free
17*e5dd7070Spatrick }
18*e5dd7070Spatrick 
test()19*e5dd7070Spatrick void test() {
20*e5dd7070Spatrick   int *p = (int *)__builtin_alloca(sizeof(int));
21*e5dd7070Spatrick   delete p; // warn: deleting memory allocated by alloca
22*e5dd7070Spatrick }
23*e5dd7070Spatrick 
test()24*e5dd7070Spatrick void test() {
25*e5dd7070Spatrick   int *p = new int;
26*e5dd7070Spatrick   delete p;
27*e5dd7070Spatrick   delete p; // warn: attempt to free released
28*e5dd7070Spatrick }
29*e5dd7070Spatrick 
test()30*e5dd7070Spatrick void test() {
31*e5dd7070Spatrick   int i;
32*e5dd7070Spatrick   delete &i; // warn: delete address of local
33*e5dd7070Spatrick }
34*e5dd7070Spatrick 
test()35*e5dd7070Spatrick void test() {
36*e5dd7070Spatrick   int *p = new int[1];
37*e5dd7070Spatrick   delete[] (++p);
38*e5dd7070Spatrick     // warn: argument to 'delete[]' is offset by 4 bytes
39*e5dd7070Spatrick     // from the start of memory allocated by 'new[]'
40*e5dd7070Spatrick }
41*e5dd7070Spatrick 
42