llvm-project/clang/test/Analysis/symbol-escape.cpp
Gabor Horvath 8434fbbee6 Revert "[analyzer] Keep track of escaped locals"
It was a step in the right direction but it is not clear how can this
fit into the checker API at this point. The pre-escape happens in the
analyzer core and the checker has no control over it. If the checker
is not interestd in a pre-escape it would need to do additional work
on each escape to check if the escaped symbol is originated from an
"uninteresting" pre-escaped memory region. In order to keep the
checker API simple we abandoned this solution for now.

We will reland this once we have a better answer for what to do on the
checker side.

This reverts commit f3a28202ef58551db15818f8f51afd21e0f3e231.
2019-12-10 16:42:03 -08:00

34 lines
1005 B
C++

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