| // RUN: %clang_analyze_cc1 \ |
| // RUN: -analyzer-checker=core,cplusplus.NewDeleteLeaks \ |
| // RUN: -verify %s |
| |
| // expected-no-diagnostics: Whenever we cannot evaluate an operation we escape |
| // the operands. After the evaluation it would be an |
| // Unknown value and the tracking would be lost. |
| |
| typedef unsigned __INTPTR_TYPE__ uintptr_t; |
| |
| class C {}; |
| |
| C *simple_escape_in_bitwise_op(C *Foo) { |
| C *Bar = new C(); |
| Bar = reinterpret_cast<C *>(reinterpret_cast<uintptr_t>(Bar) & 0x1); |
| (void)Bar; |
| // no-warning: "Potential leak of memory pointed to by 'Bar'" was here. |
| |
| return Bar; |
| } |
| |
| C **indirect_escape_in_bitwise_op() { |
| C *Qux = new C(); |
| C **Baz = &Qux; |
| Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) | 0x1); |
| Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) & |
| ~static_cast<uintptr_t>(0x1)); |
| // no-warning: "Potential leak of memory pointed to by 'Qux'" was here. |
| |
| delete *Baz; |
| return Baz; |
| } |
| |