From f2d4403b993204bffba09dca31b424d158218209 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Wed, 6 Aug 2014 21:48:41 -0500 Subject: [PATCH] Add sparse annotations for endianness checking --- include/wimlib/compiler.h | 8 +++++++ include/wimlib/endianness.h | 48 ++++++++++++++++++------------------- include/wimlib/types.h | 25 +++++++++---------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/include/wimlib/compiler.h b/include/wimlib/compiler.h index fd8942f1..567f07d0 100644 --- a/include/wimlib/compiler.h +++ b/include/wimlib/compiler.h @@ -46,4 +46,12 @@ # define is_constant(x) (0) #endif /* __GNUC__ */ +#ifdef __CHECKER__ +# define _bitwise_attr __attribute__((bitwise)) +# define _force_attr __attribute__((force)) +#else +# define _bitwise_attr +# define _force_attr +#endif + #endif /* _WIMLIB_COMPILER_H */ diff --git a/include/wimlib/endianness.h b/include/wimlib/endianness.h index 25726166..4c1b239f 100644 --- a/include/wimlib/endianness.h +++ b/include/wimlib/endianness.h @@ -38,33 +38,33 @@ bswap64(u64 n) } # ifdef WORDS_BIGENDIAN -# define le16_to_cpu(n) bswap16(n) -# define le32_to_cpu(n) bswap32(n) -# define le64_to_cpu(n) bswap64(n) -# define cpu_to_le16(n) bswap16(n) -# define cpu_to_le32(n) bswap32(n) -# define cpu_to_le64(n) bswap64(n) +# define cpu_to_le16(n) ((_force_attr le16)bswap16(n)) +# define cpu_to_le32(n) ((_force_attr le32)bswap32(n)) +# define cpu_to_le64(n) ((_force_attr le64)bswap64(n)) +# define le16_to_cpu(n) bswap16((_force_attr u16)(le16)(n)) +# define le32_to_cpu(n) bswap32((_force_attr u32)(le32)(n)) +# define le64_to_cpu(n) bswap64((_force_attr u64)(le64)(n)) -# define cpu_to_be16(n) (n) -# define cpu_to_be32(n) (n) -# define cpu_to_be64(n) (n) -# define be16_to_cpu(n) (n) -# define be32_to_cpu(n) (n) -# define be64_to_cpu(n) (n) +# define cpu_to_be16(n) ((_force_attr be16)(u16)(n)) +# define cpu_to_be32(n) ((_force_attr be32)(u32)(n)) +# define cpu_to_be64(n) ((_force_attr be64)(u64)(n)) +# define be16_to_cpu(n) ((_force_attr u16)(be16)(n)) +# define be32_to_cpu(n) ((_force_attr u32)(be32)(n)) +# define be64_to_cpu(n) ((_force_attr u64)(be64)(n)) # else -# define cpu_to_le16(n) (n) -# define cpu_to_le32(n) (n) -# define cpu_to_le64(n) (n) -# define le16_to_cpu(n) (n) -# define le32_to_cpu(n) (n) -# define le64_to_cpu(n) (n) +# define cpu_to_le16(n) ((_force_attr le16)(u16)(n)) +# define cpu_to_le32(n) ((_force_attr le32)(u32)(n)) +# define cpu_to_le64(n) ((_force_attr le64)(u64)(n)) +# define le16_to_cpu(n) ((_force_attr u16)(le16)(n)) +# define le32_to_cpu(n) ((_force_attr u32)(le32)(n)) +# define le64_to_cpu(n) ((_force_attr u64)(le64)(n)) -# define be16_to_cpu(n) bswap16(n) -# define be32_to_cpu(n) bswap32(n) -# define be64_to_cpu(n) bswap64(n) -# define cpu_to_be16(n) bswap16(n) -# define cpu_to_be32(n) bswap32(n) -# define cpu_to_be64(n) bswap64(n) +# define cpu_to_be16(n) ((_force_attr be16)bswap16(n)) +# define cpu_to_be32(n) ((_force_attr be32)bswap32(n)) +# define cpu_to_be64(n) ((_force_attr be64)bswap64(n)) +# define be16_to_cpu(n) bswap16((_force_attr u16)(be16)(n)) +# define be32_to_cpu(n) bswap32((_force_attr u32)(be32)(n)) +# define be64_to_cpu(n) bswap64((_force_attr u64)(be64)(n)) # endif #endif /* _NTFS_ENDIANS_H */ diff --git a/include/wimlib/types.h b/include/wimlib/types.h index 65c14189..0b533767 100644 --- a/include/wimlib/types.h +++ b/include/wimlib/types.h @@ -2,6 +2,7 @@ #define _WIMLIB_TYPES_H #include "wimlib_tchar.h" +#include "wimlib/compiler.h" #include #include @@ -21,23 +22,23 @@ typedef int32_t s32; typedef int64_t s64; /* Unsigned little endian types of exact size */ -typedef uint8_t le8; -typedef uint16_t le16; -typedef uint32_t le32; -typedef uint64_t le64; +typedef uint8_t _bitwise_attr le8; +typedef uint16_t _bitwise_attr le16; +typedef uint32_t _bitwise_attr le32; +typedef uint64_t _bitwise_attr le64; /* Signed little endian types of exact size (declare as unsigned to avoid sign * extension on big-endian architectures) */ -typedef uint8_t sle8; -typedef uint16_t sle16; -typedef uint32_t sle32; -typedef uint64_t sle64; +typedef uint8_t _bitwise_attr sle8; +typedef uint16_t _bitwise_attr sle16; +typedef uint32_t _bitwise_attr sle32; +typedef uint64_t _bitwise_attr sle64; /* Unsigned big endian types of exact size */ -typedef uint8_t be8; -typedef uint16_t be16; -typedef uint32_t be32; -typedef uint64_t be64; +typedef uint8_t _bitwise_attr be8; +typedef uint16_t _bitwise_attr be16; +typedef uint32_t _bitwise_attr be32; +typedef uint64_t _bitwise_attr be64; #endif -- 2.43.0