<div dir="ltr">The strcat test is failing on the Windows bot:  <a href="http://lab.llvm.org:8011/builders/sanitizer-windows/builds/25338/steps/run%20check-asan/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-windows/builds/25338/steps/run%20check-asan/logs/stdio</a><div><pre style="font-family:"Courier New",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial"><span class="gmail-stdout" style="font-family:"Courier New",courier,monotype,monospace;color:black">strcat-overlap.cc:40:3: warning: 'strcat' is deprecated: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations]</span></pre>Please take a look.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 8, 2018 at 1:50 PM, Dan Liew via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@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">Author: delcypher<br>
Date: Thu Mar  8 13:50:22 2018<br>
New Revision: 327068<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=327068&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=327068&view=rev</a><br>
Log:<br>
[asan] Fix bug where suppression of overlapping accesses was ignored on<br>
`strcpy()`, `strncpy()`, `strcat()`, and `strncat()`.<br>
<br>
rdar://problem/35576899<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D43702" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D43702</a><br>
<br>
Added:<br>
    compiler-rt/trunk/test/asan/<wbr>TestCases/strcat-overlap.cc<br>
    compiler-rt/trunk/test/asan/<wbr>TestCases/strcpy-overlap.cc<br>
    compiler-rt/trunk/test/asan/<wbr>TestCases/strncat-overlap.cc<br>
    compiler-rt/trunk/test/asan/<wbr>TestCases/strncpy-overlap.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/<wbr>asan_interceptors_<wbr>memintrinsics.h<br>
<br>
Modified: compiler-rt/trunk/lib/asan/<wbr>asan_interceptors_<wbr>memintrinsics.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors_memintrinsics.h?rev=327068&r1=327067&r2=327068&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>asan/asan_interceptors_<wbr>memintrinsics.h?rev=327068&r1=<wbr>327067&r2=327068&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/asan/<wbr>asan_interceptors_<wbr>memintrinsics.h (original)<br>
+++ compiler-rt/trunk/lib/asan/<wbr>asan_interceptors_<wbr>memintrinsics.h Thu Mar  8 13:50:22 2018<br>
@@ -133,15 +133,22 @@ static inline bool RangesOverlap(const c<br>
                                  const char *offset2, uptr length2) {<br>
   return !((offset1 + length1 <= offset2) || (offset2 + length2 <= offset1));<br>
 }<br>
-#define CHECK_RANGES_OVERLAP(name, _offset1, length1, _offset2, length2) do { \<br>
-  const char *offset1 = (const char*)_offset1; \<br>
-  const char *offset2 = (const char*)_offset2; \<br>
-  if (RangesOverlap(offset1, length1, offset2, length2)) { \<br>
-    GET_STACK_TRACE_FATAL_HERE; \<br>
-    ReportStringFunctionMemoryRang<wbr>esOverlap(name, offset1, length1, \<br>
-                                            offset2, length2, &stack); \<br>
-  } \<br>
-} while (0)<br>
+#define CHECK_RANGES_OVERLAP(name, _offset1, length1, _offset2, length2)   \<br>
+  do {                                                                     \<br>
+    const char *offset1 = (const char *)_offset1;                          \<br>
+    const char *offset2 = (const char *)_offset2;                          \<br>
+    if (RangesOverlap(offset1, length1, offset2, length2)) {               \<br>
+      GET_STACK_TRACE_FATAL_HERE;                                          \<br>
+      bool suppressed = IsInterceptorSuppressed(name);                     \<br>
+      if (!suppressed && HaveStackTraceBasedSuppression<wbr>s()) {              \<br>
+        suppressed = IsStackTraceSuppressed(&stack)<wbr>;                       \<br>
+      }                                                                    \<br>
+      if (!suppressed) {                                                   \<br>
+        ReportStringFunctionMemoryRang<wbr>esOverlap(name, offset1, length1,    \<br>
+                                                offset2, length2, &stack); \<br>
+      }                                                                    \<br>
+    }                                                                      \<br>
+  } while (0)<br>
<br>
 }  // namespace __asan<br>
