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