2017-03-03 06:45:24 +08:00
// RUN: %clang_analyze_cc1 -analyzer-store=region -analyzer-checker=core,unix.Malloc -fblocks -verify %s
// RUN: %clang_analyze_cc1 -analyzer-store=region -analyzer-checker=core,unix.Malloc -fblocks -verify -analyzer-config unix.Malloc:Optimistic=true %s
2015-02-19 21:36:20 +08:00
typedef __typeof ( sizeof ( int ) ) size_t ;
2010-06-08 03:32:37 +08:00
void free ( void * ) ;
2015-02-19 21:36:20 +08:00
void * alloca ( size_t ) ;
2010-06-08 03:32:37 +08:00
void t1 ( ) {
int a [ ] = { 1 } ;
free ( a ) ; // expected-warning {{Argument to free() is the address of the local variable 'a', which is not memory allocated by malloc()}}
}
void t2 ( ) {
int a = 1 ;
free ( & a ) ; // expected-warning {{Argument to free() is the address of the local variable 'a', which is not memory allocated by malloc()}}
}
void t3 ( ) {
static int a [ ] = { 1 } ;
free ( a ) ; // expected-warning {{Argument to free() is the address of the static variable 'a', which is not memory allocated by malloc()}}
}
void t4 ( char * x ) {
free ( x ) ; // no-warning
}
void t5 ( ) {
extern char * ptr ( ) ;
free ( ptr ( ) ) ; // no-warning
}
void t6 ( ) {
free ( ( void * ) 1000 ) ; // expected-warning {{Argument to free() is a constant address (1000), which is not memory allocated by malloc()}}
}
void t7 ( char * * x ) {
free ( * x ) ; // no-warning
}
void t8 ( char * * x ) {
// ugh
free ( ( * x ) + 8 ) ; // no-warning
}
void t9 ( ) {
label :
free ( & & label ) ; // expected-warning {{Argument to free() is the address of the label 'label', which is not memory allocated by malloc()}}
}
void t10 ( ) {
free ( ( void * ) & t10 ) ; // expected-warning {{Argument to free() is the address of the function 't10', which is not memory allocated by malloc()}}
}
void t11 ( ) {
2015-02-19 21:36:20 +08:00
char * p = ( char * ) alloca ( 2 ) ;
2013-03-29 01:05:19 +08:00
free ( p ) ; // expected-warning {{Memory allocated by alloca() should not be deallocated}}
2010-06-08 03:32:37 +08:00
}
void t12 ( ) {
2015-02-19 21:36:20 +08:00
char * p = ( char * ) __builtin_alloca ( 2 ) ;
free ( p ) ; // expected-warning {{Memory allocated by alloca() should not be deallocated}}
}
void t13 ( ) {
2010-06-08 03:32:37 +08:00
free ( ^ { return ; } ) ; // expected-warning {{Argument to free() is a block, which is not memory allocated by malloc()}}
}
2015-02-19 21:36:20 +08:00
void t14 ( char a ) {
2010-06-08 03:32:37 +08:00
free ( & a ) ; // expected-warning {{Argument to free() is the address of the parameter 'a', which is not memory allocated by malloc()}}
}
static int someGlobal [ 2 ] ;
2015-02-19 21:36:20 +08:00
void t15 ( ) {
2010-06-08 03:32:37 +08:00
free ( someGlobal ) ; // expected-warning {{Argument to free() is the address of the global variable 'someGlobal', which is not memory allocated by malloc()}}
}
2015-02-19 21:36:20 +08:00
void t16 ( char * * x , int offset ) {
2010-06-08 03:32:37 +08:00
// Unknown value
free ( x [ offset ] ) ; // no-warning
}