asan.c (set_sanitized_sections): New function.
authorYury Gribov <y.gribov@samsung.com>
Fri, 17 Apr 2015 07:51:02 +0000 (07:51 +0000)
committerYury Gribov <ygribov@gcc.gnu.org>
Fri, 17 Apr 2015 07:51:02 +0000 (07:51 +0000)
2015-04-17  Yury Gribov  <y.gribov@samsung.com>

gcc/
* asan.c (set_sanitized_sections): New function.
(section_sanitized_p): Ditto.
(asan_protect_global): Optionally sanitize user-defined
sections.
* asan.h (set_sanitized_sections): Declare new function.
* common.opt (fsanitize-sections): New option.
* doc/invoke.texi (-fsanitize-sections): Document new option.
* opts-global.c (handle_common_deferred_options): Handle new
option.

gcc/testsuite/
* c-c++-common/asan/user-section-1.c: New test.

From-SVN: r222168

gcc/ChangeLog
gcc/asan.c
gcc/asan.h
gcc/common.opt
gcc/doc/invoke.texi
gcc/opts-global.c
gcc/testsuite/ChangeLog

index d572d49..523ad74 100644 (file)
@@ -1,3 +1,15 @@
+2015-04-17  Yury Gribov  <y.gribov@samsung.com>
+
+       * asan.c (set_sanitized_sections): New function.
+       (section_sanitized_p): Ditto.
+       (asan_protect_global): Optionally sanitize user-defined
+       sections.
+       * asan.h (set_sanitized_sections): Declare new function.
+       * common.opt (fsanitize-sections): New option.
+       * doc/invoke.texi (-fsanitize-sections): Document new option.
+       * opts-global.c (handle_common_deferred_options): Handle new
+       option.
+
 2015-04-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/65771
index 9e4a629..6706af7 100644 (file)
@@ -272,6 +272,7 @@ along with GCC; see the file COPYING3.  If not see
 
 static unsigned HOST_WIDE_INT asan_shadow_offset_value;
 static bool asan_shadow_offset_computed;
+static const char *sanitized_sections;
 
 /* Sets shadow offset to value in string VAL.  */
 
@@ -294,6 +295,33 @@ set_asan_shadow_offset (const char *val)
   return true;
 }
 
+/* Set list of user-defined sections that need to be sanitized.  */
+
+void
+set_sanitized_sections (const char *secs)
+{
+  sanitized_sections = secs;
+}
+
+/* Checks whether section SEC should be sanitized.  */
+
+static bool
+section_sanitized_p (const char *sec)
+{
+  if (!sanitized_sections)
+    return false;
+  size_t len = strlen (sec);
+  const char *p = sanitized_sections;
+  while ((p = strstr (p, sec)))
+    {
+      if ((p == sanitized_sections || p[-1] == ',')
+         && (p[len] == 0 || p[len] == ','))
+       return true;
+      ++p;
+    }
+  return false;
+}
+
 /* Returns Asan shadow offset.  */
 
 static unsigned HOST_WIDE_INT
@@ -1374,7 +1402,8 @@ asan_protect_global (tree decl)
         to be an array of such vars, putting padding in there
         breaks this assumption.  */
       || (DECL_SECTION_NAME (decl) != NULL
-         && !symtab_node::get (decl)->implicit_section)
+         && !symtab_node::get (decl)->implicit_section
+         && !section_sanitized_p (DECL_SECTION_NAME (decl)))
       || DECL_SIZE (decl) == 0
       || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
       || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
index 51fd9cc..10ffaca 100644 (file)
@@ -79,6 +79,8 @@ asan_red_zone_size (unsigned int size)
 
 extern bool set_asan_shadow_offset (const char *);
 
+extern void set_sanitized_sections (const char *);
+
 /* Return TRUE if builtin with given FCODE will be intercepted by
    libasan.  */
 
index b49ac46..380848c 100644 (file)
@@ -897,6 +897,11 @@ fasan-shadow-offset=
 Common Joined RejectNegative Var(common_deferred_options) Defer
 -fasan-shadow-offset=<number>  Use custom shadow memory offset.
 
+fsanitize-sections=
+Common Joined RejectNegative Var(common_deferred_options) Defer
+-fsanitize-sections=<sec1,sec2,...>    Sanitize global variables
+in user-defined sections.
+
 fsanitize-recover=
 Common Report Joined
 After diagnosing undefined behavior attempt to continue execution
index bb17385..f5f79b8 100644 (file)
@@ -301,7 +301,8 @@ Objective-C and Objective-C++ Dialects}.
 @xref{Debugging Options,,Options for Debugging Your Program or GCC}.
 @gccoptlist{-d@var{letters}  -dumpspecs  -dumpmachine  -dumpversion @gol
 -fsanitize=@var{style} -fsanitize-recover -fsanitize-recover=@var{style} @gol
--fasan-shadow-offset=@var{number} -fsanitize-undefined-trap-on-error @gol
+-fasan-shadow-offset=@var{number} -fsanitize-sections=@var{s1,s2,...} @gol
+-fsanitize-undefined-trap-on-error @gol
 -fcheck-pointer-bounds -fchkp-check-incomplete-type @gol
 -fchkp-first-field-has-own-bounds -fchkp-narrow-bounds @gol
 -fchkp-narrow-to-innermost-array -fchkp-optimize @gol
@@ -5803,6 +5804,10 @@ This option forces GCC to use custom shadow offset in AddressSanitizer checks.
 It is useful for experimenting with different shadow memory layouts in
 Kernel AddressSanitizer.
 
+@item -fsanitize-sections=@var{s1,s2,...}
+@opindex fsanitize-sections
+Sanitize global variables in selected user-defined sections.
+
 @item -fsanitize-recover@r{[}=@var{opts}@r{]}
 @opindex fsanitize-recover
 @opindex fno-sanitize-recover
index b61bdcf..1035b8d 100644 (file)
@@ -458,6 +458,10 @@ handle_common_deferred_options (void)
             error ("unrecognized shadow offset %qs", opt->arg);
          break;
 
+       case OPT_fsanitize_sections_:
+         set_sanitized_sections (opt->arg);
+         break;
+
        default:
          gcc_unreachable ();
        }
index 2bf8576..b406be4 100644 (file)
@@ -1,3 +1,7 @@
+2015-04-17  Yury Gribov  <y.gribov@samsung.com>
+
+       * c-c++-common/asan/user-section-1.c: New test.
+
 2015-04-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/65771