| // 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 released' was here. | |
| } |