1 // RUN: %clang_analyze_cc1 \ 2 // RUN: -analyzer-checker=core,unix.Malloc \ 3 // RUN: -verify %s 4 5 // expected-no-diagnostics: We do not model Integer Set Library's retain-count 6 // based allocation. If any of the parameters has an 7 // '__isl_' prefixed macro definition we escape every 8 // of them when we are about to 'free()' something. 9 10 #define __isl_take 11 #define __isl_keep 12 13 struct Object { int Ref; }; 14 void free(void *); 15 copyObj(__isl_keep Object * O)16Object *copyObj(__isl_keep Object *O) { 17 O->Ref++; 18 return O; 19 } 20 freeObj(__isl_take Object * O)21void freeObj(__isl_take Object *O) { 22 if (--O->Ref > 0) 23 return; 24 25 free(O); // Here we notice that the parameter contains '__isl_', escape it. 26 } 27 useAfterFree(__isl_take Object * A)28void useAfterFree(__isl_take Object *A) { 29 if (!A) 30 return; 31 32 Object *B = copyObj(A); 33 freeObj(B); 34 35 A->Ref = 13; 36 // no-warning: 'Use of memory after it is freed' was here. 37 } 38