]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fundamental: add CAST_ALIGN_PTR() macro
authorThomas Haller <thaller@redhat.com>
Mon, 5 Dec 2022 22:11:13 +0000 (23:11 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 8 Dec 2022 16:34:20 +0000 (17:34 +0100)
src/fundamental/macro-fundamental.h

index 65c9e042cd43a1c86098e87da7b743239be1d122..db778c7609975150d8deb9ea800d9b92bc1b47c4 100644 (file)
@@ -354,6 +354,16 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
                 ((l) + (ali) - 1) & ~((ali) - 1),                      \
                 VOID_0)
 
+/* Similar to ((t *) (void *) (p)) to cast a pointer. The macro asserts that the pointer has a suitable
+ * alignment for type "t". This exists for places where otherwise "-Wcast-align=strict" would issue a
+ * warning or if you want to assert that the cast gives a pointer of suitable alignment. */
+#define CAST_ALIGN_PTR(t, p)                                    \
+        ({                                                      \
+                const void *_p = (p);                           \
+                assert(((uintptr_t) _p) % __alignof__(t) == 0); \
+                (t *) _p;                                       \
+        })
+
 #define UPDATE_FLAG(orig, flag, b)                      \
         ((b) ? ((orig) | (flag)) : ((orig) & ~(flag)))
 #define SET_FLAG(v, flag, b) \