forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			34 lines
		
	
	
		
			1005 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			1005 B
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_analyze_cc1 \
 | |
| // RUN:  -analyzer-checker=core,cplusplus.NewDeleteLeaks \
 | |
| // RUN:  -verify %s
 | |
| 
 | |
| // expected-no-diagnostics: Whenever we cannot evaluate an operation we escape
 | |
| //                          the operands. After the evaluation it would be an
 | |
| //                          Unknown value and the tracking would be lost.
 | |
| 
 | |
| typedef unsigned __INTPTR_TYPE__ uintptr_t;
 | |
| 
 | |
| class C {};
 | |
| 
 | |
| C *simple_escape_in_bitwise_op(C *Foo) {
 | |
|   C *Bar = new C();
 | |
|   Bar = reinterpret_cast<C *>(reinterpret_cast<uintptr_t>(Bar) & 0x1);
 | |
|   (void)Bar;
 | |
|   // no-warning: "Potential leak of memory pointed to by 'Bar'" was here.
 | |
| 
 | |
|   return Bar;
 | |
| }
 | |
| 
 | |
| C **indirect_escape_in_bitwise_op() {
 | |
|   C *Qux = new C();
 | |
|   C **Baz = &Qux;
 | |
|   Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) | 0x1);
 | |
|   Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) &
 | |
| 		               ~static_cast<uintptr_t>(0x1));
 | |
|   // no-warning: "Potential leak of memory pointed to by 'Qux'" was here.
 | |
| 
 | |
|   delete *Baz;
 | |
|   return Baz;
 | |
| }
 | |
| 
 |