34 lines
917 B
C++
34 lines
917 B
C++
|
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-allocator-inlining=true -std=c++11 -verify -analyzer-config eagerly-assume=false %s
|
||
|
|
||
|
void clang_analyzer_eval(bool);
|
||
|
void clang_analyzer_warnOnDeadSymbol(int);
|
||
|
|
||
|
typedef __typeof__(sizeof(int)) size_t;
|
||
|
|
||
|
int conjure();
|
||
|
void exit(int);
|
||
|
|
||
|
struct S {
|
||
|
S() {}
|
||
|
~S() {}
|
||
|
|
||
|
static S buffer[1000];
|
||
|
|
||
|
// This operator allocates stuff within the buffer. Additionally, it never
|
||
|
// places anything at the beginning of the buffer.
|
||
|
void *operator new(size_t size) {
|
||
|
int i = conjure();
|
||
|
if (i == 0)
|
||
|
exit(1);
|
||
|
// Let's see if the symbol dies before new-expression is evaluated.
|
||
|
// It shouldn't.
|
||
|
clang_analyzer_warnOnDeadSymbol(i);
|
||
|
return buffer + i;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void testIndexLiveness() {
|
||
|
S *s = new S();
|
||
|
clang_analyzer_eval(s == S::buffer); // expected-warning{{FALSE}}
|
||
|
} // expected-warning{{SYMBOL DEAD}}
|