Add sparse annotations for endianness checking
authorEric Biggers <ebiggers3@gmail.com>
Thu, 7 Aug 2014 02:48:41 +0000 (21:48 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Thu, 7 Aug 2014 02:48:41 +0000 (21:48 -0500)
include/wimlib/compiler.h
include/wimlib/endianness.h
include/wimlib/types.h

index fd8942f15bf025bec6aa5485fcfadc07402d2096..567f07d074007bdd11566f3508dc245feda19e2d 100644 (file)
 #      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 */
index 257261662609fae06f8a49acdc20da3fb26e4526..4c1b239fc780a65646bad3dea43ba9938520432c 100644 (file)
@@ -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 */
 
index 65c141896b131e6e84f7bfb24d643a5816c29784..0b53376771d1f6ddbd6c07a5e6096134edb8826d 100644 (file)
@@ -2,6 +2,7 @@
 #define _WIMLIB_TYPES_H
 
 #include "wimlib_tchar.h"
+#include "wimlib/compiler.h"
 
 #include <inttypes.h>
 #include <stdbool.h>
@@ -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