41 lines
		
	
	
		
			952 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			952 B
		
	
	
	
		
			C++
		
	
	
	
| // Test that unused globals are included in the root set.
 | |
| // RUN: %clangxx_lsan -O2 %s -DTEST_LIB -c -o %t.o
 | |
| // RUN: %clangxx_lsan -O2 %s %t.o -o %t
 | |
| // RUN: %env_lsan_opts="use_stacks=0:use_registers=0:use_globals=1" %run %t 2>&1 | FileCheck %s --implicit-check-not=leak
 | |
| // RUN: %env_lsan_opts="" %run %t 2>&1 | FileCheck %s --implicit-check-not=leak
 | |
| 
 | |
| // FIXME: This check is not very important and fails on arm7.
 | |
| // %env_lsan_opts="use_stacks=0:use_registers=0:use_globals=0" not %run %t 2>&1 | FileCheck %s --check-prefixes=LEAK
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #ifdef TEST_LIB
 | |
| 
 | |
| void set(char *a) {
 | |
|   strcpy(a, "hello");
 | |
| }
 | |
| 
 | |
| #else
 | |
| 
 | |
| static void *g;
 | |
| 
 | |
| void set(char *a);
 | |
| void foo(void *a) {
 | |
|   // Store from a different function to suppress global localization.
 | |
|   g = a;
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|   char a[10];
 | |
|   set(a);
 | |
|   char *b = strdup(a);
 | |
|   printf("%p %s\n", b, b);
 | |
|   g = b;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| // LEAK: LeakSanitizer: detected memory leaks
 |