utils: Add wrappers for memcpy(3), memmove(3) and memset(3)

These wrappers guarantee that calls to these functions are noops if the
number of bytes is 0, as calling them with NULL pointers is undefined
according to the C standard, even if the number of bytes is 0 (most
implementations probably ignore the pointers anyway in this case, but
lets make sure).
This commit is contained in:
Tobias Brunner
2014-06-24 15:11:27 +02:00
parent bb91109af8
commit 6d4654b9f9
+33 -1
View File
@@ -166,6 +166,39 @@ static inline bool memeq(const void *x, const void *y, size_t len)
return memcmp(x, y, len) == 0;
}
/**
* Calling memcpy() with NULL pointers, even with n == 0, results in undefined
* behavior according to the C standard. This version is guaranteed to not
* access the pointers if n is 0.
*/
static inline void *memcpy_noop(void *dst, const void *src, size_t n)
{
return n ? memcpy(dst, src, n) : dst;
}
#define memcpy(d,s,n) memcpy_noop(d,s,n)
/**
* Calling memmove() with NULL pointers, even with n == 0, results in undefined
* behavior according to the C standard. This version is guaranteed to not
* access the pointers if n is 0.
*/
static inline void *memmove_noop(void *dst, const void *src, size_t n)
{
return n ? memmove(dst, src, n) : dst;
}
#define memmove(d,s,n) memmove_noop(d,s,n)
/**
* Calling memset() with a NULL pointer, even with n == 0, results in undefined
* behavior according to the C standard. This version is guaranteed to not
* access the pointer if n is 0.
*/
static inline void *memset_noop(void *s, int c, size_t n)
{
return n ? memset(s, c, n) : s;
}
#define memset(s,c,n) memset_noop(s,c,n)
/**
* Macro gives back larger of two values.
*/
@@ -174,7 +207,6 @@ static inline bool memeq(const void *x, const void *y, size_t len)
typeof(y) _y = (y); \
_x > _y ? _x : _y; })
/**
* Macro gives back smaller of two values.
*/