<div dir="ltr">Thanks,<div>Maybe r300939 would fix.<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Apr 20, 2017 at 6:20 PM Ahmed Bougacha <<a href="mailto:ahmed.bougacha@gmail.com">ahmed.bougacha@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hey Vitaly,<br>
<br>
I saw your fixes in r300906 and r300935, but this fails differently<br>
for me on Darwin:<br>
<br>
<br>
ASAN:DEADLYSIGNAL<br>
=================================================================<br>
==52312==ERROR: AddressSanitizer: BUS on unknown address<br>
0x00010affd000 (pc 0x7fff999a7168 bp 0x7fff57e31270 sp 0x7fff57e31270<br>
T0)<br>
    #0 0x7fff999a7167 in strlen (libsystem_c.dylib:x86_64+0x1167)<br>
    #1 0x107dee5bb in wrap_strchr sanitizer_common_interceptors.inc:578<br>
    #2 0x107dceaa5 in main strchr.c:29<br>
    #3 0x7fff970345ac in start (libdyld.dylib:x86_64+0x35ac)<br>
<br>
==52312==Register values:<br>
....<br>
AddressSanitizer can not provide additional info.<br>
SUMMARY: AddressSanitizer: BUS (libsystem_c.dylib:x86_64+0x1167) in strlen<br>
==52312==ABORTING<br>
<br>
<br>
Does that ring a bell?<br>
<br>
Thanks!<br>
-Ahmed<br>
<br>
<br>
On Thu, Apr 20, 2017 at 1:59 PM, Vitaly Buka via llvm-commits<br>
<<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: vitalybuka<br>
> Date: Thu Apr 20 15:59:37 2017<br>
> New Revision: 300889<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=300889&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=300889&view=rev</a><br>
> Log:<br>
> [asan] Optimize strchr for strict_string_checks=false<br>
><br>
> Summary:<br>
> strchr interceptor does not need to call strlen if strict_string_checks is not<br>
> enabled. Unnecessary strlen calls affect python parser performance.<br>
><br>
> Reviewers: eugenis, kcc<br>
><br>
> Subscribers: llvm-commits, kubamracek<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D32264" rel="noreferrer" target="_blank">https://reviews.llvm.org/D32264</a><br>
><br>
> Added:<br>
>     compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c<br>
> Modified:<br>
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
><br>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=300889&r1=300888&r2=300889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=300889&r1=300888&r2=300889&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 Thu Apr 20 15:59:37 2017<br>
> @@ -139,12 +139,9 @@ bool PlatformHasDifferentMemcpyAndMemmov<br>
>  #define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (0)<br>
>  #endif<br>
><br>
> -#define COMMON_INTERCEPTOR_READ_STRING_OF_LEN(ctx, s, len, n)       \<br>
> -    COMMON_INTERCEPTOR_READ_RANGE((ctx), (s),                       \<br>
> -      common_flags()->strict_string_checks ? (len) + 1 : (n) )<br>
> -<br>
>  #define COMMON_INTERCEPTOR_READ_STRING(ctx, s, n)                   \<br>
> -    COMMON_INTERCEPTOR_READ_STRING_OF_LEN((ctx), (s), REAL(strlen)(s), (n))<br>
> +    COMMON_INTERCEPTOR_READ_RANGE((ctx), (s),                       \<br>
> +      common_flags()->strict_string_checks ? (REAL(strlen)(s)) + 1 : (n) )<br>
><br>
>  #ifndef COMMON_INTERCEPTOR_ON_DLOPEN<br>
>  #define COMMON_INTERCEPTOR_ON_DLOPEN(filename, flag) \<br>
> @@ -450,8 +447,7 @@ static inline void StrstrCheck(void *ctx<br>
>                                 const char *s2) {<br>
>      uptr len1 = REAL(strlen)(s1);<br>
>      uptr len2 = REAL(strlen)(s2);<br>
> -    COMMON_INTERCEPTOR_READ_STRING_OF_LEN(ctx, s1, len1,<br>
> -                                          r ? r - s1 + len2 : len1 + 1);<br>
> +    COMMON_INTERCEPTOR_READ_STRING(ctx, s1, r ? r - s1 + len2 : len1 + 1);<br>
>      COMMON_INTERCEPTOR_READ_RANGE(ctx, s2, len2 + 1);<br>
>  }<br>
>  #endif<br>
> @@ -577,10 +573,11 @@ INTERCEPTOR(char*, strchr, const char *s<br>
>      return internal_strchr(s, c);<br>
>    COMMON_INTERCEPTOR_ENTER(ctx, strchr, s, c);<br>
>    char *result = REAL(strchr)(s, c);<br>
> -  uptr len = internal_strlen(s);<br>
> -  uptr n = result ? result - s + 1 : len + 1;<br>
> -  if (common_flags()->intercept_strchr)<br>
> -    COMMON_INTERCEPTOR_READ_STRING_OF_LEN(ctx, s, len, n);<br>
> +  if (common_flags()->intercept_strchr) {<br>
> +    // Keep strlen as macro argument, as macro may ignore it.<br>
> +    COMMON_INTERCEPTOR_READ_STRING(ctx, s,<br>
> +      (result ? result - s : REAL(strlen)(s)) + 1);<br>
> +  }<br>
>    return result;<br>
>  }<br>
>  #define INIT_STRCHR COMMON_INTERCEPT_FUNCTION(strchr)<br>
> @@ -609,9 +606,8 @@ INTERCEPTOR(char*, strrchr, const char *<br>
>    if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)<br>
>      return internal_strrchr(s, c);<br>
>    COMMON_INTERCEPTOR_ENTER(ctx, strrchr, s, c);<br>
> -  uptr len = internal_strlen(s);<br>
>    if (common_flags()->intercept_strchr)<br>
> -    COMMON_INTERCEPTOR_READ_STRING_OF_LEN(ctx, s, len, len + 1);<br>
> +    COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1);<br>
>    return REAL(strrchr)(s, c);<br>
>  }<br>
>  #define INIT_STRRCHR COMMON_INTERCEPT_FUNCTION(strrchr)<br>
><br>
> Added: compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c?rev=300889&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c?rev=300889&view=auto</a><br>
> ==============================================================================<br>
> --- compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c (added)<br>
> +++ compiler-rt/trunk/test/asan/TestCases/Posix/strchr.c Thu Apr 20 15:59:37 2017<br>
> @@ -0,0 +1,36 @@<br>
> +// Test strchr for strict_string_checks=false does not look beyond necessary<br>
> +// char.<br>
> +// RUN: %clang_asan %s -o %t<br>
> +// RUN: %env_asan_opts=strict_string_checks=false %run %t 2>&1<br>
> +// RUN: %env_asan_opts=strict_string_checks=true not %run %t 2>&1 | FileCheck %s<br>
> +<br>
> +#include <assert.h><br>
> +#include <stdint.h><br>
> +#include <stdlib.h><br>
> +#include <string.h><br>
> +#include <sys/mman.h><br>
> +#include <unistd.h><br>
> +<br>
> +int main(int argc, char **argv) {<br>
> +  size_t page_size = sysconf(_SC_PAGE_SIZE);<br>
> +  size_t size = 2 * page_size;<br>
> +  char *s = (char *)mmap(0, size, PROT_READ | PROT_WRITE,<br>
> +                         MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);<br>
> +  assert(s);<br>
> +  assert(((uintptr_t)s & (page_size - 1)) == 0);<br>
> +  memset(s, 'o', size);<br>
> +  s[size - 1] = 0;<br>
> +<br>
> +  char *p = s + page_size - 1;<br>
> +  *p = 'x';<br>
> +<br>
> +  if (mprotect(p + 1, 1, PROT_NONE))<br>
> +    return 1;<br>
> +  char *r = strchr(s, 'x');<br>
> +  // CHECK: AddressSanitizer: SEGV on unknown address<br>
> +  // CHECK: The signal is caused by a READ memory access<br>
> +  // CHECK: strchr.c:[[@LINE-3]]<br>
> +  assert(r == p);<br>
> +<br>
> +  return 0;<br>
> +}<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>