<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 29, 2015 at 7:32 PM, 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: Wed Jul 29 21:32:51 2015<br>
New Revision: 243610<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243610-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=SfvQiteMmTFh8rMCSv-UZTEpJaA9D6NydiCS-iAKxPk&s=bDSz6u_cnZnzgTFYflqkAFH2E7x25yYSZzTVTo2GM4Q&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243610&view=rev</a><br>
Log:<br>
[sanitizer] add a weak hook for strncmp interceptor, both to dfsan and other sanitizers. Hide the declaration and the calls in better macros<br>
<br>
Modified:<br>
    compiler-rt/trunk/include/sanitizer/common_interface_defs.h<br>
    compiler-rt/trunk/include/sanitizer/dfsan_interface.h<br>
    compiler-rt/trunk/lib/dfsan/dfsan_custom.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
<br>
Modified: compiler-rt/trunk/include/sanitizer/common_interface_defs.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_include_sanitizer_common-5Finterface-5Fdefs.h-3Frev-3D243610-26r1-3D243609-26r2-3D243610-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=SfvQiteMmTFh8rMCSv-UZTEpJaA9D6NydiCS-iAKxPk&s=oxIhTRdjCE1RBYrm1ow1zxuFUCPQ1sd_B1nPEr3oYM0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/common_interface_defs.h?rev=243610&r1=243609&r2=243610&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/include/sanitizer/common_interface_defs.h (original)<br>
+++ compiler-rt/trunk/include/sanitizer/common_interface_defs.h Wed Jul 29 21:32:51 2015<br>
@@ -120,6 +120,8 @@ extern "C" {<br>
   // FIXME: implement more hooks.<br>
   void __sanitizer_weak_hook_memcmp(void *called_pc, const void *s1,<br>
                                     const void *s2, size_t n);<br>
+  void __sanitizer_weak_hook_strncmp(void *called_pc, const char *s1,<br>
+                                    const char *s2, size_t n);<br>
 #ifdef __cplusplus<br>
 }  // extern "C"<br>
 #endif<br>
<br>
Modified: compiler-rt/trunk/include/sanitizer/dfsan_interface.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_include_sanitizer_dfsan-5Finterface.h-3Frev-3D243610-26r1-3D243609-26r2-3D243610-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=SfvQiteMmTFh8rMCSv-UZTEpJaA9D6NydiCS-iAKxPk&s=51Frile9E5PsU-An0zwlzRQfwbjyzXoQExqDVFrOMGs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/dfsan_interface.h?rev=243610&r1=243609&r2=243610&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/include/sanitizer/dfsan_interface.h (original)<br>
+++ compiler-rt/trunk/include/sanitizer/dfsan_interface.h Wed Jul 29 21:32:51 2015<br>
@@ -91,16 +91,18 @@ void dfsan_set_write_callback(dfsan_writ<br>
 /// <label> <parent label 1> <parent label 2> <label description if any><br>
 void dfsan_dump_labels(int fd);<br>
<br>
+/// Interceptor hooks.<br>
 /// Whenever a dfsan's custom function is called the corresponding<br>
 /// hook is called it non-zero. The hooks should be defined by the user.<br>
 /// The primary use case is taint-guided fuzzing, where the fuzzer<br>
 /// needs to see the parameters of the function and the labels.<br>
 /// FIXME: implement more hooks.<br>
-<br>
-/// memcmp hook.<br>
 void dfsan_weak_hook_memcmp(void *caller_pc, const void *s1, const void *s2,<br>
                             size_t n, dfsan_label s1_label,<br>
                             dfsan_label s2_label, dfsan_label n_label);<br>
+void dfsan_weak_hook_strncmp(void *caller_pc, const char *s1, const char *s2,<br>
+                             size_t n, dfsan_label s1_label,<br>
+                             dfsan_label s2_label, dfsan_label n_label);<br>
 #ifdef __cplusplus<br>
 }  // extern "C"<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/dfsan/dfsan_custom.cc<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_lib_dfsan_dfsan-5Fcustom.cc-3Frev-3D243610-26r1-3D243609-26r2-3D243610-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=SfvQiteMmTFh8rMCSv-UZTEpJaA9D6NydiCS-iAKxPk&s=6tN1l6bvF6JEKpvuMrkwEWeKFxinXddj3ys-fHg0p7g&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan_custom.cc?rev=243610&r1=243609&r2=243610&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/dfsan/dfsan_custom.cc (original)<br>
