xref: /aosp_15_r20/external/compiler-rt/test/msan/dso-origin.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot void 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 Robot void *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 Robot int 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