From: Ben Pfaff Date: Thu, 24 Feb 2011 23:33:57 +0000 (-0800) Subject: util: Avoid uninitialized pointer complaints from Coverity. X-Git-Tag: v1.1.0~214 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=4e6ca956f56b7a7f7284a4cd8788873ba57b229c;p=sliver-openvswitch.git util: Avoid uninitialized pointer complaints from Coverity. --- diff --git a/lib/util.h b/lib/util.h index 635d33153..e53398754 100644 --- a/lib/util.h +++ b/lib/util.h @@ -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