<div dir="ltr">Thanks</div><div class="gmail_extra"><br><div class="gmail_quote">On 31 August 2017 at 01:55, Evgenii Stepanov <span dir="ltr"><<a href="mailto:eugeni.stepanov@gmail.com" target="_blank">eugeni.stepanov@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">r312203.<br>
<div class="HOEnZb"><div class="h5"><br>
On Wed, Aug 30, 2017 at 5:06 PM, Evgenii Stepanov<br>
<<a href="mailto:eugeni.stepanov@gmail.com">eugeni.stepanov@gmail.com</a>> wrote:<br>
> I'll try to do it later today. Sorry for the delay.<br>
><br>
> On Wed, Aug 30, 2017 at 4:20 AM, Russell Gallop<br>
> <<a href="mailto:russell.gallop@gmail.com">russell.gallop@gmail.com</a>> wrote:<br>
>> Hi Evgeniy,<br>
>><br>
>> This causes problems for our xunit.xml parsing (--xunit-xml-output=xunit.xml<br>
>> option to lit). With your new tests it produces an “<unnamed>” test suite:<br>
>><br>
>> <testsuite name='<unnamed>' tests='3' failures='0'><br>
>> <testcase classname='<unnamed>.<wbr>TestCases' name='recover-dedup-limit.cpp'<br>
>> time='0.23'/><br>
>> <testcase classname='<unnamed>.<wbr>TestCases' name='recover-dedup.cpp'<br>
>> time='0.21'/><br>
>> <testcase classname='<unnamed>.<wbr>TestCases' name='uadd-overflow.cpp'<br>
>> time='0.57'/><br>
>> </testsuite><br>
>><br>
>> Please can you specify <a href="http://config.name" rel="noreferrer" target="_blank">config.name</a> in lit.common.cfg?<br>
>><br>
>> Regards<br>
>> Russ<br>
>><br>
>> On 29 August 2017 at 21:03, Evgeniy Stepanov via llvm-commits<br>
>> <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
>>><br>
>>> Author: eugenis<br>
>>> Date: Tue Aug 29 13:03:51 2017<br>
>>> New Revision: 312029<br>
>>><br>
>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=312029&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=312029&view=rev</a><br>
>>> Log:<br>
>>> Minimal runtime for UBSan.<br>
>>><br>
>>> Summary:<br>
>>> An implementation of ubsan runtime library suitable for use in production.<br>
>>><br>
>>> Minimal attack surface.<br>
>>> * No stack traces.<br>
>>> * Definitely no C++ demangling.<br>
>>> * No UBSAN_OPTIONS=log_file=/path (very suid-unfriendly). And no<br>
>>> UBSAN_OPTIONS in general.<br>
>>> * as simple as possible<br>
>>><br>
>>> Minimal CPU and RAM overhead.<br>
>>> * Source locations unnecessary in the presence of (split) debug info.<br>
>>> * Values and types (as in A+B overflows T) can be reconstructed from<br>
>>> register/stack dumps, once you know what type of error you are looking at.<br>
>>> * above two items save 3% binary size.<br>
>>><br>
>>> When UBSan is used with -ftrap-function=abort, sometimes it is hard to<br>
>>> reason about failures. This library replaces abort with a slightly more<br>
>>> informative message without much extra overhead. Since ubsan interface in<br>
>>> not stable, this code must reside in compiler-rt.<br>
>>><br>
>>> Reviewers: pcc, kcc<br>
>>><br>
>>> Subscribers: srhines, mgorny, aprantl, krytarowski, llvm-commits<br>
>>><br>
>>> Differential Revision: <a href="https://reviews.llvm.org/D36810" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D36810</a><br>
>>><br>
>>> Added:<br>
>>>     compiler-rt/trunk/lib/ubsan_<wbr>minimal/<br>
>>>     compiler-rt/trunk/lib/ubsan_<wbr>minimal/CMakeLists.txt<br>
>>>     compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan.syms.extra<br>
>>>     compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan_minimal_<wbr>handlers.cc<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/CMakeLists.txt<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup-limit.cpp<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup.cpp<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/uadd-<wbr>overflow.cpp<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/lit.common.cfg<br>
>>>     compiler-rt/trunk/test/ubsan_<wbr>minimal/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
>>> Modified:<br>
>>>     compiler-rt/trunk/cmake/<wbr>config-ix.cmake<br>
>>><br>
>>> Modified: compiler-rt/trunk/cmake/<wbr>config-ix.cmake<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-ix.cmake?rev=312029&r1=312028&r2=312029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>cmake/config-ix.cmake?rev=<wbr>312029&r1=312028&r2=312029&<wbr>view=diff</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/cmake/<wbr>config-ix.cmake (original)<br>
>>> +++ compiler-rt/trunk/cmake/<wbr>config-ix.cmake Tue Aug 29 13:03:51 2017<br>
>>> @@ -470,7 +470,7 @@ else()<br>
>>>    set(OS_NAME "${CMAKE_SYSTEM_NAME}")<br>
>>>  endif()<br>
>>><br>
>>> -set(ALL_SANITIZERS asan;dfsan;msan;tsan;<wbr>safestack;cfi;esan;scudo)<br>
>>> +set(ALL_SANITIZERS<br>
>>> asan;dfsan;msan;tsan;<wbr>safestack;cfi;esan;scudo;<wbr>ubsan_minimal)<br>
>>>  set(COMPILER_RT_SANITIZERS_TO_<wbr>BUILD all CACHE STRING<br>
>>>      "sanitizers to build if supported on the target<br>
>>> (all;${ALL_SANITIZERS})")<br>
>>>  list_replace(COMPILER_RT_<wbr>SANITIZERS_TO_BUILD all "${ALL_SANITIZERS}")<br>
>>> @@ -545,6 +545,13 @@ else()<br>
>>>    set(COMPILER_RT_HAS_UBSAN FALSE)<br>
>>>  endif()<br>
>>><br>
>>> +if (COMPILER_RT_HAS_SANITIZER_<wbr>COMMON AND UBSAN_SUPPORTED_ARCH AND<br>
>>> +    OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|<wbr>Android")<br>
>>> +  set(COMPILER_RT_HAS_UBSAN_<wbr>MINIMAL TRUE)<br>
>>> +else()<br>
>>> +  set(COMPILER_RT_HAS_UBSAN_<wbr>MINIMAL FALSE)<br>
>>> +endif()<br>
>>> +<br>
>>>  if (COMPILER_RT_HAS_SANITIZER_<wbr>COMMON AND SAFESTACK_SUPPORTED_ARCH AND<br>
>>>      OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD")<br>
>>>    set(COMPILER_RT_HAS_SAFESTACK TRUE)<br>
>>><br>
>>> Added: compiler-rt/trunk/lib/ubsan_<wbr>minimal/CMakeLists.txt<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan_minimal/CMakeLists.txt?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>ubsan_minimal/CMakeLists.txt?<wbr>rev=312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/lib/ubsan_<wbr>minimal/CMakeLists.txt (added)<br>
>>> +++ compiler-rt/trunk/lib/ubsan_<wbr>minimal/CMakeLists.txt Tue Aug 29 13:03:51<br>
>>> 2017<br>
>>> @@ -0,0 +1,50 @@<br>
>>> +# Build for the undefined behavior sanitizer runtime support library.<br>
>>> +<br>
>>> +set(UBSAN_MINIMAL_SOURCES<br>
>>> +  ubsan_minimal_handlers.cc<br>
>>> +  )<br>
>>> +<br>
>>> +include_directories(..)<br>
>>> +<br>
>>> +set(UBSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS})<br>
>>> +append_rtti_flag(OFF UBSAN_CFLAGS)<br>
>>> +<br>
>>> +set(UBSAN_STANDALONE_CFLAGS ${SANITIZER_COMMON_CFLAGS})<br>
>>> +append_rtti_flag(OFF UBSAN_STANDALONE_CFLAGS)<br>
>>> +<br>
>>> +add_compiler_rt_component(<wbr>ubsan-minimal)<br>
>>> +<br>
>>> +# Common parts of UBSan runtime.<br>
>>> +add_compiler_rt_object_<wbr>libraries(RTUbsan_minimal<br>
>>> +  ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}<br>
>>> +  SOURCES ${UBSAN_MINIMAL_SOURCES} CFLAGS ${UBSAN_CFLAGS})<br>
>>> +<br>
>>> +<br>
>>> +if(COMPILER_RT_HAS_UBSAN)<br>
>>> +  # Initializer of standalone UBSan runtime.<br>
>>> +<br>
>>> +  # Standalone UBSan runtimes.<br>
>>> +  add_compiler_rt_runtime(clang_<wbr>rt.ubsan_minimal<br>
>>> +    STATIC<br>
>>> +    ARCHS ${UBSAN_SUPPORTED_ARCH}<br>
>>> +    OBJECT_LIBS RTUbsan_minimal<br>
>>> +    CFLAGS ${UBSAN_CFLAGS}<br>
>>> +    PARENT_TARGET ubsan-minimal)<br>
>>> +<br>
>>> +  add_compiler_rt_runtime(clang_<wbr>rt.ubsan_minimal<br>
>>> +    SHARED<br>
>>> +    ARCHS ${UBSAN_SUPPORTED_ARCH}<br>
>>> +    OBJECT_LIBS RTUbsan_minimal<br>
>>> +    CFLAGS ${UBSAN_CFLAGS}<br>
>>> +    LINK_LIBS ${UBSAN_DYNAMIC_LIBS}<br>
>>> +    PARENT_TARGET ubsan-minimal)<br>
>>> +<br>
>>> +  if (UNIX)<br>
>>> +    set(ARCHS_FOR_SYMBOLS ${UBSAN_SUPPORTED_ARCH})<br>
>>> +    list(REMOVE_ITEM ARCHS_FOR_SYMBOLS i386 i686)<br>
>>> +    add_sanitizer_rt_symbols(<wbr>clang_rt.ubsan_minimal<br>
>>> +      ARCHS ${ARCHS_FOR_SYMBOLS}<br>
>>> +      PARENT_TARGET ubsan-minimal<br>
>>> +      EXTRA ubsan.syms.extra)<br>
>>> +  endif()<br>
>>> +endif()<br>
>>><br>
>>> Added: compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan.syms.extra<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan_minimal/ubsan.syms.extra?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>ubsan_minimal/ubsan.syms.<wbr>extra?rev=312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan.syms.extra (added)<br>
>>> +++ compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan.syms.extra Tue Aug 29<br>
>>> 13:03:51 2017<br>
>>> @@ -0,0 +1 @@<br>
>>> +__ubsan_*<br>
>>><br>
>>> Added: compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan_minimal_<wbr>handlers.cc<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan_minimal/ubsan_minimal_handlers.cc?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>ubsan_minimal/ubsan_minimal_<wbr>handlers.cc?rev=312029&view=<wbr>auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan_minimal_<wbr>handlers.cc (added)<br>
>>> +++ compiler-rt/trunk/lib/ubsan_<wbr>minimal/ubsan_minimal_<wbr>handlers.cc Tue Aug<br>
>>> 29 13:03:51 2017<br>
>>> @@ -0,0 +1,91 @@<br>
>>> +#include <atomic><br>
>>> +#include <stdlib.h><br>
>>> +#include <string.h><br>
>>> +#include <unistd.h><br>
>>> +<br>
>>> +static void message(const char *msg) {<br>
>>> +  write(2, msg, strlen(msg));<br>
>>> +}<br>
>>> +<br>
>>> +static const int kMaxCallerPcs = 20;<br>
>>> +static std::atomic<void *> caller_pcs[kMaxCallerPcs];<br>
>>> +// Number of elements in caller_pcs. A special value of kMaxCallerPcs + 1<br>
>>> means<br>
>>> +// that "too many errors" has already been reported.<br>
>>> +static std::atomic<int> caller_pcs_sz;<br>
>>> +<br>
>>> +__attribute__((noinline))<br>
>>> +static bool report_this_error(void *caller) {<br>
>>> +  if (caller == nullptr) return false;<br>
>>> +  while (true) {<br>
>>> +    int sz = caller_pcs_sz.load(std::<wbr>memory_order_relaxed);<br>
>>> +    if (sz > kMaxCallerPcs) return false; // early exit<br>
>>> +    // when sz==kMaxCallerPcs print "too many errors", but only when<br>
>>> cmpxchg<br>
>>> +    // succeeds in order to not print it multiple times.<br>
>>> +    if (sz > 0 && sz < kMaxCallerPcs) {<br>
>>> +      void *p;<br>
>>> +      for (int i = 0; i < sz; ++i) {<br>
>>> +        p = caller_pcs[i].load(std::<wbr>memory_order_relaxed);<br>
>>> +        if (p == nullptr) break; // Concurrent update.<br>
>>> +        if (p == caller) return false;<br>
>>> +      }<br>
>>> +      if (p == nullptr) continue; // FIXME: yield?<br>
>>> +    }<br>
>>> +<br>
>>> +    if (!caller_pcs_sz.compare_<wbr>exchange_strong(sz, sz + 1))<br>
>>> +      continue; // Concurrent update! Try again from the start.<br>
>>> +<br>
>>> +    if (sz == kMaxCallerPcs) {<br>
>>> +      message("ubsan: too many errors\n");<br>
>>> +      return false;<br>
>>> +    }<br>
>>> +    caller_pcs[sz].store(caller, std::memory_order_relaxed);<br>
>>> +    return true;<br>
>>> +  }<br>
>>> +}<br>
>>> +<br>
>>> +#if defined(__ANDROID__)<br>
>>> +extern "C" void android_set_abort_message(<wbr>const char *msg);<br>
>>> +static void abort_with_message(const char *msg) {<br>
>>> +#if __ANDROID_API__ >= 21<br>
>>> +  android_set_abort_message(msg)<wbr>;<br>
>>> +#endif<br>
>>> +  abort();<br>
>>> +}<br>
>>> +#else<br>
>>> +static void abort_with_message(const char *) { abort(); }<br>
>>> +#endif<br>
>>> +<br>
>>> +#define INTERFACE extern "C" __attribute__((visibility("<wbr>default")))<br>
>>> +<br>
>>> +// FIXME: add caller pc to the error message (possibly as "ubsan:<br>
>>> error-type<br>
>>> +// @1234ABCD").<br>
>>> +#define HANDLER(name, msg)                                       \<br>
>>> +  INTERFACE void __ubsan_handle_##name##_<wbr>minimal() {             \<br>
>>> +    if (!report_this_error(__builtin_<wbr>return_address(0))) return; \<br>
>>> +    message("ubsan: " msg "\n");                                 \<br>
>>> +  }                                                              \<br>
>>> +                                                                 \<br>
>>> +  INTERFACE void __ubsan_handle_##name##_<wbr>minimal_abort() {       \<br>
>>> +    message("ubsan: " msg "\n");                                 \<br>
>>> +    abort_with_message("ubsan: " msg);                           \<br>
>>> +  }<br>
>>> +<br>
>>> +HANDLER(type_mismatch, "type-mismatch")<br>
>>> +HANDLER(add_overflow, "add-overflow")<br>
>>> +HANDLER(sub_overflow, "sub-overflow")<br>
>>> +HANDLER(mul_overflow, "mul-overflow")<br>
>>> +HANDLER(negate_overflow, "negate-overflow")<br>
>>> +HANDLER(divrem_overflow, "divrem-overflow")<br>
>>> +HANDLER(shift_out_of_bounds, "shift-out-of-bounds")<br>
>>> +HANDLER(out_of_bounds, "out-of-bounds")<br>
>>> +HANDLER(builtin_unreachable, "builtin-unreachable")<br>
>>> +HANDLER(missing_return, "missing-return")<br>
>>> +HANDLER(vla_bound_not_<wbr>positive, "vla-bound-not-positive")<br>
>>> +HANDLER(float_cast_overflow, "float-cast-overflow")<br>
>>> +HANDLER(load_invalid_value, "load-invalid-value")<br>
>>> +HANDLER(invalid_builtin, "invalid-builtin")<br>
>>> +HANDLER(function_type_<wbr>mismatch, "function-type-mismatch")<br>
>>> +HANDLER(nonnull_arg, "nonnull-arg")<br>
>>> +HANDLER(nullability_arg, "nullability-arg")<br>
>>> +HANDLER(pointer_overflow, "pointer-overflow")<br>
>>> +HANDLER(cfi_check_fail, "cfi-check-fail")<br>
>>><br>
>>> Added: compiler-rt/trunk/test/ubsan_<wbr>minimal/CMakeLists.txt<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/CMakeLists.txt?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/CMakeLists.<wbr>txt?rev=312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/CMakeLists.txt (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/CMakeLists.txt Tue Aug 29<br>
>>> 13:03:51 2017<br>
>>> @@ -0,0 +1,23 @@<br>
>>> +set(UBSAN_LIT_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})<br>
>>> +<br>
>>> +set(UBSAN_TEST_ARCH ${UBSAN_SUPPORTED_ARCH})<br>
>>> +<br>
>>> +set(UBSAN_TESTSUITES)<br>
>>> +set(UBSAN_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_<wbr>DEPS})<br>
>>> +if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
>>> +  list(APPEND UBSAN_TEST_DEPS ubsan-minimal)<br>
>>> +endif()<br>
>>> +<br>
>>> +foreach(arch ${UBSAN_TEST_ARCH})<br>
>>> +  get_test_cc_for_arch(${arch} UBSAN_TEST_TARGET_CC<br>
>>> UBSAN_TEST_TARGET_CFLAGS)<br>
>>> +  set(CONFIG_NAME ${arch})<br>
>>> +  configure_lit_site_cfg(<br>
>>> +    ${CMAKE_CURRENT_SOURCE_DIR}/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">li<wbr>t.site.cfg.in</a><br>
>>> +    ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME}/lit.site.cfg)<br>
>>> +  list(APPEND UBSAN_TESTSUITES<br>
>>> ${CMAKE_CURRENT_BINARY_DIR}/${<wbr>CONFIG_NAME})<br>
>>> +endforeach()<br>
>>> +<br>
>>> +add_lit_testsuite(check-<wbr>ubsan-minimal "Running<br>
>>> UndefinedBehaviorSanitizerMini<wbr>mal tests"<br>
>>> +  ${UBSAN_TESTSUITES}<br>
>>> +  DEPENDS ${UBSAN_TEST_DEPS})<br>
>>> +set_target_properties(check-<wbr>ubsan-minimal PROPERTIES FOLDER "Compiler-RT<br>
>>> Misc")<br>
>>><br>
>>> Added:<br>
>>> compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup-limit.cpp<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/TestCases/recover-dedup-limit.cpp?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/TestCases/<wbr>recover-dedup-limit.cpp?rev=<wbr>312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup-limit.cpp<br>
>>> (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup-limit.cpp<br>
>>> Tue Aug 29 13:03:51 2017<br>
>>> @@ -0,0 +1,41 @@<br>
>>> +// RUN: %clangxx -fsanitize=signed-integer-<wbr>overflow<br>
>>> -fsanitize-recover=all %s -o %t && %run %t 2>&1 | FileCheck %s<br>
>>> +<br>
>>> +#include <stdint.h><br>
>>> +<br>
>>> +#define OVERFLOW  \<br>
>>> +  x = 0x7FFFFFFE; \<br>
>>> +  x += __LINE__<br>
>>> +<br>
>>> +int main() {<br>
>>> +  int32_t x;<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: add-overflow<br>
>>> +<br>
>>> +  // CHECK-NOT: add-overflow<br>
>>> +  OVERFLOW;  // CHECK: too many errors<br>
>>> +  // CHECK-NOT: add-overflow<br>
>>> +  OVERFLOW;<br>
>>> +  OVERFLOW;<br>
>>> +  OVERFLOW;<br>
>>> +}<br>
>>><br>
>>> Added: compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup.cpp<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/TestCases/recover-dedup.cpp?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/TestCases/<wbr>recover-dedup.cpp?rev=312029&<wbr>view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup.cpp<br>
>>> (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/recover-<wbr>dedup.cpp Tue<br>
>>> Aug 29 13:03:51 2017<br>
>>> @@ -0,0 +1,25 @@<br>
>>> +// RUN: %clangxx -fsanitize=signed-integer-<wbr>overflow<br>
>>> -fsanitize-recover=all %s -o %t && %run %t 2>&1 | FileCheck %s<br>
>>> +<br>
>>> +#include <stdint.h><br>
>>> +<br>
>>> +__attribute__((noinline))<br>
>>> +int f(int x, int y) {<br>
>>> +  // CHECK: mul-overflow<br>
>>> +  return x * y;<br>
>>> +}<br>
>>> +<br>
>>> +__attribute__((noinline))<br>
>>> +int g(int x, int y) {<br>
>>> +  // CHECK: mul-overflow<br>
>>> +  return x * (y + 1);<br>
>>> +}<br>
>>> +<br>
>>> +int main() {<br>
>>> +  int x = 2;<br>
>>> +  for (int i = 0; i < 10; ++i)<br>
>>> +    x = f(x, x);<br>
>>> +  x = 2;<br>
>>> +  for (int i = 0; i < 10; ++i)<br>
>>> +    x = g(x, x);<br>
>>> +  // CHECK-NOT: mul-overflow<br>
>>> +}<br>
>>><br>
>>> Added: compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/uadd-<wbr>overflow.cpp<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/TestCases/uadd-overflow.cpp?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/TestCases/<wbr>uadd-overflow.cpp?rev=312029&<wbr>view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/uadd-<wbr>overflow.cpp<br>
>>> (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/TestCases/uadd-<wbr>overflow.cpp Tue<br>
>>> Aug 29 13:03:51 2017<br>
>>> @@ -0,0 +1,10 @@<br>
>>> +// RUN: %clangxx -fsanitize=unsigned-integer-<wbr>overflow %s -o %t && %run %t<br>
>>> 2>&1 | FileCheck %s<br>
>>> +// RUN: %clangxx -fsanitize=unsigned-integer-<wbr>overflow<br>
>>> -fno-sanitize-recover=all %s -o %t && not --crash %run %t 2>&1 | FileCheck<br>
>>> %s<br>
>>> +<br>
>>> +#include <stdint.h><br>
>>> +<br>
>>> +int main() {<br>
>>> +  uint32_t k = 0x87654321;<br>
>>> +  k += 0xedcba987;<br>
>>> +  // CHECK: add-overflow<br>
>>> +}<br>
>>><br>
>>> Added: compiler-rt/trunk/test/ubsan_<wbr>minimal/lit.common.cfg<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/lit.common.cfg?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/lit.common.<wbr>cfg?rev=312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/lit.common.cfg (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/lit.common.cfg Tue Aug 29<br>
>>> 13:03:51 2017<br>
>>> @@ -0,0 +1,35 @@<br>
>>> +# -*- Python -*-<br>
>>> +<br>
>>> +import os<br>
>>> +<br>
>>> +def get_required_attr(config, attr_name):<br>
>>> +  attr_value = getattr(config, attr_name, None)<br>
>>> +  if attr_value == None:<br>
>>> +    lit_config.fatal(<br>
>>> +      "No attribute %r in test configuration! You may need to run "<br>
>>> +      "tests from your build directory or add this attribute "<br>
>>> +      "to lit.site.cfg " % attr_name)<br>
>>> +  return attr_value<br>
>>> +<br>
>>> +# Setup source root.<br>
>>> +config.test_source_root = os.path.dirname(__file__)<br>
>>> +<br>
>>> +def build_invocation(compile_<wbr>flags):<br>
>>> +  return " " + " ".join([config.clang] + compile_flags) + " "<br>
>>> +<br>
>>> +target_cflags = [get_required_attr(config, "target_cflags")]<br>
>>> +clang_ubsan_cflags = ["-fsanitize-minimal-runtime"] + target_cflags<br>
>>> +clang_ubsan_cxxflags = config.cxx_mode_flags + clang_ubsan_cflags<br>
>>> +<br>
>>> +# Define %clang and %clangxx substitutions to use in test RUN lines.<br>
>>> +config.substitutions.append( ("%clang ",<br>
>>> build_invocation(clang_ubsan_<wbr>cflags)) )<br>
>>> +config.substitutions.append( ("%clangxx ",<br>
>>> build_invocation(clang_ubsan_<wbr>cxxflags)) )<br>
>>> +<br>
>>> +# Default test suffixes.<br>
>>> +config.suffixes = ['.c', '.cc', '.cpp']<br>
>>> +<br>
>>> +# Check that the host supports UndefinedBehaviorSanitizerMini<wbr>mal tests<br>
>>> +if config.host_os not in ['Darwin', 'Linux', 'FreeBSD', 'NetBSD']: #<br>
>>> TODO: Windows<br>
>>> +  config.unsupported = True<br>
>>> +<br>
>>> +config.available_features.<wbr>add('arch=' + config.target_arch)<br>
>>><br>
>>> Added: compiler-rt/trunk/test/ubsan_<wbr>minimal/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan_minimal/lit.site.cfg.in?rev=312029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/ubsan_minimal/lit.site.<wbr>cfg.in?rev=312029&view=auto</a><br>
>>><br>
>>> ==============================<wbr>==============================<wbr>==================<br>
>>> --- compiler-rt/trunk/test/ubsan_<wbr>minimal/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a> (added)<br>
>>> +++ compiler-rt/trunk/test/ubsan_<wbr>minimal/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a> Tue Aug 29<br>
>>> 13:03:51 2017<br>
>>> @@ -0,0 +1,11 @@<br>
>>> +@LIT_SITE_CFG_IN_HEADER@<br>
>>> +<br>
>>> +# Tool-specific config options.<br>
>>> +config.target_cflags = "@UBSAN_TEST_TARGET_CFLAGS@"<br>
>>> +config.target_arch = "@UBSAN_TEST_TARGET_ARCH@"<br>
>>> +<br>
>>> +# Load common config for all compiler-rt lit tests.<br>
>>> +lit_config.load_config(<wbr>config,<br>
>>> "@COMPILER_RT_BINARY_DIR@/<wbr>test/lit.common.configured")<br>
>>> +<br>
>>> +# Load tool-specific config that would do the real work.<br>
>>> +lit_config.load_config(<wbr>config, "@UBSAN_LIT_TESTS_DIR@/lit.<wbr>common.cfg")<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>
>><br>
>><br>
</div></div></blockquote></div><br></div>