1*7c3d14c8STreehugger Robot // Build a library with origin tracking and an executable w/o origin tracking. 2*7c3d14c8STreehugger Robot // Test that origin tracking is enabled at runtime. 3*7c3d14c8STreehugger Robot // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -DBUILD_SO -fPIC -shared -o %t-so.so 4*7c3d14c8STreehugger Robot // RUN: %clangxx_msan -O0 %s %t-so.so -o %t && not %run %t 2>&1 | FileCheck %s 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot #ifdef BUILD_SO 7*7c3d14c8STreehugger Robot 8*7c3d14c8STreehugger Robot #include <stdlib.h> 9*7c3d14c8STreehugger Robot 10*7c3d14c8STreehugger Robot extern "C" { my_access(int * p)11*7c3d14c8STreehugger Robotvoid my_access(int *p) { 12*7c3d14c8STreehugger Robot volatile int tmp; 13*7c3d14c8STreehugger Robot // Force initialize-ness check. 14*7c3d14c8STreehugger Robot if (*p) 15*7c3d14c8STreehugger Robot tmp = 1; 16*7c3d14c8STreehugger Robot } 17*7c3d14c8STreehugger Robot my_alloc(unsigned sz)18*7c3d14c8STreehugger Robotvoid *my_alloc(unsigned sz) { 19*7c3d14c8STreehugger Robot return malloc(sz); 20*7c3d14c8STreehugger Robot } 21*7c3d14c8STreehugger Robot } // extern "C" 22*7c3d14c8STreehugger Robot 23*7c3d14c8STreehugger Robot #else // BUILD_SO 24*7c3d14c8STreehugger Robot 25*7c3d14c8STreehugger Robot #include <stdlib.h> 26*7c3d14c8STreehugger Robot 27*7c3d14c8STreehugger Robot extern "C" { 28*7c3d14c8STreehugger Robot void my_access(int *p); 29*7c3d14c8STreehugger Robot void *my_alloc(unsigned sz); 30*7c3d14c8STreehugger Robot } 31*7c3d14c8STreehugger Robot main(int argc,char ** argv)32*7c3d14c8STreehugger Robotint main(int argc, char **argv) { 33*7c3d14c8STreehugger Robot int *x = (int *)my_alloc(sizeof(int)); 34*7c3d14c8STreehugger Robot my_access(x); 35*7c3d14c8STreehugger Robot delete x; 36*7c3d14c8STreehugger Robot 37*7c3d14c8STreehugger Robot // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value 38*7c3d14c8STreehugger Robot // CHECK: {{#0 0x.* in my_access .*dso-origin.cc:}} 39*7c3d14c8STreehugger Robot // CHECK: {{#1 0x.* in main .*dso-origin.cc:}}[[@LINE-5]] 40*7c3d14c8STreehugger Robot // CHECK: Uninitialized value was created by a heap allocation 41*7c3d14c8STreehugger Robot // CHECK: {{#0 0x.* in .*malloc}} 42*7c3d14c8STreehugger Robot // CHECK: {{#1 0x.* in my_alloc .*dso-origin.cc:}} 43*7c3d14c8STreehugger Robot // CHECK: {{#2 0x.* in main .*dso-origin.cc:}}[[@LINE-10]] 44*7c3d14c8STreehugger Robot // CHECK: SUMMARY: MemorySanitizer: use-of-uninitialized-value {{.*dso-origin.cc:.* my_access}} 45*7c3d14c8STreehugger Robot return 0; 46*7c3d14c8STreehugger Robot } 47*7c3d14c8STreehugger Robot 48*7c3d14c8STreehugger Robot #endif // BUILD_SO 49