diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-06-13 18:31:43 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-06-13 18:31:43 +0000 |
commit | ba86f98ba71d995dc8d91b2e737ee09f4d59fd14 (patch) | |
tree | de103e967e7b8ba0e355e74f36d5920d0abfd1d3 /unittests/Support/CheckedArithmeticTest.cpp | |
parent | 2a8508d8ca6c3fb3f4b33438ec6ccd7111ffe8be (diff) |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334634 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Support/CheckedArithmeticTest.cpp')
-rw-r--r-- | unittests/Support/CheckedArithmeticTest.cpp | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/unittests/Support/CheckedArithmeticTest.cpp b/unittests/Support/CheckedArithmeticTest.cpp index 7fc63498e2b..f797a9ed41e 100644 --- a/unittests/Support/CheckedArithmeticTest.cpp +++ b/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<int64_t>::max(); const int64_t Min = std::numeric_limits<int64_t>::min(); - EXPECT_EQ(checkedAdd<int64_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedAdd<int64_t>(Min, -1, &Out), true); - EXPECT_EQ(checkedAdd<int64_t>(Max, 1, &Out), true); - EXPECT_EQ(checkedAdd<int64_t>(10, 1, &Out), false); - EXPECT_EQ(Out, 11); + EXPECT_EQ(checkedAdd<int64_t>(Max, Max), None); + EXPECT_EQ(checkedAdd<int64_t>(Min, -1), None); + EXPECT_EQ(checkedAdd<int64_t>(Max, 1), None); + EXPECT_EQ(checkedAdd<int64_t>(10, 1), Optional<int64_t>(11)); } TEST(CheckedArithmetic, CheckedAddSmall) { - int16_t Out; const int16_t Max = std::numeric_limits<int16_t>::max(); const int16_t Min = std::numeric_limits<int16_t>::min(); - EXPECT_EQ(checkedAdd<int16_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedAdd<int16_t>(Min, -1, &Out), true); - EXPECT_EQ(checkedAdd<int16_t>(Max, 1, &Out), true); - EXPECT_EQ(checkedAdd<int16_t>(10, 1, &Out), false); - EXPECT_EQ(Out, 11); + EXPECT_EQ(checkedAdd<int16_t>(Max, Max), None); + EXPECT_EQ(checkedAdd<int16_t>(Min, -1), None); + EXPECT_EQ(checkedAdd<int16_t>(Max, 1), None); + EXPECT_EQ(checkedAdd<int16_t>(10, 1), Optional<int64_t>(11)); } TEST(CheckedArithmetic, CheckedMul) { - int64_t Out; const int64_t Max = std::numeric_limits<int64_t>::max(); const int64_t Min = std::numeric_limits<int64_t>::min(); - EXPECT_EQ(checkedMul<int64_t>(Max, 2, &Out), true); - EXPECT_EQ(checkedMul<int64_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedMul<int64_t>(Min, 2, &Out), true); - EXPECT_EQ(checkedMul<int64_t>(10, 2, &Out), false); - EXPECT_EQ(Out, 20); + EXPECT_EQ(checkedMul<int64_t>(Max, 2), None); + EXPECT_EQ(checkedMul<int64_t>(Max, Max), None); + EXPECT_EQ(checkedMul<int64_t>(Min, 2), None); + EXPECT_EQ(checkedMul<int64_t>(10, 2), Optional<int64_t>(20)); } TEST(CheckedArithmetic, CheckedMulSmall) { - int16_t Out; const int16_t Max = std::numeric_limits<int16_t>::max(); const int16_t Min = std::numeric_limits<int16_t>::min(); - EXPECT_EQ(checkedMul<int16_t>(Max, 2, &Out), true); - EXPECT_EQ(checkedMul<int16_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedMul<int16_t>(Min, 2, &Out), true); - EXPECT_EQ(checkedMul<int16_t>(10, 2, &Out), false); - EXPECT_EQ(Out, 20); + EXPECT_EQ(checkedMul<int16_t>(Max, 2), None); + EXPECT_EQ(checkedMul<int16_t>(Max, Max), None); + EXPECT_EQ(checkedMul<int16_t>(Min, 2), None); + EXPECT_EQ(checkedMul<int16_t>(10, 2), Optional<int16_t>(20)); } TEST(CheckedArithmetic, CheckedAddUnsigned) { - uint64_t Out; const uint64_t Max = std::numeric_limits<uint64_t>::max(); - EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1, &Out), true); - EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1, &Out), false); - EXPECT_EQ(Out, uint64_t(11)); + EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, Max), None); + EXPECT_EQ(checkedAddUnsigned<uint64_t>(Max, 1), None); + EXPECT_EQ(checkedAddUnsigned<uint64_t>(10, 1), Optional<uint64_t>(11)); } TEST(CheckedArithmetic, CheckedMulUnsigned) { - uint64_t Out; const uint64_t Max = std::numeric_limits<uint64_t>::max(); - EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2, &Out), true); - EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max, &Out), true); - EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2, &Out), false); - EXPECT_EQ(Out, uint64_t(20)); + EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, 2), llvm::None); + EXPECT_EQ(checkedMulUnsigned<uint64_t>(Max, Max), llvm::None); + EXPECT_EQ(checkedMulUnsigned<uint64_t>(10, 2), Optional<uint64_t>(20)); } |