1b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov// Build a library with origin tracking and an executable w/o origin tracking. 2b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov// Test that origin tracking is enabled at runtime. 35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -fsanitize-memory-track-origins -m64 -O0 %s -DBUILD_SO -fPIC -shared -o %t-so.so 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -m64 -O0 %s %t-so.so -o %t && not %run %t 2>&1 | FileCheck %s 5b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov 65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifdef BUILD_SO 75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stdlib.h> 95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesextern "C" { 115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid my_access(int *p) { 125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines volatile int tmp; 135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // Force initialize-ness check. 145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (*p) 155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines tmp = 1; 165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *my_alloc(unsigned sz) { 195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return malloc(sz); 205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} // extern "C" 225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#else // BUILD_SO 245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 25b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov#include <stdlib.h> 26b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov 275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesextern "C" { 285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid my_access(int *p); 295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *my_alloc(unsigned sz); 305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 31b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov 32b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanovint main(int argc, char **argv) { 33b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov int *x = (int *)my_alloc(sizeof(int)); 34b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov my_access(x); 35b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov delete x; 36b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov 37b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value 385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: {{#0 0x.* in my_access .*dso-origin.cc:}} 39b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov // CHECK: {{#1 0x.* in main .*dso-origin.cc:}}[[@LINE-5]] 40b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov // CHECK: Uninitialized value was created by a heap allocation 41b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov // CHECK: {{#0 0x.* in .*malloc}} 425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: {{#1 0x.* in my_alloc .*dso-origin.cc:}} 43b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov // CHECK: {{#2 0x.* in main .*dso-origin.cc:}}[[@LINE-10]] 445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines // CHECK: SUMMARY: MemorySanitizer: use-of-uninitialized-value {{.*dso-origin.cc:.* my_access}} 45b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov return 0; 46b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov} 475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif // BUILD_SO 49