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