summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Moroz <mmoroz@chromium.org>2018-07-13 22:49:06 +0000
committerMax Moroz <mmoroz@chromium.org>2018-07-13 22:49:06 +0000
commit038771a25a61bab8db3dea04594ca77faaf67dea (patch)
tree37b7d09f4a5b86e3120d59eada1cba1aaed96987
parent8315667d996b0853af5b2dbc13588fd80c51c7b2 (diff)
downloadbcm5719-llvm-038771a25a61bab8db3dea04594ca77faaf67dea.tar.gz
bcm5719-llvm-038771a25a61bab8db3dea04594ca77faaf67dea.zip
[UBSan] Followup for silence_unsigned_overflow flag to handle negate overflows.
Summary: That flag has been introduced in https://reviews.llvm.org/D48660 for suppressing UIO error messages in an efficient way. The main motivation is to be able to use UIO checks in builds used for fuzzing as it might provide an interesting signal to a fuzzing engine such as libFuzzer. See https://github.com/google/oss-fuzz/issues/910 for more information. Reviewers: morehouse, kcc Reviewed By: morehouse Subscribers: kubamracek, delcypher, #sanitizers, llvm-commits Differential Revision: https://reviews.llvm.org/D49324 llvm-svn: 337068
-rw-r--r--compiler-rt/lib/ubsan/ubsan_handlers.cc3
-rw-r--r--compiler-rt/test/ubsan/TestCases/Integer/negate-overflow.cpp4
2 files changed, 6 insertions, 1 deletions
diff --git a/compiler-rt/lib/ubsan/ubsan_handlers.cc b/compiler-rt/lib/ubsan/ubsan_handlers.cc
index b48862a9d6d..49c6bcacbe2 100644
--- a/compiler-rt/lib/ubsan/ubsan_handlers.cc
+++ b/compiler-rt/lib/ubsan/ubsan_handlers.cc
@@ -156,6 +156,9 @@ static void handleNegateOverflowImpl(OverflowData *Data, ValueHandle OldVal,
if (ignoreReport(Loc, Opts, ET))
return;
+ if (!IsSigned && flags()->silence_unsigned_overflow)
+ return;
+
ScopedReport R(Opts, Loc, ET);
if (IsSigned)
diff --git a/compiler-rt/test/ubsan/TestCases/Integer/negate-overflow.cpp b/compiler-rt/test/ubsan/TestCases/Integer/negate-overflow.cpp
index 72438d3fba7..5e36b9db657 100644
--- a/compiler-rt/test/ubsan/TestCases/Integer/negate-overflow.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Integer/negate-overflow.cpp
@@ -1,10 +1,12 @@
// RUN: %clangxx -fsanitize=signed-integer-overflow %s -o %t1 && %run %t1 2>&1 | FileCheck %s --check-prefix=CHECKS
// RUN: %clangxx -fsanitize=unsigned-integer-overflow %s -o %t2 && %run %t2 2>&1 | FileCheck %s --check-prefix=CHECKU
+// RUN: %clangxx -fsanitize=unsigned-integer-overflow %s -o %t2 && %env_ubsan_opts=silence_unsigned_overflow=1 %run %t2 2>&1 | FileCheck %s --check-prefix=CHECKU-SILENT --allow-empty
int main() {
// CHECKS-NOT: runtime error
- // CHECKU: negate-overflow.cpp:[[@LINE+2]]:3: runtime error: negation of 2147483648 cannot be represented in type 'unsigned int'
+ // CHECKU: negate-overflow.cpp:[[@LINE+3]]:3: runtime error: negation of 2147483648 cannot be represented in type 'unsigned int'
// CHECKU-NOT: cast to an unsigned
+ // CHECKU-SILENT-NOT: runtime error
-unsigned(-0x7fffffff - 1); // ok
// CHECKS: negate-overflow.cpp:[[@LINE+2]]:3: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself
// CHECKU-NOT: runtime error
OpenPOWER on IntegriCloud