blob: 9347709a23ca0e0af47d3082108f89a2fd03901f [file] [log] [blame]
// RUN: %clang_cc1 -Wfree-nonheap-object -std=c++11 -x c++ -fsyntax-only -verify %s
extern "C" void free(void *) {}
namespace std {
using size_t = decltype(sizeof(0));
void *malloc(size_t);
void free(void *p);
} // namespace std
int GI;
struct S {
operator char *() { return ptr; }
void CFree() {
::free(&ptr); // expected-warning {{attempt to call free on non-heap object 'ptr'}}
::free(&I); // expected-warning {{attempt to call free on non-heap object 'I'}}
::free(ptr);
}
void CXXFree() {
std::free(&ptr); // expected-warning {{attempt to call std::free on non-heap object 'ptr'}}
std::free(&I); // expected-warning {{attempt to call std::free on non-heap object 'I'}}
std::free(ptr);
}
private:
char *ptr = (char *)std::malloc(10);
static int I;
};
int S::I = 0;
void test1() {
{
free(&GI); // expected-warning {{attempt to call free on non-heap object 'GI'}}
}
{
static int SI = 0;
free(&SI); // expected-warning {{attempt to call free on non-heap object 'SI'}}
}
{
int I = 0;
free(&I); // expected-warning {{attempt to call free on non-heap object 'I'}}
}
{
int I = 0;
int *P = &I;
free(P);
}
{
void *P = std::malloc(8);
free(P); // FIXME diagnosing this would require control flow analysis.
}
{
int A[] = {0, 1, 2, 3};
free(A); // expected-warning {{attempt to call free on non-heap object 'A'}}
}
{
int A[] = {0, 1, 2, 3};
free(&A); // expected-warning {{attempt to call free on non-heap object 'A'}}
}
{
S s;
free(s);
free(&s); // expected-warning {{attempt to call free on non-heap object 's'}}
}
{
S s;
s.CFree();
}
}
void test2() {
{
std::free(&GI); // expected-warning {{attempt to call std::free on non-heap object 'GI'}}
}
{
static int SI = 0;
std::free(&SI); // expected-warning {{attempt to call std::free on non-heap object 'SI'}}
}
{
int I = 0;
std::free(&I); // expected-warning {{attempt to call std::free on non-heap object 'I'}}
}
{
int I = 0;
int *P = &I;
std::free(P); // FIXME diagnosing this would require control flow analysis.
}
{
void *P = std::malloc(8);
std::free(P);
}
{
int A[] = {0, 1, 2, 3};
std::free(A); // expected-warning {{attempt to call std::free on non-heap object 'A'}}
}
{
int A[] = {0, 1, 2, 3};
std::free(&A); // expected-warning {{attempt to call std::free on non-heap object 'A'}}
}
{
S s;
std::free(s);
std::free(&s); // expected-warning {{attempt to call std::free on non-heap object 's'}}
}
{
S s;
s.CXXFree();
}
}