<br>
<br>
Added: compiler-rt/trunk/test/asan/<wbr>TestCases/strcat-overlap.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/strcat-overlap.cc?rev=327068&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/TestCases/strcat-<wbr>overlap.cc?rev=327068&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>TestCases/strcat-overlap.cc (added)<br>
+++ compiler-rt/trunk/test/asan/<wbr>TestCases/strcat-overlap.cc Thu Mar  8 13:50:22 2018<br>
@@ -0,0 +1,46 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O1 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O2 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O3 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+<br>
+#include <string.h><br>
+<br>
+<br>
+// Don't inline function otherwise stacktrace changes.<br>
+__attribute__((noinline)) void bad_function() {<br>
+  char buffer[] = "hello\0XXX";<br>
+  // CHECK: strcat-param-overlap: memory ranges<br>
+  // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap<br>
+  // CHECK: {{#0 0x.* in .*strcat}}<br>
+  // CHECK: {{#1 0x.* in bad_function.*strcat-overlap.<wbr>cc:}}[[@LINE+2]]<br>
+  // CHECK: {{#2 0x.* in main .*strcat-overlap.cc:}}[[@LINE+<wbr>5]]<br>
+  strcat(buffer, buffer + 1); // BOOM<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+  bad_function();<br>
+  return 0;<br>
+}<br>
<br>
Added: compiler-rt/trunk/test/asan/<wbr>TestCases/strcpy-overlap.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/strcpy-overlap.cc?rev=327068&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/TestCases/strcpy-<wbr>overlap.cc?rev=327068&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>TestCases/strcpy-overlap.cc (added)<br>
+++ compiler-rt/trunk/test/asan/<wbr>TestCases/strcpy-overlap.cc Thu Mar  8 13:50:22 2018<br>
@@ -0,0 +1,46 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O1 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O2 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O3 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strcpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+<br>
+#include <string.h><br>
+<br>
+<br>
+// Don't inline function otherwise stacktrace changes.<br>
+__attribute__((noinline)) void bad_function() {<br>
+  char buffer[] = "hello";<br>
+  // CHECK: strcpy-param-overlap: memory ranges<br>
+  // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap<br>
+  // CHECK: {{#0 0x.* in .*strcpy}}<br>
+  // CHECK: {{#1 0x.* in bad_function.*strcpy-overlap.<wbr>cc:}}[[@LINE+2]]<br>
+  // CHECK: {{#2 0x.* in main .*strcpy-overlap.cc:}}[[@LINE+<wbr>5]]<br>
+  strcpy(buffer, buffer + 1); // BOOM<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+  bad_function();<br>
+  return 0;<br>
+}<br>
<br>
Added: compiler-rt/trunk/test/asan/<wbr>TestCases/strncat-overlap.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/strncat-overlap.cc?rev=327068&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/TestCases/strncat-<wbr>overlap.cc?rev=327068&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>TestCases/strncat-overlap.cc (added)<br>
+++ compiler-rt/trunk/test/asan/<wbr>TestCases/strncat-overlap.cc Thu Mar  8 13:50:22 2018<br>
@@ -0,0 +1,46 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O1 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O2 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O3 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncat" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+<br>
+#include <string.h><br>
+<br>
+<br>
+// Don't inline function otherwise stacktrace changes.<br>
+__attribute__((noinline)) void bad_function() {<br>
+  char buffer[] = "hello\0XXX";<br>
+  // CHECK: strncat-param-overlap: memory ranges<br>
+  // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap<br>
+  // CHECK: {{#0 0x.* in .*strncat}}<br>
+  // CHECK: {{#1 0x.* in bad_function.*strncat-overlap.<wbr>cc:}}[[@LINE+2]]<br>
+  // CHECK: {{#2 0x.* in main .*strncat-overlap.cc:}}[[@<wbr>LINE+5]]<br>
+  strncat(buffer, buffer + 1, 3); // BOOM<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+  bad_function();<br>
+  return 0;<br>
+}<br>
<br>
Added: compiler-rt/trunk/test/asan/<wbr>TestCases/strncpy-overlap.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/strncpy-overlap.cc?rev=327068&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/asan/TestCases/strncpy-<wbr>overlap.cc?rev=327068&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/asan/<wbr>TestCases/strncpy-overlap.cc (added)<br>
+++ compiler-rt/trunk/test/asan/<wbr>TestCases/strncpy-overlap.cc Thu Mar  8 13:50:22 2018<br>
@@ -0,0 +1,46 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O1 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O2 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+//<br>
+// RUN: %clangxx_asan -O3 %s -o %t<br>
+// RUN: not %run %t 2>&1 | FileCheck %s<br>
+// RUN: echo "interceptor_via_fun:bad_<wbr>function" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+// RUN: echo "interceptor_name:strncpy" > %t.supp<br>
+// RUN: %env_asan_opts=suppressions='"<wbr>%t.supp"' %run %t<br>
+<br>
+#include <string.h><br>
+<br>
+<br>
+// Don't inline function otherwise stacktrace changes.<br>
+__attribute__((noinline)) void bad_function() {<br>
+  char buffer[] = "hello";<br>
+  // CHECK: strncpy-param-overlap: memory ranges<br>
+  // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap<br>
+  // CHECK: {{#0 0x.* in .*strncpy}}<br>
+  // CHECK: {{#1 0x.* in bad_function.*strncpy-overlap.<wbr>cc:}}[[@LINE+2]]<br>
+  // CHECK: {{#2 0x.* in main .*strncpy-overlap.cc:}}[[@<wbr>LINE+5]]<br>
+  strncpy(buffer, buffer + 1, 5); // BOOM<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+  bad_function();<br>
+  return 0;<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>