emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 3517da7: Port better to AddressSanitizer.


From: Paul Eggert
Subject: [Emacs-diffs] master 3517da7: Port better to AddressSanitizer.
Date: Sun, 30 Nov 2014 07:32:48 +0000

branch: master
commit 3517da701ea5d16c296745d6678988b06bee615d
Author: Paul Eggert <address@hidden>
Date:   Sat Nov 29 23:30:22 2014 -0800

    Port better to AddressSanitizer.
    
    These changes suffice for temacs on x86-64 with GCC 4.9.2 and
    -fsanitize=address.
    * alloc.c (valid_pointer_p) [ADDRESS_SANITIZER]:
    Return -1 or 0, as the pipe trick doesn't work.
    * alloc.c (relocatable_string_data_p, mark_object, sweep_symbols):
    * data.c (Ffset):
    * print.c (print_object):
    When a pointer-check primitive returns -1, do not assume this
    means the pointer is valid or that the underlying system has failed.
    It could just be that addresses are being sanitized so Emacs can't
    test for pointer validity.
    * lisp.h (defined_GC_CHECK_STRING_BYTES): New constant.
    (USE_STACK_STRING) [GC_CHECK_STRING_BYTES]: Now false, since the
    string validity checker doesn't work on stack-based strings.
---
 src/ChangeLog |   18 ++++++++++++++++++
 src/alloc.c   |   14 +++++++++-----
 src/data.c    |    2 +-
 src/lisp.h    |    7 +++++++
 src/print.c   |    6 ++++--
 5 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 668c3e8..c977eb4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,21 @@
+2014-11-30  Paul Eggert  <address@hidden>
+
+       Port better to AddressSanitizer.
+       These changes suffice for temacs on x86-64 with GCC 4.9.2 and
+       -fsanitize=address.
+       * alloc.c (valid_pointer_p) [ADDRESS_SANITIZER]:
+       Return -1 or 0, as the pipe trick doesn't work.
+       * alloc.c (relocatable_string_data_p, mark_object, sweep_symbols):
+       * data.c (Ffset):
+       * print.c (print_object):
+       When a pointer-check primitive returns -1, do not assume this
+       means the pointer is valid or that the underlying system has failed.
+       It could just be that addresses are being sanitized so Emacs can't
+       test for pointer validity.
+       * lisp.h (defined_GC_CHECK_STRING_BYTES): New constant.
+       (USE_STACK_STRING) [GC_CHECK_STRING_BYTES]: Now false, since the
+       string validity checker doesn't work on stack-based strings.
+
 2014-11-29  Paul Eggert  <address@hidden>
 
        Improve clarity of USE_LSB_TAG definition.
diff --git a/src/alloc.c b/src/alloc.c
index faad0b5..1019c2a 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -4934,6 +4934,10 @@ valid_pointer_p (void *p)
 #ifdef WINDOWSNT
   return w32_valid_pointer_p (p, 16);
 #else
+
+  if (ADDRESS_SANITIZER)
+    return p ? -1 : 0;
+
   int fd[2];
 
   /* Obviously, we cannot just access it (we would SEGV trying), so we
@@ -4949,7 +4953,7 @@ valid_pointer_p (void *p)
       return valid;
     }
 
-    return -1;
+  return -1;
 #endif
 }
 
@@ -5048,8 +5052,8 @@ relocatable_string_data_p (const char *str)
       struct sdata *sdata
        = (struct sdata *) (str - offsetof (struct sdata, data));
 
-      if (valid_pointer_p (sdata)
-         && valid_pointer_p (sdata->string)
+      if (0 < valid_pointer_p (sdata)
+         && 0 < valid_pointer_p (sdata->string)
          && maybe_lisp_pointer (sdata->string))
        return (valid_lisp_object_p
                (make_lisp_ptr (sdata->string, Lisp_String))
@@ -6364,7 +6368,7 @@ mark_object (Lisp_Object arg)
        CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
        ptr->gcmarkbit = 1;
        /* Attempt to catch bogus objects.  */
-        eassert (valid_lisp_object_p (ptr->function) >= 1);
+        eassert (valid_lisp_object_p (ptr->function));
        mark_object (ptr->function);
        mark_object (ptr->plist);
        switch (ptr->redirect)
@@ -6749,7 +6753,7 @@ sweep_symbols (void)
               ++num_used;
               sym->s.gcmarkbit = 0;
               /* Attempt to catch bogus objects.  */
-              eassert (valid_lisp_object_p (sym->s.function) >= 1);
+              eassert (valid_lisp_object_p (sym->s.function));
             }
         }
 
diff --git a/src/data.c b/src/data.c
index 9977a3a..b48dbbe 100644
--- a/src/data.c
+++ b/src/data.c
@@ -729,7 +729,7 @@ DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
 
   /* Convert to eassert or remove after GC bug is found.  In the
      meantime, check unconditionally, at a slight perf hit.  */
-  if (valid_lisp_object_p (definition) < 1)
+  if (! valid_lisp_object_p (definition))
     emacs_abort ();
 
   set_symbol_function (symbol, definition);
diff --git a/src/lisp.h b/src/lisp.h
index 42bb337..a56c4a7 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4604,6 +4604,12 @@ lisp_word_count (ptrdiff_t nbytes)
 # define USE_STACK_LISP_OBJECTS false
 #endif
 
+#ifdef GC_CHECK_STRING_BYTES
+enum { defined_GC_CHECK_STRING_BYTES = true };
+#else
+enum { defined_GC_CHECK_STRING_BYTES = false };
+#endif
+
 /* Struct inside unions that are typically no larger and aligned enough.  */
 
 union Aligned_Cons
@@ -4628,6 +4634,7 @@ enum
     USE_STACK_CONS = (USE_STACK_LISP_OBJECTS
                      && alignof (union Aligned_Cons) % GCALIGNMENT == 0),
     USE_STACK_STRING = (USE_STACK_CONS
+                       && !defined_GC_CHECK_STRING_BYTES
                        && alignof (union Aligned_String) % GCALIGNMENT == 0)
   };
 
diff --git a/src/print.c b/src/print.c
index 49331ef..7723b98 100644
--- a/src/print.c
+++ b/src/print.c
@@ -2098,14 +2098,16 @@ print_object (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag)
                for (i = 0; i < limit; i++)
                  {
                    Lisp_Object maybe = area[i];
+                   int valid = valid_lisp_object_p (maybe);
 
-                   if (valid_lisp_object_p (maybe) > 0)
+                   if (0 < valid)
                      {
                        PRINTCHAR (' ');
                        print_object (maybe, printcharfun, escapeflag);
                      }
                    else
-                     strout (" <invalid>", -1, -1, printcharfun);
+                     strout (valid ? " <some>" : " <invalid>",
+                             -1, -1, printcharfun);
                  }
                if (i == limit && i < amount)
                  strout (" ...", 4, 4, printcharfun);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]