8#ifndef BOTAN_UTILS_SAFE_INT_H_
9#define BOTAN_UTILS_SAFE_INT_H_
11#include <botan/exceptn.h>
12#include <botan/internal/fmt.h>
26 Exception(
fmt(
"Integer overflow detected at {}:{}", file, line))
32inline size_t checked_add(
size_t x,
size_t y,
const char* file,
int line)
34#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_add_overflow)
36 if(__builtin_add_overflow(x,
y, &z)) [[unlikely]]
37#elif defined(_MSC_VER)
39 if(SizeTAdd(x,
y, &z) != S_OK) [[unlikely]]
42 if(z < x) [[unlikely]]
52#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_add_overflow)
54 if(__builtin_mul_overflow(x,
y, &z)) [[unlikely]]
55#elif defined(_MSC_VER)
57 if(SizeTMult(x,
y, &z) != S_OK) [[unlikely]]
60 if(
y && z /
y != x) [[unlikely]]
68template<
typename RT,
typename AT>
71 RT c =
static_cast<RT
>(i);
72 if(i !=
static_cast<AT
>(c))
77#define BOTAN_CHECKED_ADD(x,y) checked_add(x,y,__FILE__,__LINE__)
78#define BOTAN_CHECKED_MUL(x,y) checked_mul(x,y)
Integer_Overflow_Detected(std::string_view file, int line)
ErrorType error_type() const noexcept override
int(* final)(unsigned char *, CTX *)
std::optional< size_t > checked_mul(size_t x, size_t y)
std::string fmt(std::string_view format, const T &... args)
size_t checked_add(size_t x, size_t y, const char *file, int line)