diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-04-10 20:37:51 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-04-10 20:37:51 +0300 |
| commit | 4c6be9cb63ff66ce49a6f733c1e00d1889f2c95f (patch) | |
| tree | 898854069101e6616620e2bd732a48e5eca08fd2 /include/apos/unaligned.h | |
| parent | 8aa17b12f29536ea9c8b6ca22c7f153e8d90fa3b (diff) | |
| download | kmi-4c6be9cb63ff66ce49a6f733c1e00d1889f2c95f.tar.gz kmi-4c6be9cb63ff66ce49a6f733c1e00d1889f2c95f.zip | |
add basic ubsan and fix issues reported by it
Diffstat (limited to 'include/apos/unaligned.h')
| -rw-r--r-- | include/apos/unaligned.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/include/apos/unaligned.h b/include/apos/unaligned.h new file mode 100644 index 0000000..1dbd253 --- /dev/null +++ b/include/apos/unaligned.h @@ -0,0 +1,67 @@ +#ifndef APOS_UNALIGNED_H +#define APOS_UNALIGNED_H + +#include <apos/types.h> +#include <apos/attrs.h> + +#define get_unaligned(ptr) \ + _Generic(*(ptr), uint8_t \ + : __get_unaligned_uint8_t, uint16_t \ + : __get_unaligned_uint16_t, uint32_t \ + : __get_unaligned_uint32_t, uint64_t \ + : __get_unaligned_uint64_t, int8_t \ + : __get_unaligned_int8_t, int16_t \ + : __get_unaligned_int16_t, int32_t \ + : __get_unaligned_int32_t, int64_t \ + : __get_unaligned_int64_t)((void *)ptr) + +#define put_unaligned(val, ptr) \ + _Generic(*(ptr), uint8_t \ + : __put_unaligned_uint8_t, uint16_t \ + : __put_unaligned_uint16_t, uint32_t \ + : __put_unaligned_uint32_t, uint64_t \ + : __put_unaligned_uint64_t, int8_t \ + : __put_unaligned_int8_t, int16_t \ + : __put_unaligned_int16_t, int32_t \ + : __put_unaligned_int32_t, int64_t \ + : __put_unaligned_int64_t)(val, (void *)ptr) + +#define DEFINE_GET(type) \ + static inline type __get_unaligned_##type(void *ptr) \ + { \ + const struct __packed { \ + type x; \ + } *__pptr = ptr; \ + return __pptr->x; \ + } + +DEFINE_GET(uint8_t); +DEFINE_GET(uint16_t); +DEFINE_GET(uint32_t); +DEFINE_GET(uint64_t); +DEFINE_GET(int8_t); +DEFINE_GET(int16_t); +DEFINE_GET(int32_t); +DEFINE_GET(int64_t); + +#undef DEFINE_GET + +#define DEFINE_PUT(type) \ + static inline void __put_unaligned_##type(type val, void *ptr) \ + { \ + struct __packed { \ + type x; \ + } *__pptr = ptr; \ + __pptr->x = val; \ + } + +DEFINE_PUT(uint8_t); +DEFINE_PUT(uint16_t); +DEFINE_PUT(uint32_t); +DEFINE_PUT(uint64_t); +DEFINE_PUT(int8_t); +DEFINE_PUT(int16_t); +DEFINE_PUT(int32_t); +DEFINE_PUT(int64_t); + +#endif /* APOS_UNALIGNED_H */ |
