From 520748f01ef5ea4d4bc27cdbf09898ad9bceb9a8 Mon Sep 17 00:00:00 2001 From: Matt Morehouse Date: Wed, 27 Jun 2018 18:24:46 +0000 Subject: [PATCH] [UBSan] Add silence_unsigned_overflow flag. Summary: Setting UBSAN_OPTIONS=silence_unsigned_overflow=1 will silence all UIO reports. This feature, combined with -fsanitize-recover=unsigned-integer-overflow, is useful for providing fuzzing signal without the excessive log output. Helps with https://github.com/google/oss-fuzz/issues/910. Reviewers: kcc, vsk Reviewed By: vsk Subscribers: vsk, kubamracek, Dor1s, llvm-commits Differential Revision: https://reviews.llvm.org/D48660 llvm-svn: 335762 --- clang/docs/UndefinedBehaviorSanitizer.rst | 7 +++++++ compiler-rt/lib/ubsan/ubsan_flags.inc | 3 +++ compiler-rt/lib/ubsan/ubsan_handlers.cc | 4 ++++ compiler-rt/test/ubsan/TestCases/Integer/no-recover.cpp | 2 ++ 4 files changed, 16 insertions(+) diff --git a/clang/docs/UndefinedBehaviorSanitizer.rst b/clang/docs/UndefinedBehaviorSanitizer.rst index e9f85c24dde0..8dd9157e81fb 100644 --- a/clang/docs/UndefinedBehaviorSanitizer.rst +++ b/clang/docs/UndefinedBehaviorSanitizer.rst @@ -180,6 +180,13 @@ will need to: ``UBSAN_OPTIONS=print_stacktrace=1``. #. Make sure ``llvm-symbolizer`` binary is in ``PATH``. +Silencing Unsigned Integer Overflow +=================================== +To silence reports from unsigned integer overflow, you can set +``UBSAN_OPTIONS=silence_unsigned_overflow=1``. This feature, combined with +``-fsanitize-recover=unsigned-integer-overflow``, is particularly useful for +providing fuzzing signal without blowing up logs. + Issue Suppression ================= diff --git a/compiler-rt/lib/ubsan/ubsan_flags.inc b/compiler-rt/lib/ubsan/ubsan_flags.inc index d171a98e1730..1638a054e8f0 100644 --- a/compiler-rt/lib/ubsan/ubsan_flags.inc +++ b/compiler-rt/lib/ubsan/ubsan_flags.inc @@ -24,3 +24,6 @@ UBSAN_FLAG(bool, print_stacktrace, false, UBSAN_FLAG(const char *, suppressions, "", "Suppressions file name.") UBSAN_FLAG(bool, report_error_type, false, "Print specific error type instead of 'undefined-behavior' in summary.") +UBSAN_FLAG(bool, silence_unsigned_overflow, false, + "Do not print error reports for unsigned integer overflow. " + "Used to provide fuzzing signal without blowing up logs.") diff --git a/compiler-rt/lib/ubsan/ubsan_handlers.cc b/compiler-rt/lib/ubsan/ubsan_handlers.cc index 59a5a6b72e58..b48862a9d6dd 100644 --- a/compiler-rt/lib/ubsan/ubsan_handlers.cc +++ b/compiler-rt/lib/ubsan/ubsan_handlers.cc @@ -15,6 +15,7 @@ #if CAN_SANITIZE_UB #include "ubsan_handlers.h" #include "ubsan_diag.h" +#include "ubsan_flags.h" #include "ubsan_monitor.h" #include "sanitizer_common/sanitizer_common.h" @@ -118,6 +119,9 @@ static void handleIntegerOverflowImpl(OverflowData *Data, ValueHandle LHS, if (ignoreReport(Loc, Opts, ET)) return; + if (!IsSigned && flags()->silence_unsigned_overflow) + return; + ScopedReport R(Opts, Loc, ET); Diag(Loc, DL_Error, ET, "%0 integer overflow: " diff --git a/compiler-rt/test/ubsan/TestCases/Integer/no-recover.cpp b/compiler-rt/test/ubsan/TestCases/Integer/no-recover.cpp index bbc2f8d2c1c4..515ebbd0702e 100644 --- a/compiler-rt/test/ubsan/TestCases/Integer/no-recover.cpp +++ b/compiler-rt/test/ubsan/TestCases/Integer/no-recover.cpp @@ -1,5 +1,6 @@ // RUN: %clangxx -fsanitize=unsigned-integer-overflow %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=RECOVER // RUN: %clangxx -fsanitize=unsigned-integer-overflow -fno-sanitize-recover=all -fsanitize-recover=unsigned-integer-overflow %s -o %t && %run %t 2>&1 | FileCheck %s --check-prefix=RECOVER +// RUN: %env_ubsan_opts=silence_unsigned_overflow=1 %run %t 2>&1 | FileCheck %s --check-prefix=SILENT-RECOVER --allow-empty // RUN: %clangxx -fsanitize=unsigned-integer-overflow -fno-sanitize-recover=unsigned-integer-overflow %s -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=ABORT #include @@ -18,5 +19,6 @@ int main() { (void)(uint64_t(10000000000000000000ull) + uint64_t(9000000000000000000ull)); // RECOVER: 10000000000000000000 + 9000000000000000000 cannot be represented in type 'unsigned {{long( long)?}}' + // SILENT-RECOVER-NOT: runtime error // ABORT-NOT: runtime error }