<div dir="ltr">+eugenis (the msan co-author and current maintainer)<div><br></div><div>I don't remember any hard blockers for 32-bit msan. </div><div>Soft blockers are:</div><div>  * extra work and extra maintenance</div><div>  * too little address space, hard to fit any non-trivial application.  <br><div><br></div><div>You may start looking at /proc/<PID>/maps to see what is the memory region you </div><div>are failing on and how it is related to kMemoryLayout.<br></div></div><div><br></div><div>Just curious, why are you trying to do this? </div><div><br></div><div>--kcc </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 17, 2016 at 8:02 AM, Pusl, Stefan via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div>
<p class="MsoNormal">Hello,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’m quite new to LLVM, but I’m interested in memory sanitizer. The petty thing is, that 32bit addressing on Linux is not supported. Thus I tried to take the latest version of the software and to modify it, using Ubuntu 16.04 as operating
 system. Given the example<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>example.c:<u></u><u></u></i></p>
<p class="MsoNormal"><i>#include <stdio.h><u></u><u></u></i></p>
<p class="MsoNormal"><i>#include <stdlib.h><u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal"><i>int main(int argc, char **argv) {<u></u><u></u></i></p>
<p class="MsoNormal"><i>   int *a = (int *)malloc(10*sizeof(10));<u></u><u></u></i></p>
<p class="MsoNormal"><i>   a[5] = 0;<u></u><u></u></i></p>
<p class="MsoNormal"><i>   if (a[argc])<u></u><u></u></i></p>
<p class="MsoNormal"><i>      printf("xx\n");<u></u><u></u></i></p>
<p class="MsoNormal"><i>   return 0;<u></u><u></u></i></p>
<p class="MsoNormal"><i>}<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">which I compiled with the command<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>clang -fsanitize=memory -m32 -fPIE -pie -fno-omit-frame-pointer -g -Wl,-Map,example32.map example.c -oexample32.out<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I get now a segmentation fault during the execution:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i>(gdb) r<u></u><u></u></i></p>
<p class="MsoNormal"><i>Starting program: /home/pusl/code/example32.out <u></u><u></u></i></p>
<p class="MsoNormal"><i>[Thread debugging using libthread_db enabled]<u></u><u></u></i></p>
<p class="MsoNormal"><i>Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u> <u></u></i></p>
<p class="MsoNormal"><i>Program received signal SIGSEGV, Segmentation fault.<u></u><u></u></i></p>
<p class="MsoNormal"><i>0x565e14f9 in main (argc=1448445640, argv=0xf7f1d3dc) at example.c:4<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I tried to figure out the issue, but as a newcomer to LLVM I don’t have any further idea now to get nearer to the root cause. Any new idea is welcome.
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I changed 5 files. The diffs are:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p style="margin-left:18.0pt">
<u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u><b>cmake/config-ix.cmake</b>:<u></u><u></u></p>
<p class="MsoNormal"><i>diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake<u></u><u></u></i></p>
<p class="MsoNormal"><i>index 04e33a0..d02e319 100644<u></u><u></u></i></p>
<p class="MsoNormal"><i>--- a/cmake/config-ix.cmake<u></u><u></u></i></p>
<p class="MsoNormal"><i>+++ b/cmake/config-ix.cmake<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -149,7 +149,7 @@ set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}<u></u><u></u></i></p>
<p class="MsoNormal"><i>     ${MIPS32} ${MIPS64} ${PPC64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>set(ALL_LSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>-set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>+set(ALL_MSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>set(ALL_PROFILE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC64}<u></u><u></u></i></p>
<p class="MsoNormal"><i>     ${MIPS32} ${MIPS64})<u></u><u></u></i></p>
<p class="MsoNormal"><i>set(ALL_TSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64})<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p style="margin-left:18.0pt">
<u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u><b>lib/msan/msan.h:<u></u><u></u></b></p>
<p class="MsoNormal"><i>diff --git a/lib/msan/msan.h b/lib/msan/msan.h<u></u><u></u></i></p>
<p class="MsoNormal"><i>index be74f6e..10b5b05 100644<u></u><u></u></i></p>
<p class="MsoNormal"><i>--- a/lib/msan/msan.h<u></u><u></u></i></p>
<p class="MsoNormal"><i>+++ b/lib/msan/msan.h<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -147,6 +147,26 @@ const MappingDesc kMemoryLayout[] = {<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define MEM_TO_SHADOW(mem) (LINEARIZE_MEM((mem)) + 0x100000000000ULL)<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SHADOW_TO_ORIGIN(shadow) (((uptr)(shadow)) + 0x280000000000)<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u><u></u></i></p>
<p class="MsoNormal"><i>+#elif SANITIZER_LINUX && SANITIZER_WORDSIZE == 32<u></u><u></u></i></p>
<p class="MsoNormal"><i>+<u></u><u></u></i></p>
<p class="MsoNormal"><i>+const MappingDesc kMemoryLayout[] = {<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x00000000ULL, 0x10000000ULL, MappingDesc::APP, "app-1"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x10000000ULL, 0x20000000ULL, MappingDesc::SHADOW, "shadow-1"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x20000000ULL, 0x30000000ULL, MappingDesc::ORIGIN, "origin-1"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x30000000ULL, 0x50000000ULL, MappingDesc::INVALID, "invalid"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x50000000ULL, 0x60000000ULL, MappingDesc::APP, "app-2"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x60000000ULL, 0x70000000ULL, MappingDesc::SHADOW, "shadow-2"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x70000000ULL, 0x80000000ULL, MappingDesc::ORIGIN, "origin-2"},   
<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x80000000ULL, 0x90000000ULL, MappingDesc::SHADOW, "shadow-3"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0x90000000ULL, 0xa0000000ULL, MappingDesc::ORIGIN, "origin-3"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0xa0000000ULL, 0xf0000000ULL, MappingDesc::INVALID, "invalid"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    {0xf0000000ULL, 0xffffffffULL, MappingDesc::APP, "app-3"},<u></u><u></u></i></p>
<p class="MsoNormal"><i>+};<u></u><u></u></i></p>
<p class="MsoNormal"><i>+#define MOVE_MEM(mem) \<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  ((uptr)(mem) & ~0x80000000ULL)<u></u><u></u></i></p>
<p class="MsoNormal"><i>+#define MEM_TO_SHADOW(mem) (MOVE_MEM((mem)) + 0x10000000ULL)<u></u><u></u></i></p>
<p class="MsoNormal"><i>+#define SHADOW_TO_ORIGIN(mem) (((uptr)(mem)) + 0x10000000ULL)<u></u><u></u></i></p>
<p class="MsoNormal"><i>+<u></u><u></u></i></p>
<p class="MsoNormal"><i>#elif SANITIZER_LINUX && SANITIZER_WORDSIZE == 64<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u><u></u></i></p>
<p class="MsoNormal"><i> #ifdef MSAN_LINUX_X86_64_OLD_MAPPING<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p style="margin-left:18.0pt">
<u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u><b>lib/msan/msan_allocator.cc:<u></u><u></u></b></p>
<p class="MsoNormal"><i>diff --git a/lib/msan/msan_allocator.cc b/lib/msan/msan_allocator.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>index b7d3947..dae6d72 100644<u></u><u></u></i></p>
<p class="MsoNormal"><i>--- a/lib/msan/msan_allocator.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>+++ b/lib/msan/msan_allocator.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -49,7 +49,15 @@ struct MsanMapUnmapCallback {<u></u><u></u></i></p>
<p class="MsoNormal"><i>   typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE, sizeof(Metadata),<u></u><u></u></i></p>
<p class="MsoNormal"><i>                                SizeClassMap, kRegionSizeLog, ByteMap,<u></u><u></u></i></p>
<p class="MsoNormal"><i>                                MsanMapUnmapCallback> PrimaryAllocator;<u></u><u></u></i></p>
<p class="MsoNormal"><i>-<u></u><u></u></i></p>
<p class="MsoNormal"><i>+#elif defined (__i386__)<u></u><u></u></i></p>
<p class="MsoNormal"><i>+static const uptr kMaxAllowedMallocSize = 3UL << 30;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  static const uptr kRegionSizeLog = 20;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  typedef FlatByteMap<kNumRegions> ByteMap;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  typedef CompactSizeClassMap SizeClassMap;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE, sizeof(Metadata),<u></u><u></u></i></p>
<p class="MsoNormal"><i>+                               SizeClassMap, kRegionSizeLog, ByteMap,<u></u><u></u></i></p>
<p class="MsoNormal"><i>+                               MsanMapUnmapCallback> PrimaryAllocator;<u></u><u></u></i></p>
<p class="MsoNormal"><i>#elif defined(__x86_64__)<u></u><u></u></i></p>
<p class="MsoNormal"><i>#if SANITIZER_LINUX && !defined(MSAN_LINUX_X86_64_OLD_MAPPING)<u></u><u></u></i></p>
<p class="MsoNormal"><i>   static const uptr kAllocatorSpace = 0x700000000000ULL;<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p style="margin-left:18.0pt">
<u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u><b>lib/msan/msan_linux.cc:<u></u><u></u></b></p>
<p class="MsoNormal"><i>diff --git a/lib/msan/msan_linux.cc b/lib/msan/msan_linux.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>index d6a9588..ca59564 100644<u></u><u></u></i></p>
<p class="MsoNormal"><i>--- a/lib/msan/msan_linux.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>+++ b/lib/msan/msan_linux.cc<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -82,7 +82,7 @@ static void CheckMemoryLayoutSanity() {<u></u><u></u></i></p>
<p class="MsoNormal"><i>     CHECK_LT(start, end);<u></u><u></u></i></p>
<p class="MsoNormal"><i>     CHECK_EQ(prev_end, start);<u></u><u></u></i></p>
<p class="MsoNormal"><i>     CHECK(addr_is_type(start, type));<u></u><u></u></i></p>
<p class="MsoNormal"><i>-    CHECK(addr_is_type((start + end) / 2, type));<u></u><u></u></i></p>
<p class="MsoNormal"><i>+    CHECK(addr_is_type(start/2 + end/2, type));<u></u><u></u></i></p>
<p class="MsoNormal"><i>     CHECK(addr_is_type(end - 1, type));<u></u><u></u></i></p>
<p class="MsoNormal"><i>     if (type == MappingDesc::APP) {<u></u><u></u></i></p>
<p class="MsoNormal"><i>       uptr addr = start;<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -90,7 +90,7 @@ static void CheckMemoryLayoutSanity() {<u></u><u></u></i></p>
<p class="MsoNormal"><i>       CHECK(MEM_IS_ORIGIN(MEM_TO_ORIGIN(addr)));<u></u><u></u></i></p>
<p class="MsoNormal"><i>       CHECK_EQ(MEM_TO_ORIGIN(addr), SHADOW_TO_ORIGIN(MEM_TO_SHADOW(addr)));<u></u><u></u></i></p>
<p class="MsoNormal"><i><u></u><u></u></i></p>
<p class="MsoNormal"><i>-      addr = (start + end) / 2;<u></u><u></u></i></p>
<p class="MsoNormal"><i>+      addr = start/2 + end/2;<u></u><u></u></i></p>
<p class="MsoNormal"><i>       CHECK(MEM_IS_SHADOW(MEM_TO_SHADOW(addr)));<u></u><u></u></i></p>
<p class="MsoNormal"><i>       CHECK(MEM_IS_ORIGIN(MEM_TO_ORIGIN(addr)));<u></u><u></u></i></p>
<p class="MsoNormal"><i>       CHECK_EQ(MEM_TO_ORIGIN(addr), SHADOW_TO_ORIGIN(MEM_TO_SHADOW(addr)));<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p style="margin-left:18.0pt">
<u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u><b>lib/sanitizer_common/sanitizer_platform_interceptors.h:<u></u><u></u></b></p>
<p class="MsoNormal"><i>--- a/lib/sanitizer_common/sanitizer_platform_interceptors.h<u></u><u></u></i></p>
<p class="MsoNormal"><i>+++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h<u></u><u></u></i></p>
<p class="MsoNormal"><i>@@ -211,7 +211,7 @@<u></u><u></u></i></p>
<p class="MsoNormal"><i>   SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SANITIZER_INTERCEPT_ETHER_R SI_FREEBSD || SI_LINUX_NOT_ANDROID<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SANITIZER_INTERCEPT_SHMCTL \<u></u><u></u></i></p>
<p class="MsoNormal"><i>-  ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && SANITIZER_WORDSIZE == 64)<u></u><u></u></i></p>
<p class="MsoNormal"><i>+  ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && (SANITIZER_WORDSIZE == 64 || defined(__i386__)))<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_NOT_WINDOWS<u></u><u></u></i></p>
<p class="MsoNormal"><i>#define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \<u></u><u></u></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span lang="DE" style="font-size:10.0pt;font-family:"Arial",sans-serif">Stefan Pusl<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p><font style="font-size:9px">Intel Deutschland GmbH<br>
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany<br>
Tel: +49 89 99 8853-0, <a href="http://www.intel.de" target="_blank">www.intel.de</a><br>
Managing Directors: Christin Eisenschmid, Christian Lamprechter<br>
Chairperson of the Supervisory Board: Nicole Lau<br>
Registered Office: Munich<br>
Commercial Register: Amtsgericht Muenchen HRB 186928</font><br>
</p>
</div>

<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>