12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 -DSHARED_LIB %s -fPIC -shared -o %t-so.so 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O1 -DSHARED_LIB %s -fPIC -shared -o %t-so.so 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O1 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 -DSHARED_LIB %s -fPIC -shared -o %t-so.so 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O3 -DSHARED_LIB %s -fPIC -shared -o %t-so.so 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O3 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s 95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: arm-linux-gnueabi 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if !defined(SHARED_LIB) 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <dlfcn.h> 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string> 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesusing std::string; 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef void (fun_t)(int x); 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char *argv[]) { 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines string path = string(argv[0]) + "-so.so"; 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines printf("opening %s ... \n", path.c_str()); 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *lib = dlopen(path.c_str(), RTLD_NOW); 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!lib) { 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines printf("error in dlopen(): %s\n", dlerror()); 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fun_t *inc = (fun_t*)dlsym(lib, "inc"); 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!inc) return 1; 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines printf("ok\n"); 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines inc(1); 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines inc(-1); // BOOM 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{.*ERROR: AddressSanitizer: global-buffer-overflow}} 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{READ of size 4 at 0x.* thread T0}} 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{ #0 0x.*}} 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{ #1 0x.* in main .*shared-lib-test.cc:}}[[@LINE-4]] 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else // SHARED_LIBS 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint pad[10]; 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint GLOB[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid inc(int index) { 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GLOB[index]++; 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid inc2(int *a, int index) { 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines a[index]++; 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // SHARED_LIBS 58