From 3bbaeaf673811c69bf7bb034b6be73b77d7062a1 Mon Sep 17 00:00:00 2001 From: George Karpenkov Date: Wed, 13 Jun 2018 18:31:43 +0000 Subject: Change checked arithmetic functions API to return Optional Returning optional is much safer. The previous API had potential to cause use of undefined variables, if the value passed by pointer was accidentally read afterwards. Differential Revision: https://reviews.llvm.org/D48137 llvm-svn: 334634 --- llvm/unittests/Support/CheckedArithmeticTest.cpp | 56 ++++++++++-------------- 1 file changed, 22 insertions(+), 34 deletions(-) (limited to 'llvm/unittests/Support/CheckedArithmeticTest.cpp') diff --git a/llvm/unittests/Support/CheckedArithmeticTest.cpp b/llvm/unittests/Support/CheckedArithmeticTest.cpp index 7fc63498e2b..f797a9ed41e 100644 --- a/llvm/unittests/Support/CheckedArithmeticTest.cpp +++ b/llvm/unittests/Support/CheckedArithmeticTest.cpp @@ -6,65 +6,53 @@ using namespace llvm; namespace { TEST(CheckedArithmetic, CheckedAdd) { - int64_t Out; const int64_t Max = std::numeric_limits::max(); const int64_t Min = std::numeric_limits::min(); - EXPECT_EQ(checkedAdd(Max, Max, &Out), true); - EXPECT_EQ(checkedAdd(Min, -1, &Out), true); - EXPECT_EQ(checkedAdd(Max, 1, &Out), true); - EXPECT_EQ(checkedAdd(10, 1, &Out), false); - EXPECT_EQ(Out, 11); + EXPECT_EQ(checkedAdd(Max, Max), None); + EXPECT_EQ(checkedAdd(Min, -1), None); + EXPECT_EQ(checkedAdd(Max, 1), None); + EXPECT_EQ(checkedAdd(10, 1), Optional(11)); } TEST(CheckedArithmetic, CheckedAddSmall) { - int16_t Out; const int16_t Max = std::numeric_limits::max(); const int16_t Min = std::numeric_limits::min(); - EXPECT_EQ(checkedAdd(Max, Max, &Out), true); - EXPECT_EQ(checkedAdd(Min, -1, &Out), true); - EXPECT_EQ(checkedAdd(Max, 1, &Out), true); - EXPECT_EQ(checkedAdd(10, 1, &Out), false); - EXPECT_EQ(Out, 11); + EXPECT_EQ(checkedAdd(Max, Max), None); + EXPECT_EQ(checkedAdd(Min, -1), None); + EXPECT_EQ(checkedAdd(Max, 1), None); + EXPECT_EQ(checkedAdd(10, 1), Optional(11)); } TEST(CheckedArithmetic, CheckedMul) { - int64_t Out; const int64_t Max = std::numeric_limits::max(); const int64_t Min = std::numeric_limits::min(); - EXPECT_EQ(checkedMul(Max, 2, &Out), true); - EXPECT_EQ(checkedMul(Max, Max, &Out), true); - EXPECT_EQ(checkedMul(Min, 2, &Out), true); - EXPECT_EQ(checkedMul(10, 2, &Out), false); - EXPECT_EQ(Out, 20); + EXPECT_EQ(checkedMul(Max, 2), None); + EXPECT_EQ(checkedMul(Max, Max), None); + EXPECT_EQ(checkedMul(Min, 2), None); + EXPECT_EQ(checkedMul(10, 2), Optional(20)); } TEST(CheckedArithmetic, CheckedMulSmall) { - int16_t Out; const int16_t Max = std::numeric_limits::max(); const int16_t Min = std::numeric_limits::min(); - EXPECT_EQ(checkedMul(Max, 2, &Out), true); - EXPECT_EQ(checkedMul(Max, Max, &Out), true); - EXPECT_EQ(checkedMul(Min, 2, &Out), true); - EXPECT_EQ(checkedMul(10, 2, &Out), false); - EXPECT_EQ(Out, 20); + EXPECT_EQ(checkedMul(Max, 2), None); + EXPECT_EQ(checkedMul(Max, Max), None); + EXPECT_EQ(checkedMul(Min, 2), None); + EXPECT_EQ(checkedMul(10, 2), Optional(20)); } TEST(CheckedArithmetic, CheckedAddUnsigned) { - uint64_t Out; const uint64_t Max = std::numeric_limits::max(); - EXPECT_EQ(checkedAddUnsigned(Max, Max, &Out), true); - EXPECT_EQ(checkedAddUnsigned(Max, 1, &Out), true); - EXPECT_EQ(checkedAddUnsigned(10, 1, &Out), false); - EXPECT_EQ(Out, uint64_t(11)); + EXPECT_EQ(checkedAddUnsigned(Max, Max), None); + EXPECT_EQ(checkedAddUnsigned(Max, 1), None); + EXPECT_EQ(checkedAddUnsigned(10, 1), Optional(11)); } TEST(CheckedArithmetic, CheckedMulUnsigned) { - uint64_t Out; const uint64_t Max = std::numeric_limits::max(); - EXPECT_EQ(checkedMulUnsigned(Max, 2, &Out), true); - EXPECT_EQ(checkedMulUnsigned(Max, Max, &Out), true); - EXPECT_EQ(checkedMulUnsigned(10, 2, &Out), false); - EXPECT_EQ(Out, uint64_t(20)); + EXPECT_EQ(checkedMulUnsigned(Max, 2), llvm::None); + EXPECT_EQ(checkedMulUnsigned(Max, Max), llvm::None); + EXPECT_EQ(checkedMulUnsigned(10, 2), Optional(20)); } -- cgit v1.2.3