<div style="font-family: arial, helvetica, sans-serif"><font size="2"><br><br><div class="gmail_quote">On Mon, Jun 25, 2012 at 2:28 PM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@google.com" target="_blank">chandlerc@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote"><div><div class="h5">On Mon, Jun 25, 2012 at 3:18 AM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-family:arial,helvetica,sans-serif"><font size="2"><br><br><div class="gmail_quote"><div><div>
On Mon, Jun 25, 2012 at 2:15 PM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@google.com" target="_blank">chandlerc@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote"><div>On Mon, Jun 25, 2012 at 2:58 AM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kcc<br>
Date: Mon Jun 25 04:58:29 2012<br>
New Revision: 159132<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=159132&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=159132&view=rev</a><br>
Log:<br>
[asan] get rid of '#include <malloc.h>' in the implementation of malloc interceptors<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_malloc_linux.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_malloc_linux.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_malloc_linux.cc?rev=159132&r1=159131&r2=159132&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_malloc_linux.cc?rev=159132&r1=159131&r2=159132&view=diff</a><br>




==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_malloc_linux.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_malloc_linux.cc Mon Jun 25 04:58:29 2012<br>
@@ -20,15 +20,13 @@<br>
 #include "asan_internal.h"<br>
 #include "asan_stack.h"<br>
<br>
-#include <malloc.h><br>
-<br>
 #ifdef ANDROID<br>
 struct MallocDebug {<br>
-  void* (*malloc)(size_t bytes);<br>
+  void* (*malloc)(uptr bytes);<br></blockquote><div><br></div></div><div>This seems really wrong to me... There are definitely platforms where sizeof(size_t) != sizeof(void*)...</div></div></font></div></blockquote><div>


<br></div></div></div><div>There are such platforms indeed, but asan will be broken on such systems in all other possible ways, not just this. </div></div></font></div></blockquote><div><br></div></div></div><div>Why not define these according to the standard?</div>

<div><br></div><div>In particular, I don't understand an aversion to 'stddef.h' and 'size_t'. These don't come from the OS, they come from the standard and from the compiler. The 'stddef.h' that ships with Clang doesn't include any other headers. It cannot be simulated by your code because it leverages implementation-details to expose standard interfaces such as 'size_t'.</div>

<div><br></div><div>For example, 'stddef.h' can be included into code that is compiled with -ffreestanding, and thus without any system libraries or headers. It seems like that should be a sufficiently strict bar for portability for ASan?</div>
<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote"><div>Otoh, this change protects us from problems like this one, where malloc.h has some unexpected features.</div>

</div></font></div></blockquote><div><br></div></div><div>My comment here isn't about including 'malloc.h', but about using 'uptr' instead of 'size_t'.</div></div></font></div></blockquote><div>
<br></div><div>It is indeed very pitty that we can not use the standard size_t. I'd love to be able to. </div><div>This has something to do with Windows. </div><div>We can not build asan run-time with clang on Windows (at least yet), so we have to build it with MSVC. </div>
<div>There, stddef.h is not nice at all. (Frankly, I don't remember exactly, but I think it just doesn't define size_t at all).</div><div><br></div><div>--kcc </div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote"><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote">
<div><br></div><div>--kcc </div><div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-family:arial,helvetica,sans-serif"><font size="2"><div class="gmail_quote">


<div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

   void  (*free)(void* mem);<br>
-  void* (*calloc)(size_t n_elements, size_t elem_size);<br>
-  void* (*realloc)(void* oldMem, size_t bytes);<br>
-  void* (*memalign)(size_t alignment, size_t bytes);<br>
+  void* (*calloc)(uptr n_elements, uptr elem_size);<br>
+  void* (*realloc)(void* oldMem, uptr bytes);<br>
+  void* (*memalign)(uptr alignment, uptr bytes);<br>
 };<br>
<br>
 const MallocDebug asan_malloc_dispatch ALIGNED(32) = {<br>
@@ -64,18 +62,18 @@<br>
   asan_free(ptr, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, malloc, size_t size) {<br>
+INTERCEPTOR(void*, malloc, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_malloc(size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, calloc, size_t nmemb, size_t size) {<br>
+INTERCEPTOR(void*, calloc, uptr nmemb, uptr size) {<br>
   if (!asan_inited) {<br>
     // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym.<br>
-    const size_t kCallocPoolSize = 1024;<br>
+    const uptr kCallocPoolSize = 1024;<br>
     static uptr calloc_memory_for_dlsym[kCallocPoolSize];<br>
-    static size_t allocated;<br>
-    size_t size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize;<br>
+    static uptr allocated;<br>
+    uptr size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize;<br>
     void *mem = (void*)&calloc_memory_for_dlsym[allocated];<br>
     allocated += size_in_words;<br>
     CHECK(allocated < kCallocPoolSize);<br>
@@ -85,26 +83,34 @@<br>
   return asan_calloc(nmemb, size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, realloc, void *ptr, size_t size) {<br>
+INTERCEPTOR(void*, realloc, void *ptr, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_realloc(ptr, size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, memalign, size_t boundary, size_t size) {<br>
+INTERCEPTOR(void*, memalign, uptr boundary, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_memalign(boundary, size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, __libc_memalign, size_t align, size_t s)<br>
+INTERCEPTOR(void*, __libc_memalign, uptr align, uptr s)<br>
   ALIAS("memalign");<br>
<br>
-INTERCEPTOR(size_t, malloc_usable_size, void *ptr) {<br>
+INTERCEPTOR(uptr, malloc_usable_size, void *ptr) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_malloc_usable_size(ptr, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(struct mallinfo, mallinfo, void) {<br>
-  struct mallinfo res;<br>
+// We avoid including malloc.h for portability reasons.<br>
+// man mallinfo says the fields are "long", but the implementation uses int.<br>
+// It doesn't matter much -- we just need to make sure that the libc's mallinfo<br>
+// is not called.<br>
+struct fake_mallinfo {<br>
+  int x[10];<br>
+};<br>
+<br>
+INTERCEPTOR(struct fake_mallinfo, mallinfo, void) {<br>
+  struct fake_mallinfo res;<br>
   REAL(memset)(&res, 0, sizeof(res));<br>
   return res;<br>
 }<br>
@@ -113,18 +119,18 @@<br>
   return -1;<br>
 }<br>
<br>
-INTERCEPTOR(int, posix_memalign, void **memptr, size_t alignment, size_t size) {<br>
+INTERCEPTOR(int, posix_memalign, void **memptr, uptr alignment, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   // Printf("posix_memalign: %zx %zu\n", alignment, size);<br>
   return asan_posix_memalign(memptr, alignment, size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, valloc, size_t size) {<br>
+INTERCEPTOR(void*, valloc, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_valloc(size, &stack);<br>
 }<br>
<br>
-INTERCEPTOR(void*, pvalloc, size_t size) {<br>
+INTERCEPTOR(void*, pvalloc, uptr size) {<br>
   GET_STACK_TRACE_HERE_FOR_MALLOC;<br>
   return asan_pvalloc(size, &stack);<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></font></div>
</blockquote></div></div></div><br></font></div>
</blockquote></div></div></div><br></font></div>
</blockquote></div><br></font></div>