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