aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorPaul Eggert2018-05-18 15:45:42 -0700
committerPaul Eggert2018-05-18 15:49:48 -0700
commita1c925fd41818cb8ad209762739b220efb919d1e (patch)
tree4d3c95a065057114a49a9a3435d26479a086d8a1 /src/alloc.c
parentf4d9fd3dd45f767eca33fbf1beee40da790fa74e (diff)
downloademacs-a1c925fd41818cb8ad209762739b220efb919d1e.tar.gz
emacs-a1c925fd41818cb8ad209762739b220efb919d1e.zip
Port to GCC 8 -fsanitize=undefined
In GCC 8, gcc -fsanitize=undefined flags the undefined behavior that Emacs relies on in its XPNTR and XSYMBOL low-level functions. Disable undefined sanitization in these functions. Although this disabling doesn’t suffice if DEFINE_KEY_OPS_AS_MACROS is true, it works for -fsanitize=undefined -DINLINING=0, which is good enough. * src/alloc.c (macro_PNTR_ADD): New macro. (PNTR_ADD): New function and macro. The function disables -fsanitize=undefined. (macro_XPNTR): Use it. * src/conf_post.h (ATTRIBUTE_NO_SANITIZE_UNDEFINED): New macro. * src/lisp.h (XSYMBOL): Disable -fsanitize=undefined.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 8264e0623cf..231ade5cf80 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -503,18 +503,34 @@ pointer_align (void *ptr, int alignment)
503 return (void *) ROUNDUP ((uintptr_t) ptr, alignment); 503 return (void *) ROUNDUP ((uintptr_t) ptr, alignment);
504} 504}
505 505
506/* Extract the pointer hidden within O. Define this as a function, as 506/* Define PNTR_ADD and XPNTR as functions, which are cleaner and can
507 functions are cleaner and can be used in debuggers. Also, define 507 be used in debuggers. Also, define them as macros if
508 it as a macro if being compiled with GCC without optimization, for 508 DEFINE_KEY_OPS_AS_MACROS, for performance in that case.
509 performance in that case. macro_XPNTR is private to this section 509 The macro_* macros are private to this section of code. */
510 of code. */ 510
511/* Add a pointer an an integer without complaint about a pointer going
512 out of range of the underlying array. */
513
514#define macro_PNTR_ADD(p, i) ((p) + (i))
515
516static char * ATTRIBUTE_NO_SANITIZE_UNDEFINED ATTRIBUTE_UNUSED
517PNTR_ADD (char *p, EMACS_UINT i)
518{
519 return macro_PNTR_ADD (p, i);
520}
521
522#if DEFINE_KEY_OPS_AS_MACROS
523# define PNTR_ADD(p, i) macro_PNTR_ADD (p, i)
524#endif
525
526/* Extract the pointer hidden within O. */
511 527
512#define macro_XPNTR(o) \ 528#define macro_XPNTR(o) \
513 ((void *) \ 529 ((void *) \
514 (SYMBOLP (o) \ 530 (SYMBOLP (o) \
515 ? ((char *) lispsym \ 531 ? PNTR_ADD ((char *) lispsym, \
516 - ((EMACS_UINT) Lisp_Symbol << (USE_LSB_TAG ? 0 : VALBITS)) \ 532 (XLI (o) \
517 + XLI (o)) \ 533 - ((EMACS_UINT) Lisp_Symbol << (USE_LSB_TAG ? 0 : VALBITS)))) \
518 : (char *) XLP (o) - (XLI (o) & ~VALMASK))) 534 : (char *) XLP (o) - (XLI (o) & ~VALMASK)))
519 535
520static ATTRIBUTE_UNUSED void * 536static ATTRIBUTE_UNUSED void *