On 12/21/21 12:01, Dumitru Ceara wrote:
UB Sanitizer was flagging OBJECT_CONTAINING() as undefined behavior
due to the way it's used when iterating through collections, e.g.,
HMAP_FOR_EACH_INIT().  However, in such cases we don't actually
dereference the pointer, we just use its value.  Avoid the undefined
behavior by casting to 'void *' first.

Signed-off-by: Dumitru Ceara <[email protected]>
---
  include/openvswitch/util.h |    2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/openvswitch/util.h b/include/openvswitch/util.h
index 228b185c3a5f..cfbd5f1a3375 100644
--- a/include/openvswitch/util.h
+++ b/include/openvswitch/util.h
@@ -128,7 +128,7 @@ OVS_NO_RETURN void ovs_assert_failure(const char *, const 
char *, const char *);
   * from the type of '*OBJECT'. */
  #define OBJECT_CONTAINING(POINTER, OBJECT, MEMBER)                      \
      ((OVS_TYPEOF(OBJECT)) (void *)                                      \
-     ((char *) (POINTER) - OBJECT_OFFSETOF(OBJECT, MEMBER)))
+     ((uintptr_t)(void *)(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

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


I've been looking into UB recently and I agree: moving from pointer to integer arithmetics _can_ relax some restrictions that the compiler enforces on pointers, so the patch looks good to me.

There are more pointer arithmetics that can be replaced with "uintptr_t" in util.h. Do you plan to replace all of them? If not, I can do it in a series I'm preparing that also addresses UB on this macros.


--
Adrián Moreno

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to