]> git.eshelyaron.com Git - emacs.git/commitdiff
Suppress sanitizer errors about pointer arithmetic in a few places
authorPhilipp Stephani <phst@google.com>
Sat, 1 Aug 2020 14:58:06 +0000 (16:58 +0200)
committerPhilipp Stephani <phst@google.com>
Sat, 1 Aug 2020 15:01:00 +0000 (17:01 +0200)
We perform weird pointer arithmetic due to the layout of Lisp_Objects
holding symbols.  ASan/UBSan warns about that (Bug#42530).  Suppress
the warnings by performing the arithmetic on integer types and casting
back to pointers.

* src/alloc.c (mark_maybe_object, mark_memory): Temporarily cast
pointer to 'intptr_t'.

src/alloc.c

index 76bb20876b040e2db2a5000f5aec4f9859f4d1fd..5b9c6e4eb1f96203267e6e4c5e5f7ec7db95bdbc 100644 (file)
@@ -4638,7 +4638,8 @@ mark_maybe_object (Lisp_Object obj)
       break;
     }
 
-  void *po = (char *) XLP (obj) + (offset - LISP_WORD_TAG (type_tag));
+  void *po = (char *) ((intptr_t) (char *) XLP (obj)
+                       + (offset - LISP_WORD_TAG (type_tag)));
 
   /* If the pointer is in the dump image and the dump has a record
      of the object starting at the place where the pointer points, we
@@ -4849,7 +4850,7 @@ mark_memory (void const *start, void const *end)
         On a host with 32-bit pointers and 64-bit Lisp_Objects,
         a Lisp_Object might be split into registers saved into
         non-adjacent words and P might be the low-order word's value.  */
-      p += (intptr_t) lispsym;
+      p = (char *) ((intptr_t) p + (intptr_t) lispsym);
       mark_maybe_pointer (p);
 
       verify (alignof (Lisp_Object) % GC_POINTER_ALIGNMENT == 0);