15e9e463eSVitaly Buka // Test that unused globals are included in the root set. 25e9e463eSVitaly Buka // RUN: %clangxx_lsan -O2 %s -DTEST_LIB -c -o %t.o 35e9e463eSVitaly Buka // RUN: %clangxx_lsan -O2 %s %t.o -o %t 4*d08e5d4cSClemens Wasser // RUN: %env_lsan_opts="use_stacks=0:use_registers=0:use_globals=1" %run %t 2>&1 | FileCheck %s --implicit-check-not=leak 55e9e463eSVitaly Buka // RUN: %env_lsan_opts="" %run %t 2>&1 | FileCheck %s --implicit-check-not=leak 65e9e463eSVitaly Buka 7149d5a8cSVitaly Buka // FIXME: This check is not very important and fails on arm7. 8*d08e5d4cSClemens Wasser // %env_lsan_opts="use_stacks=0:use_registers=0:use_globals=0" not %run %t 2>&1 | FileCheck %s --check-prefixes=LEAK 9149d5a8cSVitaly Buka 105e9e463eSVitaly Buka #include <stdio.h> 115e9e463eSVitaly Buka #include <stdlib.h> 125e9e463eSVitaly Buka #include <string.h> 135e9e463eSVitaly Buka 145e9e463eSVitaly Buka #ifdef TEST_LIB 155e9e463eSVitaly Buka set(char * a)165e9e463eSVitaly Bukavoid set(char *a) { 1744c83eccSVitaly Buka strcpy(a, "hello"); 185e9e463eSVitaly Buka } 195e9e463eSVitaly Buka 205e9e463eSVitaly Buka #else 215e9e463eSVitaly Buka 225e9e463eSVitaly Buka static void *g; 235e9e463eSVitaly Buka 245e9e463eSVitaly Buka void set(char *a); foo(void * a)255e9e463eSVitaly Bukavoid foo(void *a) { 265e9e463eSVitaly Buka // Store from a different function to suppress global localization. 275e9e463eSVitaly Buka g = a; 285e9e463eSVitaly Buka } 295e9e463eSVitaly Buka main()305e9e463eSVitaly Bukaint main() { 315e9e463eSVitaly Buka char a[10]; 325e9e463eSVitaly Buka set(a); 335e9e463eSVitaly Buka char *b = strdup(a); 345e9e463eSVitaly Buka printf("%p %s\n", b, b); 355e9e463eSVitaly Buka g = b; 365e9e463eSVitaly Buka } 375e9e463eSVitaly Buka 385e9e463eSVitaly Buka #endif 395e9e463eSVitaly Buka 405e9e463eSVitaly Buka // LEAK: LeakSanitizer: detected memory leaks 41