diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-02-20 12:06:28 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-02-20 12:06:28 +0100 |
| commit | a445d8f1ad028f5ffcf17cf394574267e55c6e3c (patch) | |
| tree | 664e79b8cdd2954bb2536aef15c2d5a8052d789f | |
| parent | c22d020db0cf1fe946847b890f5bfa70346e46d0 (diff) | |
| download | vis-a445d8f1ad028f5ffcf17cf394574267e55c6e3c.tar.gz vis-a445d8f1ad028f5ffcf17cf394574267e55c6e3c.tar.xz | |
util: add overflow safe unsigned addition function
| -rw-r--r-- | util.h | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -1,6 +1,9 @@ #ifndef UTIL_H #define UTIL_H +#include <stdint.h> +#include <stdbool.h> + #define LENGTH(x) ((int)(sizeof (x) / sizeof *(x))) #define MIN(a, b) ((a) > (b) ? (b) : (a)) #define MAX(a, b) ((a) < (b) ? (b) : (a)) @@ -9,4 +12,15 @@ #define ISUTF8(c) (((c)&0xC0)!=0x80) #define ISASCII(ch) ((unsigned char)ch < 0x80) +#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000 +#define addu __builtin_add_overflow +#else +static inline bool addu(size_t a, size_t b, size_t *c) { + if (SIZE_MAX - a < b) + return false; + *c = a + b; + return true; +} +#endif + #endif |
