| // 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; | |
| } | |