38 lines
899 B
C++
38 lines
899 B
C++
|
// RUN: %clang_analyze_cc1 \
|
||
|
// RUN: -analyzer-checker=core,unix.Malloc \
|
||
|
// RUN: -verify %s
|
||
|
|
||
|
// expected-no-diagnostics: We do not model Integer Set Library's retain-count
|
||
|
// based allocation. If any of the parameters has an
|
||
|
// '__isl_' prefixed macro definition we escape every
|
||
|
// of them when we are about to 'free()' something.
|
||
|
|
||
|
#define __isl_take
|
||
|
#define __isl_keep
|
||
|
|
||
|
struct Object { int Ref; };
|
||
|
void free(void *);
|
||
|
|
||
|
Object *copyObj(__isl_keep Object *O) {
|
||
|
O->Ref++;
|
||
|
return O;
|
||
|
}
|
||
|
|
||
|
void freeObj(__isl_take Object *O) {
|
||
|
if (--O->Ref > 0)
|
||
|
return;
|
||
|
|
||
|
free(O); // Here we notice that the parameter contains '__isl_', escape it.
|
||
|
}
|
||
|
|
||
|
void useAfterFree(__isl_take Object *A) {
|
||
|
if (!A)
|
||
|
return;
|
||
|
|
||
|
Object *B = copyObj(A);
|
||
|
freeObj(B);
|
||
|
|
||
|
A->Ref = 13;
|
||
|
// no-warning: 'Use of memory after it is freed' was here.
|
||
|
}
|