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