[compiler-rt] r349730 - [HWASAN] Add support for memory intrinsics

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 20 13:30:52 PST 2018


http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/18276

On Thu, Dec 20, 2018 at 1:30 PM Vitaly Buka <vitalybuka at google.com> wrote:

> script is fixed and bot is green after clean rebuild
>
> On Thu, Dec 20, 2018 at 11:21 AM Vitaly Buka <vitalybuka at google.com>
> wrote:
>
>> I'll check buildbot script.
>>
>>
>>
>> On Thu, Dec 20, 2018 at 11:13 AM Evgenii Stepanov <eugenis at google.com>
>> wrote:
>>
>>> How interesting, this bot failed to rebuild clang (for an unclear
>>> reason) and then failed to report it:
>>>
>>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/18269/steps/bootstrap%20clang/logs/stdio
>>>
>>> On Thu, Dec 20, 2018 at 10:58 AM Kostya Serebryany <kcc at google.com>
>>> wrote:
>>> >
>>> > The bot is failing, please fix or revert.
>>> > Or will it fix itself once the compiler change is committed?
>>> >
>>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/18269/steps/run%20lit%20tests%20%5Baarch64%2Fbullhead-user%2FOPM6.171019.030.B1%5D/logs/stdio
>>> >
>>> > FAIL: HWAddressSanitizer-aarch64 :: TestCases/mem-intrinsics.c (444 of
>>> 1381)
>>> > ******************** TEST 'HWAddressSanitizer-aarch64 ::
>>> TestCases/mem-intrinsics.c' FAILED ********************
>>> > Script:
>>> > --
>>> > : 'RUN: at line 1';
>>>  /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/sanitizer_common/android_commands/android_compile.py
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/bin/clang
>>> -fsanitize=hwaddress -mllvm -hwasan-generate-tags-with-calls
>>> --target=aarch64-linux-android
>>> --sysroot=/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64/sysroot
>>> -B/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64
>>> -pie -fuse-ld=gold -Wl,--enable-new-dtags  -gline-tables-only
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> -DTEST_NO=1 -mllvm -hwasan-instrument-mem-intrinsics -o
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> && not
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> 2>&1 | FileCheck
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> --check-prefix=WRITE
>>> > : 'RUN: at line 2';
>>>  /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/sanitizer_common/android_commands/android_compile.py
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/bin/clang
>>> -fsanitize=hwaddress -mllvm -hwasan-generate-tags-with-calls
>>> --target=aarch64-linux-android
>>> --sysroot=/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64/sysroot
>>> -B/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64
>>> -pie -fuse-ld=gold -Wl,--enable-new-dtags  -gline-tables-only
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> -DTEST_NO=2 -mllvm -hwasan-instrument-mem-intrinsics -o
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> && not
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> 2>&1 | FileCheck
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> --check-prefix=READ
>>> > : 'RUN: at line 3';
>>>  /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/sanitizer_common/android_commands/android_compile.py
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/bin/clang
>>> -fsanitize=hwaddress -mllvm -hwasan-generate-tags-with-calls
>>> --target=aarch64-linux-android
>>> --sysroot=/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64/sysroot
>>> -B/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64
>>> -pie -fuse-ld=gold -Wl,--enable-new-dtags  -gline-tables-only
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> -DTEST_NO=3 -mllvm -hwasan-instrument-mem-intrinsics -o
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> && not
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> 2>&1 | FileCheck
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> --check-prefix=WRITE
>>> > : 'RUN: at line 4';
>>>  /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/sanitizer_common/android_commands/android_compile.py
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm_build64/bin/clang
>>> -fsanitize=hwaddress -mllvm -hwasan-generate-tags-with-calls
>>> --target=aarch64-linux-android
>>> --sysroot=/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64/sysroot
>>> -B/var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/android_ndk/standalone-aarch64
>>> -pie -fuse-ld=gold -Wl,--enable-new-dtags  -gline-tables-only
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> -DTEST_NO=2 -mllvm -hwasan-instrument-mem-intrinsics -o
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> && not env
>>> HWASAN_OPTIONS=disable_allocator_tagging=1:random_tags=0:abort_on_error=0:halt_on_error=0
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/compiler_rt_build_android_aarch64/test/hwasan/AARCH64/TestCases/Output/mem-intrinsics.c.tmp
>>> 2>&1 | FileCheck
>>> /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux-android/build/llvm/projects/compiler-rt/test/hwasan/TestCases/mem-intrinsics.c
>>> --check-prefix=RECOVER
>>> > --
>>> > Exit Code: 1
>>> >
>>> > Command Output (stderr):
>>> > --
>>> > clang (LLVM option parsing): Unknown command line argument
>>> '-hwasan-instrument-mem-intrinsics'.  Try: 'clang (LLVM option parsing)
>>> -help'
>>> > clang (LLVM option parsing): Did you mean
>>> '-esan-instrument-memintrinsics'?
>>> >
>>> > --
>>> >
>>> > ********************
>>> > Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..
>>> > Testing Time: 211.25s
>>> > ********************
>>> > Failing Tests (1):
>>> >     HWAddressSanitizer-aarch64 :: TestCases/mem-intrinsics.c
>>> >
>>> >
>>> >
>>> > On Thu, Dec 20, 2018 at 1:13 AM Eugene Leviant via llvm-commits <
>>> llvm-commits at lists.llvm.org> wrote:
>>> >>
>>> >> Author: evgeny777
>>> >> Date: Thu Dec 20 01:10:03 2018
>>> >> New Revision: 349730
>>> >>
>>> >> URL: http://llvm.org/viewvc/llvm-project?rev=349730&view=rev
>>> >> Log:
>>> >> [HWASAN] Add support for memory intrinsics
>>> >>
>>> >> This is patch complements D55117 implementing __hwasan_mem*
>>> >> functions in runtime
>>> >>
>>> >> Differential revision: https://reviews.llvm.org/D55554
>>> >>
>>> >> Added:
>>> >>     compiler-rt/trunk/lib/hwasan/hwasan_checks.h
>>> >>     compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc
>>> >>     compiler-rt/trunk/test/hwasan/TestCases/mem-intrinsics.c
>>> >> Modified:
>>> >>     compiler-rt/trunk/lib/hwasan/CMakeLists.txt
>>> >>     compiler-rt/trunk/lib/hwasan/hwasan.cc
>>> >>     compiler-rt/trunk/lib/hwasan/hwasan_interface_internal.h
>>> >>
>>> >> Modified: compiler-rt/trunk/lib/hwasan/CMakeLists.txt
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/CMakeLists.txt?rev=349730&r1=349729&r2=349730&view=diff
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/lib/hwasan/CMakeLists.txt (original)
>>> >> +++ compiler-rt/trunk/lib/hwasan/CMakeLists.txt Thu Dec 20 01:10:03
>>> 2018
>>> >> @@ -7,6 +7,7 @@ set(HWASAN_RTL_SOURCES
>>> >>    hwasan_dynamic_shadow.cc
>>> >>    hwasan_interceptors.cc
>>> >>    hwasan_linux.cc
>>> >> +  hwasan_memintrinsics.cc
>>> >>    hwasan_poisoning.cc
>>> >>    hwasan_report.cc
>>> >>    hwasan_thread.cc
>>> >>
>>> >> Modified: compiler-rt/trunk/lib/hwasan/hwasan.cc
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cc?rev=349730&r1=349729&r2=349730&view=diff
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/lib/hwasan/hwasan.cc (original)
>>> >> +++ compiler-rt/trunk/lib/hwasan/hwasan.cc Thu Dec 20 01:10:03 2018
>>> >> @@ -13,20 +13,20 @@
>>> >>
>>> //===----------------------------------------------------------------------===//
>>> >>
>>> >>  #include "hwasan.h"
>>> >> -#include "hwasan_mapping.h"
>>> >> +#include "hwasan_checks.h"
>>> >>  #include "hwasan_poisoning.h"
>>> >>  #include "hwasan_report.h"
>>> >>  #include "hwasan_thread.h"
>>> >>  #include "hwasan_thread_list.h"
>>> >>  #include "sanitizer_common/sanitizer_atomic.h"
>>> >>  #include "sanitizer_common/sanitizer_common.h"
>>> >> -#include "sanitizer_common/sanitizer_flags.h"
>>> >>  #include "sanitizer_common/sanitizer_flag_parser.h"
>>> >> +#include "sanitizer_common/sanitizer_flags.h"
>>> >>  #include "sanitizer_common/sanitizer_libc.h"
>>> >>  #include "sanitizer_common/sanitizer_procmaps.h"
>>> >> +#include "sanitizer_common/sanitizer_stackdepot.h"
>>> >>  #include "sanitizer_common/sanitizer_stacktrace.h"
>>> >>  #include "sanitizer_common/sanitizer_symbolizer.h"
>>> >> -#include "sanitizer_common/sanitizer_stackdepot.h"
>>> >>  #include "ubsan/ubsan_flags.h"
>>> >>  #include "ubsan/ubsan_init.h"
>>> >>
>>> >> @@ -365,63 +365,6 @@ void __sanitizer_unaligned_store64(uu64
>>> >>    *p = x;
>>> >>  }
>>> >>
>>> >> -template<unsigned X>
>>> >> -__attribute__((always_inline))
>>> >> -static void SigTrap(uptr p) {
>>> >> -#if defined(__aarch64__)
>>> >> -  (void)p;
>>> >> -  // 0x900 is added to do not interfere with the kernel use of lower
>>> values of
>>> >> -  // brk immediate.
>>> >> -  // FIXME: Add a constraint to put the pointer into x0, the same as
>>> x86 branch.
>>> >> -  asm("brk %0\n\t" ::"n"(0x900 + X));
>>> >> -#elif defined(__x86_64__)
>>> >> -  // INT3 + NOP DWORD ptr [EAX + X] to pass X to our signal handler,
>>> 5 bytes
>>> >> -  // total. The pointer is passed via rdi.
>>> >> -  // 0x40 is added as a safeguard, to help distinguish our trap from
>>> others and
>>> >> -  // to avoid 0 offsets in the command (otherwise it'll be reduced
>>> to a
>>> >> -  // different nop command, the three bytes one).
>>> >> -  asm volatile(
>>> >> -      "int3\n"
>>> >> -      "nopl %c0(%%rax)\n"
>>> >> -      :: "n"(0x40 + X), "D"(p));
>>> >> -#else
>>> >> -  // FIXME: not always sigill.
>>> >> -  __builtin_trap();
>>> >> -#endif
>>> >> -  // __builtin_unreachable();
>>> >> -}
>>> >> -
>>> >> -enum class ErrorAction { Abort, Recover };
>>> >> -enum class AccessType { Load, Store };
>>> >> -
>>> >> -template <ErrorAction EA, AccessType AT, unsigned LogSize>
>>> >> -__attribute__((always_inline, nodebug)) static void
>>> CheckAddress(uptr p) {
>>> >> -  tag_t ptr_tag = GetTagFromPointer(p);
>>> >> -  uptr ptr_raw = p & ~kAddressTagMask;
>>> >> -  tag_t mem_tag = *(tag_t *)MemToShadow(ptr_raw);
>>> >> -  if (UNLIKELY(ptr_tag != mem_tag)) {
>>> >> -    SigTrap<0x20 * (EA == ErrorAction::Recover) +
>>> >> -           0x10 * (AT == AccessType::Store) + LogSize>(p);
>>> >> -    if (EA == ErrorAction::Abort) __builtin_unreachable();
>>> >> -  }
>>> >> -}
>>> >> -
>>> >> -template <ErrorAction EA, AccessType AT>
>>> >> -__attribute__((always_inline, nodebug)) static void
>>> CheckAddressSized(uptr p,
>>> >> -
>>>   uptr sz) {
>>> >> -  CHECK_NE(0, sz);
>>> >> -  tag_t ptr_tag = GetTagFromPointer(p);
>>> >> -  uptr ptr_raw = p & ~kAddressTagMask;
>>> >> -  tag_t *shadow_first = (tag_t *)MemToShadow(ptr_raw);
>>> >> -  tag_t *shadow_last = (tag_t *)MemToShadow(ptr_raw + sz - 1);
>>> >> -  for (tag_t *t = shadow_first; t <= shadow_last; ++t)
>>> >> -    if (UNLIKELY(ptr_tag != *t)) {
>>> >> -      SigTrap<0x20 * (EA == ErrorAction::Recover) +
>>> >> -             0x10 * (AT == AccessType::Store) + 0xf>(p);
>>> >> -      if (EA == ErrorAction::Abort) __builtin_unreachable();
>>> >> -    }
>>> >> -}
>>> >> -
>>> >>  void __hwasan_loadN(uptr p, uptr sz) {
>>> >>    CheckAddressSized<ErrorAction::Abort, AccessType::Load>(p, sz);
>>> >>  }
>>> >>
>>> >> Added: compiler-rt/trunk/lib/hwasan/hwasan_checks.h
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_checks.h?rev=349730&view=auto
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/lib/hwasan/hwasan_checks.h (added)
>>> >> +++ compiler-rt/trunk/lib/hwasan/hwasan_checks.h Thu Dec 20 01:10:03
>>> 2018
>>> >> @@ -0,0 +1,79 @@
>>> >> +//===-- hwasan_checks.h -----------------------------------------*-
>>> C++ -*-===//
>>> >> +//
>>> >> +//                     The LLVM Compiler Infrastructure
>>> >> +//
>>> >> +// This file is distributed under the University of Illinois Open
>>> Source
>>> >> +// License. See LICENSE.TXT for details.
>>> >> +//
>>> >>
>>> +//===----------------------------------------------------------------------===//
>>> >> +//
>>> >> +// This file is a part of HWAddressSanitizer.
>>> >> +//
>>> >>
>>> +//===----------------------------------------------------------------------===//
>>> >> +
>>> >> +#ifndef HWASAN_CHECKS_H
>>> >> +#define HWASAN_CHECKS_H
>>> >> +
>>> >> +#include "hwasan_mapping.h"
>>> >> +
>>> >> +namespace __hwasan {
>>> >> +template <unsigned X>
>>> >> +__attribute__((always_inline)) static void SigTrap(uptr p) {
>>> >> +#if defined(__aarch64__)
>>> >> +  (void)p;
>>> >> +  // 0x900 is added to do not interfere with the kernel use of lower
>>> values of
>>> >> +  // brk immediate.
>>> >> +  // FIXME: Add a constraint to put the pointer into x0, the same as
>>> x86 branch.
>>> >> +  asm("brk %0\n\t" ::"n"(0x900 + X));
>>> >> +#elif defined(__x86_64__)
>>> >> +  // INT3 + NOP DWORD ptr [EAX + X] to pass X to our signal handler,
>>> 5 bytes
>>> >> +  // total. The pointer is passed via rdi.
>>> >> +  // 0x40 is added as a safeguard, to help distinguish our trap from
>>> others and
>>> >> +  // to avoid 0 offsets in the command (otherwise it'll be reduced
>>> to a
>>> >> +  // different nop command, the three bytes one).
>>> >> +  asm volatile(
>>> >> +      "int3\n"
>>> >> +      "nopl %c0(%%rax)\n" ::"n"(0x40 + X),
>>> >> +      "D"(p));
>>> >> +#else
>>> >> +  // FIXME: not always sigill.
>>> >> +  __builtin_trap();
>>> >> +#endif
>>> >> +  // __builtin_unreachable();
>>> >> +}
>>> >> +
>>> >> +enum class ErrorAction { Abort, Recover };
>>> >> +enum class AccessType { Load, Store };
>>> >> +
>>> >> +template <ErrorAction EA, AccessType AT, unsigned LogSize>
>>> >> +__attribute__((always_inline, nodebug)) static void
>>> CheckAddress(uptr p) {
>>> >> +  tag_t ptr_tag = GetTagFromPointer(p);
>>> >> +  uptr ptr_raw = p & ~kAddressTagMask;
>>> >> +  tag_t mem_tag = *(tag_t *)MemToShadow(ptr_raw);
>>> >> +  if (UNLIKELY(ptr_tag != mem_tag)) {
>>> >> +    SigTrap<0x20 * (EA == ErrorAction::Recover) +
>>> >> +            0x10 * (AT == AccessType::Store) + LogSize>(p);
>>> >> +    if (EA == ErrorAction::Abort)
>>> >> +      __builtin_unreachable();
>>> >> +  }
>>> >> +}
>>> >> +
>>> >> +template <ErrorAction EA, AccessType AT>
>>> >> +__attribute__((always_inline, nodebug)) static void
>>> CheckAddressSized(uptr p,
>>> >> +
>>>   uptr sz) {
>>> >> +  CHECK_NE(0, sz);
>>> >> +  tag_t ptr_tag = GetTagFromPointer(p);
>>> >> +  uptr ptr_raw = p & ~kAddressTagMask;
>>> >> +  tag_t *shadow_first = (tag_t *)MemToShadow(ptr_raw);
>>> >> +  tag_t *shadow_last = (tag_t *)MemToShadow(ptr_raw + sz - 1);
>>> >> +  for (tag_t *t = shadow_first; t <= shadow_last; ++t)
>>> >> +    if (UNLIKELY(ptr_tag != *t)) {
>>> >> +      SigTrap<0x20 * (EA == ErrorAction::Recover) +
>>> >> +              0x10 * (AT == AccessType::Store) + 0xf>(p);
>>> >> +      if (EA == ErrorAction::Abort)
>>> >> +        __builtin_unreachable();
>>> >> +    }
>>> >> +}
>>> >> +}  // end namespace __hwasan
>>> >> +
>>> >> +#endif  // HWASAN_CHECKS_H
>>> >>
>>> >> Modified: compiler-rt/trunk/lib/hwasan/hwasan_interface_internal.h
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_interface_internal.h?rev=349730&r1=349729&r2=349730&view=diff
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/lib/hwasan/hwasan_interface_internal.h
>>> (original)
>>> >> +++ compiler-rt/trunk/lib/hwasan/hwasan_interface_internal.h Thu Dec
>>> 20 01:10:03 2018
>>> >> @@ -194,6 +194,13 @@ void * __sanitizer_realloc(void *ptr, up
>>> >>
>>> >>  SANITIZER_INTERFACE_ATTRIBUTE
>>> >>  void * __sanitizer_malloc(uptr size);
>>> >> +
>>> >> +SANITIZER_INTERFACE_ATTRIBUTE
>>> >> +void *__hwasan_memcpy(void *dst, const void *src, uptr size);
>>> >> +SANITIZER_INTERFACE_ATTRIBUTE
>>> >> +void *__hwasan_memset(void *s, int c, uptr n);
>>> >> +SANITIZER_INTERFACE_ATTRIBUTE
>>> >> +void *__hwasan_memmove(void *dest, const void *src, uptr n);
>>> >>  }  // extern "C"
>>> >>
>>> >>  #endif  // HWASAN_INTERFACE_INTERNAL_H
>>> >>
>>> >> Added: compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc?rev=349730&view=auto
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc (added)
>>> >> +++ compiler-rt/trunk/lib/hwasan/hwasan_memintrinsics.cc Thu Dec 20
>>> 01:10:03 2018
>>> >> @@ -0,0 +1,45 @@
>>> >> +//===-- hwasan_memintrinsics.cc ---------------------------------*-
>>> C++ -*-===//
>>> >> +//
>>> >> +//                     The LLVM Compiler Infrastructure
>>> >> +//
>>> >> +// This file is distributed under the University of Illinois Open
>>> Source
>>> >> +// License. See LICENSE.TXT for details.
>>> >> +//
>>> >>
>>> +//===----------------------------------------------------------------------===//
>>> >> +///
>>> >> +/// \file
>>> >> +/// This file is a part of HWAddressSanitizer and contains HWASAN
>>> versions of
>>> >> +/// memset, memcpy and memmove
>>> >> +///
>>> >>
>>> +//===----------------------------------------------------------------------===//
>>> >> +
>>> >> +#include <string.h>
>>> >> +#include "hwasan.h"
>>> >> +#include "hwasan_checks.h"
>>> >> +#include "hwasan_flags.h"
>>> >> +#include "hwasan_interface_internal.h"
>>> >> +#include "sanitizer_common/sanitizer_libc.h"
>>> >> +
>>> >> +using namespace __hwasan;
>>> >> +
>>> >> +void *__hwasan_memset(void *block, int c, uptr size) {
>>> >> +  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
>>> >> +      reinterpret_cast<uptr>(block), size);
>>> >> +  return memset(UntagPtr(block), c, size);
>>> >> +}
>>> >> +
>>> >> +void *__hwasan_memcpy(void *to, const void *from, uptr size) {
>>> >> +  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
>>> >> +      reinterpret_cast<uptr>(to), size);
>>> >> +  CheckAddressSized<ErrorAction::Recover, AccessType::Load>(
>>> >> +      reinterpret_cast<uptr>(from), size);
>>> >> +  return memcpy(UntagPtr(to), UntagPtr(from), size);
>>> >> +}
>>> >> +
>>> >> +void *__hwasan_memmove(void *to, const void *from, uptr size) {
>>> >> +  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(
>>> >> +      reinterpret_cast<uptr>(to), size);
>>> >> +  CheckAddressSized<ErrorAction::Recover, AccessType::Load>(
>>> >> +      reinterpret_cast<uptr>(from), size);
>>> >> +  return memmove(UntagPtr(to), UntagPtr(from), size);
>>> >> +}
>>> >>
>>> >> Added: compiler-rt/trunk/test/hwasan/TestCases/mem-intrinsics.c
>>> >> URL:
>>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/hwasan/TestCases/mem-intrinsics.c?rev=349730&view=auto
>>> >>
>>> ==============================================================================
>>> >> --- compiler-rt/trunk/test/hwasan/TestCases/mem-intrinsics.c (added)
>>> >> +++ compiler-rt/trunk/test/hwasan/TestCases/mem-intrinsics.c Thu Dec
>>> 20 01:10:03 2018
>>> >> @@ -0,0 +1,37 @@
>>> >> +// RUN: %clang_hwasan %s -DTEST_NO=1 -mllvm
>>> -hwasan-instrument-mem-intrinsics -o %t && not %run %t 2>&1 | FileCheck %s
>>> --check-prefix=WRITE
>>> >> +// RUN: %clang_hwasan %s -DTEST_NO=2 -mllvm
>>> -hwasan-instrument-mem-intrinsics -o %t && not %run %t 2>&1 | FileCheck %s
>>> --check-prefix=READ
>>> >> +// RUN: %clang_hwasan %s -DTEST_NO=3 -mllvm
>>> -hwasan-instrument-mem-intrinsics -o %t && not %run %t 2>&1 | FileCheck %s
>>> --check-prefix=WRITE
>>> >> +// RUN: %clang_hwasan %s -DTEST_NO=2 -mllvm
>>> -hwasan-instrument-mem-intrinsics -o %t && not
>>> %env_hwasan_opts=halt_on_error=0 %run %t 2>&1 | FileCheck %s
>>> --check-prefix=RECOVER
>>> >> +
>>> >> +// REQUIRES: stable-runtime
>>> >> +
>>> >> +#include <stdio.h>
>>> >> +#include <stdlib.h>
>>> >> +#include <unistd.h>
>>> >> +
>>> >> +int main() {
>>> >> +  char Q[16];
>>> >> +  char P[16];
>>> >> +#if TEST_NO == 1
>>> >> +  memset(Q, 0, 32);
>>> >> +#elif TEST_NO == 2
>>> >> +  memmove(Q, Q + 16, 16);
>>> >> +#elif TEST_NO == 3
>>> >> +  memcpy(Q, P, 32);
>>> >> +#endif
>>> >> +  write(STDOUT_FILENO, "recovered\n", 10);
>>> >> +  // WRITE: ERROR: HWAddressSanitizer: tag-mismatch on address
>>> >> +  // WRITE: WRITE {{.*}} tags: [[PTR_TAG:..]]/[[MEM_TAG:..]]
>>> (ptr/mem)
>>> >> +  // WRITE: Memory tags around the buggy address (one tag
>>> corresponds to 16 bytes):
>>> >> +  // WRITE: =>{{.*}}[[MEM_TAG]]
>>> >> +  // WRITE-NOT: recovered
>>> >> +
>>> >> +  // READ: ERROR: HWAddressSanitizer: tag-mismatch on address
>>> >> +  // READ: READ {{.*}} tags: [[PTR_TAG:..]]/[[MEM_TAG:..]] (ptr/mem)
>>> >> +  // READ: Memory tags around the buggy address (one tag corresponds
>>> to 16 bytes):
>>> >> +  // READ: =>{{.*}}[[MEM_TAG]]
>>> >> +  // READ-NOT: recovered
>>> >> +
>>> >> +  // RECOVER: recovered
>>> >> +  return 0;
>>> >> +}
>>> >>
>>> >>
>>> >> _______________________________________________
>>> >> llvm-commits mailing list
>>> >> llvm-commits at lists.llvm.org
>>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181220/6ee1cc30/attachment.html>


More information about the llvm-commits mailing list