[PATCH xserver 1/1] list: Use offsetof() to determine member offsets within a structure

Jeremy Huddleston Sequoia jeremyhu at apple.com
Tue Aug 28 10:38:08 PDT 2012


Some compilers have difficulty with the previous implementation which
relies on undefined behavior according to the C standard.  Using
offsetof() from <stddef.h> (which most likely just uses
__builtin_offsetof on modern compilers) allows us to accomplish this
without ambiguity.

Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
---
 include/list.h | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/include/list.h b/include/list.h
index d54a207..ae5431c 100644
--- a/include/list.h
+++ b/include/list.h
@@ -26,6 +26,8 @@
 #ifndef _XORG_LIST_H_
 #define _XORG_LIST_H_
 
+#include <stddef.h> /* offsetof() */
+
 /**
  * @file Classic doubly-link circular list implementation.
  * For real usage examples of the linked list, see the file test/list.c
@@ -232,7 +234,7 @@ xorg_list_is_empty(struct xorg_list *head)
  */
 #ifndef container_of
 #define container_of(ptr, type, member) \
-    (type *)((char *)(ptr) - (char *) &((type *)0)->member)
+    (type *)((char *)(ptr) - (char *) offsetof(type, member))
 #endif
 
 /**
@@ -271,9 +273,9 @@ xorg_list_is_empty(struct xorg_list *head)
 #define xorg_list_last_entry(ptr, type, member) \
     xorg_list_entry((ptr)->prev, type, member)
 
-#define __container_of(ptr, sample, member)				\
-    (void *)((char *)(ptr)						\
-	     - ((char *)&(sample)->member - (char *)(sample)))
+#define __container_of(ptr, sample, member)			\
+    container_of(ptr, typeof(*sample), member)
+
 /**
  * Loop through the list given by head and set pos to struct in the list.
  *
-- 
1.7.11.5



More information about the xorg-devel mailing list