mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-07 12:57:05 +00:00
integer overflow: use compiler intrinsics if supported
gcc and clang support __builtin_add_overflow, use it whenever possible, falling back to our naive routines.
This commit is contained in:
parent
8aab36a301
commit
16942c6fda
@ -17,6 +17,11 @@
|
||||
# define GIT_INLINE(type) static inline type
|
||||
#endif
|
||||
|
||||
/** Support for gcc/clang __has_builtin intrinsic */
|
||||
#ifndef __has_builtin
|
||||
# define __has_builtin(x) 0
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
@ -54,6 +54,19 @@ GIT_INLINE(bool) git__add_uint64_overflow(uint64_t *out, uint64_t one, uint64_t
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Use clang/gcc compiler intrinsics whenever possible */
|
||||
#if (SIZE_MAX == UINT_MAX) && __has_builtin(__builtin_uadd_overflow)
|
||||
# define git__add_sizet_overflow(out, one, two) \
|
||||
__builtin_uadd_overflow(one, two, out)
|
||||
# define git__multiply_sizet_overflow(out, one, two)
|
||||
__builtin_umul_overflow(one, two, out)
|
||||
#elif (SIZE_MAX == ULONG_MAX) && __has_builtin(__builtin_uaddl_overflow)
|
||||
# define git__add_sizet_overflow(out, one, two) \
|
||||
__builtin_uaddl_overflow(one, two, out)
|
||||
# define git__multiply_sizet_overflow(out, one, two) \
|
||||
__builtin_umull_overflow(one, two, out)
|
||||
#else
|
||||
|
||||
/**
|
||||
* Sets `one + two` into `out`, unless the arithmetic would overflow.
|
||||
* @return true if the result fits in a `size_t`, false on overflow.
|
||||
@ -78,4 +91,6 @@ GIT_INLINE(bool) git__multiply_sizet_overflow(size_t *out, size_t one, size_t tw
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* INCLUDE_integer_h__ */
|
||||
|
Loading…
Reference in New Issue
Block a user