+++ compiler-rt/trunk/lib/dfsan/dfsan_custom.cc Wed Jul 29 21:32:51 2015<br>
@@ -43,6 +43,14 @@<br>
<br>
 using namespace __dfsan;<br>
<br>
+#define CALL_WEAK_INTERCEPTOR_HOOK(f, ...)                                     \<br>
+  do {                                                                         \<br>
+    if (f)                                                                     \<br>
+      f(__VA_ARGS__);                                                          \<br>
+  } while (false)<br>
+#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...) \<br>
+SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void f(__VA_ARGS__);<br>
+<br>
 extern "C" {<br>
 SANITIZER_INTERFACE_ATTRIBUTE int<br>
 __dfsw_stat(const char *path, struct stat *buf, dfsan_label path_label,<br>
@@ -82,20 +90,18 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__df<br>
   }<br>
 }<br>
<br>
-SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE<br>
-void<br>
-dfsan_weak_hook_memcmp(uptr caller_pc, const void *s1, const void *s2, size_t n,<br>
-                       dfsan_label s1_label, dfsan_label s2_label,<br>
-                       dfsan_label n_label);<br>
+DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, uptr caller_pc,<br>
+                              const void *s1, const void *s2, size_t n,<br>
+                              dfsan_label s1_label, dfsan_label s2_label,<br>
+                              dfsan_label n_label);<br>
<br>
 SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_memcmp(const void *s1, const void *s2,<br>
                                                 size_t n, dfsan_label s1_label,<br>
                                                 dfsan_label s2_label,<br>
                                                 dfsan_label n_label,<br>
                                                 dfsan_label *ret_label) {<br>
-  if (dfsan_weak_hook_memcmp)<br>
-    dfsan_weak_hook_memcmp(GET_CALLER_PC(), s1, s2, n, s1_label, s2_label,<br>
-                           n_label);<br>
+  CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, GET_CALLER_PC(), s1, s2, n,<br>
+                             s1_label, s2_label, n_label);<br>
   const char *cs1 = (const char *) s1, *cs2 = (const char *) s2;<br>
   for (size_t i = 0; i != n; ++i) {<br>
     if (cs1[i] != cs2[i]) {<br>
@@ -153,6 +159,11 @@ __dfsw_strcasecmp(const char *s1, const<br>
   return 0;<br>
 }<br>
<br>
+DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, uptr caller_pc,<br>
+                              const char *s1, const char *s2, size_t n,<br>
+                              dfsan_label s1_label, dfsan_label s2_label,<br>
+                              dfsan_label n_label);<br>
+<br>
 SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncmp(const char *s1, const char *s2,<br>
                                                  size_t n, dfsan_label s1_label,<br>
                                                  dfsan_label s2_label,<br>
@@ -163,6 +174,9 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw<br>
     return 0;<br>
   }<br>
<br>
+  CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, GET_CALLER_PC(), s1, s2,<br>
+                             n, s1_label, s2_label, n_label);<br>
+<br>
   for (size_t i = 0;; ++i) {<br>
     if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 || i == n - 1) {<br>
       if (flags().strict_data_dependencies) {<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_lib_sanitizer-5Fcommon_sanitizer-5Fcommon-5Finterceptors.inc-3Frev-3D243610-26r1-3D243609-26r2-3D243610-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=SfvQiteMmTFh8rMCSv-UZTEpJaA9D6NydiCS-iAKxPk&s=dP_CfHxye8-9bNmt1qfkA73zDyjwukVPSLLKx3SmgBU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=243610&r1=243609&r2=243610&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Wed Jul 29 21:32:51 2015<br>
@@ -40,13 +40,19 @@<br>
 #include <stdarg.h><br>
<br>
 #if SANITIZER_INTERCEPTOR_HOOKS<br>
-#define CALL_WEAK_INTERCEPTOR_HOOK4(f, ...)                                    \<br>
+#define CALL_WEAK_INTERCEPTOR_HOOK(f, ...)                                     \<br>
   do {                                                                         \<br>
     if (f)                                                                     \<br>
       f(__VA_ARGS__);                                                          \<br>
   } while (false);<br>
+#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...)                                  \<br>
+  extern "C" {                                                                 \<br>
+  SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void f(__VA_ARGS__);  \<br>
+  } // extern "C"<br>
 #else<br>
-#define CALL_WEAK_INTERCEPTOR_HOOK4(f, a1, a2, a3, a4)<br>
+#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...)<br>
+#define CALL_WEAK_INTERCEPTOR_HOOK(f, a1, a2, a3, a4)<br>
+<br>
 #endif  // SANITIZER_INTERCEPTOR_HOOKS<br>
<br>
 #if SANITIZER_WINDOWS && !defined(va_copy)<br>
@@ -213,11 +219,16 @@ INTERCEPTOR(int, strcmp, const char *s1,<br>
   return CharCmpX(c1, c2);<br>
 }<br>
<br>
+DECLARE_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_strncmp, uptr called_pc,<br>
+                              const char *s1, const char *s2, uptr n);<br></blockquote><div><br></div><div>^^</div><div>You don't need a semicolon after DECLARE_WEAK_INTERCEPTOR_HOOK (here and in another places)</div><div>(found by -Wpedantic).</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
 INTERCEPTOR(int, strncmp, const char *s1, const char *s2, uptr size) {<br>
   if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)<br>
     return internal_strncmp(s1, s2, size);<br>
   void *ctx;<br>
   COMMON_INTERCEPTOR_ENTER(ctx, strncmp, s1, s2, size);<br>
+  CALL_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_strncmp, GET_CALLER_PC(), s1,<br>
+                             s2, size);<br>
   unsigned char c1 = 0, c2 = 0;<br>
   uptr i;<br>
   for (i = 0; i < size; i++) {<br>
@@ -374,19 +385,16 @@ INTERCEPTOR(char *, strpbrk, const char<br>
<br>
 #if SANITIZER_INTERCEPT_MEMCMP<br>
<br>
-extern "C" {<br>
-SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE<br>
-void __sanitizer_weak_hook_memcmp(uptr called_pc, const void *s1,<br>
-                                  const void *s2, uptr n);<br>
-}  // extern "C"<br>
+DECLARE_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_memcmp, uptr called_pc,<br>
+                              const void *s1, const void *s2, uptr n);<br>
<br>
 INTERCEPTOR(int, memcmp, const void *a1, const void *a2, uptr size) {<br>
   void *ctx;<br>
   COMMON_INTERCEPTOR_ENTER(ctx, memcmp, a1, a2, size);<br>
   if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)<br>
     return internal_memcmp(a1, a2, size);<br>
-  CALL_WEAK_INTERCEPTOR_HOOK4(__sanitizer_weak_hook_memcmp, GET_CALLER_PC(), a1,<br>
-                              a2, size);<br>
+  CALL_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_memcmp, GET_CALLER_PC(), a1,<br>
+                             a2, size);<br>
   if (common_flags()->intercept_memcmp) {<br>
     if (common_flags()->strict_memcmp) {<br>
       // Check the entire regions even if the first bytes of the buffers are<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</div></div>