Commit c79ac334 authored by Orvid King's avatar Orvid King Committed by Facebook Github Bot

Add a basic utility for checked addition of unsigned integers

Summary: A very basic function that if done incorrectly will get optimized away as undefined behavior. For now keep things simple and only support addition of unsigned values.

Reviewed By: yfeldblum

Differential Revision: D15609542

fbshipit-source-id: 70d5fde784f57d3d52e6122352a885d7a835f104
parent da3a4406
/*
* Copyright 2011-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <cassert>
#include <limits>
#include <type_traits>
#include <folly/Likely.h>
namespace folly {
template <typename T, typename = std::enable_if_t<std::is_unsigned<T>::value>>
bool checked_add(T* result, T a, T b) {
assert(result != nullptr);
if (FOLLY_LIKELY(a < std::numeric_limits<T>::max() - b)) {
*result = a + b;
return true;
} else {
*result = {};
return false;
}
}
} // namespace folly
/*
* Copyright 2011-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <folly/lang/CheckedMath.h>
#include <limits>
#include <folly/portability/GTest.h>
TEST(CheckedMath, checked_add_no_overflow) {
unsigned int a;
EXPECT_TRUE(folly::checked_add(&a, 5u, 4u));
EXPECT_EQ(a, 9);
}
TEST(CheckedMath, checked_add_overflow) {
unsigned int a;
EXPECT_FALSE(
folly::checked_add(&a, std::numeric_limits<unsigned int>::max(), 4u));
EXPECT_EQ(a, {});
}
TEST(CheckedMath, checked_add_size_t_overflow) {
size_t a;
EXPECT_FALSE(folly::checked_add<size_t>(
&a, std::numeric_limits<size_t>::max() - 7, 9));
EXPECT_EQ(a, {});
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment