forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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.
 | |
| }
 |