diff options
| author | Paul Eggert | 2018-05-18 15:45:42 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-05-18 15:49:48 -0700 |
| commit | a1c925fd41818cb8ad209762739b220efb919d1e (patch) | |
| tree | 4d3c95a065057114a49a9a3435d26479a086d8a1 /src/alloc.c | |
| parent | f4d9fd3dd45f767eca33fbf1beee40da790fa74e (diff) | |
| download | emacs-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.c | 32 |
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 | |||
| 516 | static char * ATTRIBUTE_NO_SANITIZE_UNDEFINED ATTRIBUTE_UNUSED | ||
| 517 | PNTR_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 | ||
| 520 | static ATTRIBUTE_UNUSED void * | 536 | static ATTRIBUTE_UNUSED void * |