[PATCH] D44071: [TSan] fix Go runtime test on amd64 with PIE

Martin Pelikán via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 3 11:02:01 PST 2018


pelikan created this revision.
pelikan added reviewers: kcc, dvyukov.
Herald added subscribers: Sanitizers, delcypher, kubamracek.

Without this diff, the test segfaults.  Examining the generated executable
(which gets auto-deleted likely by cmake/ninja) yields this error message:

ThreadSanitizer failed to allocate 0x4000 (16384) bytes at address 1755558480000 (errno: 12)

Note that the address has more than 47 bits, which on amd64 means special
treatment and therefore points out an overflow.  The allocation came from
__tsan_map_shadow on a .data pointer, which (on my work Debian-based box)
means the 0x550000000000 range.  This doesn't correspond to the constants
mentioned in tsan_platform.h for Go binaries on Linux/amd64.

The diff therefore allocates memory in the sort of area Go programs would,
and prevents the test from crashing.  It would be nice if reviewers kindly
considered other setups and architectures :-)


Repository:
  rCRT Compiler Runtime

https://reviews.llvm.org/D44071

Files:
  lib/tsan/go/test.c


Index: lib/tsan/go/test.c
===================================================================
--- lib/tsan/go/test.c
+++ lib/tsan/go/test.c
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <sys/mman.h>
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -44,7 +45,13 @@
   }
 }
 
-char buf0[100<<10];
+/*
+ * See lib/tsan/rtl/tsan_platform.h for details of what the memory layout
+ * of Go programs looks like.  To prevent running over existing mappings,
+ * we pick an address slightly inside the Go heap region.
+ */
+void *go_heap = (void *)0xC011110000;
+char *buf0;
 
 void foobar() {}
 void barfoo() {}
@@ -54,6 +61,14 @@
   void *proc0 = 0;
   __tsan_init(&thr0, &proc0, symbolize_cb);
   current_proc = proc0;
+
+  // Allocate something resembling a heap in Go.
+  buf0 = mmap(go_heap, 16384, PROT_READ | PROT_WRITE,
+              MAP_PRIVATE | MAP_FIXED | MAP_ANON, -1, 0);
+  if (buf0 == MAP_FAILED) {
+    fprintf(stderr, "failed to allocate Go-like heap at %p\n", go_heap);
+    return 1;
+  }
   char *buf = (char*)((unsigned long)buf0 + (64<<10) - 1 & ~((64<<10) - 1));
   __tsan_map_shadow(buf, 4096);
   __tsan_malloc(thr0, (char*)&barfoo + 1, buf, 10);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44071.136926.patch
Type: text/x-patch
Size: 1232 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180303/b39c2fef/attachment.bin>


More information about the llvm-commits mailing list