safecast.h revision 293896
1#ifndef SAFECAST_H
2#define SAFECAST_H
3
4#include <limits.h>
5static inline int size2int_chk(size_t v)
6{
7	if (v > INT_MAX)
8		abort();
9	return (int)(v);
10}
11
12static inline int size2int_sat(size_t v)
13{
14	return (v > INT_MAX) ? INT_MAX : (int)v;
15}
16
17/* Compilers can emit warning about increased alignment requirements
18 * when casting pointers. The impact is tricky: on machines where
19 * alignment is just a performance issue (x86,x64,...) this might just
20 * cause a performance penalty. On others, an address error can occur
21 * and the process dies...
22 *
23 * Still, there are many cases where the pointer arithmetic and the
24 * buffer alignment make sure this does not happen. OTOH, the compiler
25 * doesn't know this and still emits warnings.
26 *
27 * The following cast macros are going through void pointers to tell
28 * the compiler that there is no alignment requirement to watch.
29 */
30#define UA_PTR(ptype,pval) ((ptype *)(void*)(pval))
31#define UAC_PTR(ptype,pval) ((const ptype *)(const void*)(pval))
32#define UAV_PTR(ptype,pval) ((volatile ptype *)(volatile void*)(pval))
33
34#endif
35