diff options
author | Ben Pfaff <blp@nicira.com> | 2011-02-24 15:33:57 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2011-02-24 16:11:49 -0800 |
commit | 4e6ca956f56b7a7f7284a4cd8788873ba57b229c (patch) | |
tree | bee8e5b63c4de91d93bde2ec90f0e80b424edb12 /lib/util.h | |
parent | a2c6a63cc06f4edbce32b6ae5f500b89b3dcd1a6 (diff) |
util: Avoid uninitialized pointer complaints from Coverity.
Diffstat (limited to 'lib/util.h')
-rw-r--r-- | lib/util.h | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -85,6 +85,22 @@ extern const char *program_name; #define OVS_TYPEOF(OBJECT) void * #endif +/* Given OBJECT of type pointer-to-structure, expands to the offset of MEMBER + * within an instance of the structure. + * + * The GCC-specific version avoids the technicality of undefined behavior if + * OBJECT is null, invalid, or not yet initialized. This makes some static + * checkers (like Coverity) happier. But the non-GCC version does not actually + * dereference any pointer, so it would be surprising for it to cause any + * problems in practice. + */ +#ifdef __GNUC__ +#define OBJECT_OFFSETOF(OBJECT, MEMBER) offsetof(typeof(*(OBJECT)), MEMBER) +#else +#define OBJECT_OFFSETOF(OBJECT, MEMBER) \ + ((char *) &(OBJECT)->MEMBER - (char *) (OBJECT)) +#endif + /* Given POINTER, the address of the given MEMBER in a STRUCT object, returns the STRUCT object. */ #define CONTAINER_OF(POINTER, STRUCT, MEMBER) \ @@ -99,7 +115,7 @@ extern const char *program_name; * from the type of '*OBJECT'. */ #define OBJECT_CONTAINING(POINTER, OBJECT, MEMBER) \ ((OVS_TYPEOF(OBJECT)) (void *) \ - ((char *) (POINTER) - ((char *) &(OBJECT)->MEMBER - (char *) (OBJECT)))) + ((char *) (POINTER) - OBJECT_OFFSETOF(OBJECT, MEMBER))) /* Given POINTER, the address of the given MEMBER within an object of the type * that that OBJECT points to, assigns the address of the outer object to |