Clang Project

clang_source_code/test/Analysis/NewDelete-path-notes.cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=text -verify %s
2// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=text -analyzer-config c++-allocator-inlining=true -verify %s
3// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=plist %s -o %t.plist
4// RUN: cat %t.plist | %diff_plist %S/Inputs/expected-plists/NewDelete-path-notes.cpp.plist -
5
6void test() {
7  int *p = new int;
8  // expected-note@-1 {{Memory is allocated}}
9  if (p)
10    // expected-note@-1 {{Taking true branch}}
11    delete p;
12    // expected-note@-1 {{Memory is released}}
13
14  delete p; // expected-warning {{Attempt to free released memory}}
15  // expected-note@-1 {{Attempt to free released memory}}
16}
17
18struct Odd {
19 void kill() {
20 delete this; // expected-note {{Memory is released}}
21 }
22};
23
24void test(Odd *odd) {
25 odd->kill(); // expected-note{{Calling 'Odd::kill'}}
26               // expected-note@-1 {{Returning; memory was released}}
27 delete odd; // expected-warning {{Attempt to free released memory}}
28              // expected-note@-1 {{Attempt to free released memory}}
29}
30
31