re PR sanitizer/55435 ([asan] implement an attribute to disable asan instrumentation...
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Nov 2012 09:02:28 +0000 (10:02 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 23 Nov 2012 09:02:28 +0000 (10:02 +0100)
PR sanitizer/55435
* c-common.c (handle_no_address_safety_analysis_attribute): New
function.
(c_common_attribute_table): Add no_address_safety_analysis.

* asan.c (gate_asan): Don't instrument functions with
no_address_safety_analysis attribute.
(gate_asan_O0): Use !optimize && gate_asan ().
* doc/extend.texi (no_address_safety_analysis): Document new
function attribute.

* c-c++-common/asan/attrib-1.c: New test.

From-SVN: r193748

gcc/ChangeLog
gcc/asan.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/asan/attrib-1.c [new file with mode: 0644]

index 258bed5e264b92707291fe40a4f6c51a123e3b70..6a146e0279fdb1b6573add7755020b2b862460e8 100644 (file)
@@ -1,3 +1,12 @@
+2012-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/55435
+       * asan.c (gate_asan): Don't instrument functions with
+       no_address_safety_analysis attribute.
+       (gate_asan_O0): Use !optimize && gate_asan ().
+       * doc/extend.texi (no_address_safety_analysis): Document new
+       function attribute.
+
 2012-11-22  Teresa Johnson  <tejohnson@google.com>
            Jan Hubicka  <jh@suse.cz>
 
index bd90e0a54d55369449f66a36d980540eb3e3075d..26c4178a9f073d2a69a019d7fac60f39e5b75feb 100644 (file)
@@ -1587,7 +1587,9 @@ asan_instrument (void)
 static bool
 gate_asan (void)
 {
-  return flag_asan != 0;
+  return flag_asan != 0
+         && !lookup_attribute ("no_address_safety_analysis",
+                               DECL_ATTRIBUTES (current_function_decl));
 }
 
 struct gimple_opt_pass pass_asan =
@@ -1614,7 +1616,7 @@ struct gimple_opt_pass pass_asan =
 static bool
 gate_asan_O0 (void)
 {
-  return flag_asan != 0 && !optimize;
+  return !optimize && gate_asan ();
 }
 
 struct gimple_opt_pass pass_asan_O0 =
index 29386629437c0e94e6dffece78c1b982ca26fc36..ce794a2927322f9d1ca523b071bffef1678cc77d 100644 (file)
@@ -1,3 +1,10 @@
+2012-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/55435
+       * c-common.c (handle_no_address_safety_analysis_attribute): New
+       function.
+       (c_common_attribute_table): Add no_address_safety_analysis.
+
 2012-11-16  Simon Baldwin  <simonb@google.com>
 
        * c.opt: Add f[no-]canonical-system-headers.
index fac71901e0f4ad640b4af01e6d4df83d93aeafa3..0c9cccd3146a8cd2eb357f855fd0112f119fbc89 100644 (file)
@@ -309,6 +309,8 @@ static tree handle_common_attribute (tree *, tree, tree, int, bool *);
 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
 static tree handle_hot_attribute (tree *, tree, tree, int, bool *);
 static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
+static tree handle_no_address_safety_analysis_attribute (tree *, tree, tree,
+                                                        int, bool *);
 static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
 static tree handle_noclone_attribute (tree *, tree, tree, int, bool *);
 static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
@@ -711,6 +713,10 @@ const struct attribute_spec c_common_attribute_table[] =
                              handle_cold_attribute, false },
   { "hot",                    0, 0, true,  false, false,
                              handle_hot_attribute, false },
+  { "no_address_safety_analysis",
+                             0, 0, true, false, false,
+                             handle_no_address_safety_analysis_attribute,
+                             false },
   { "warning",               1, 1, true,  false, false,
                              handle_error_attribute, false },
   { "error",                 1, 1, true,  false, false,
@@ -6482,6 +6488,22 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
   return NULL_TREE;
 }
 
+/* Handle a "no_address_safety_analysis" attribute; arguments as in
+   struct attribute_spec.handler.  */
+
+static tree
+handle_no_address_safety_analysis_attribute (tree *node, tree name, tree, int,
+                                            bool *no_add_attrs)
+{
+  if (TREE_CODE (*node) != FUNCTION_DECL)
+    {
+      warning (OPT_Wattributes, "%qE attribute ignored", name);
+      *no_add_attrs = true;
+    }
+
+  return NULL_TREE;
+}
+
 /* Handle a "noinline" attribute; arguments as in
    struct attribute_spec.handler.  */
 
index 577643eee2f0cd09113a2c919a3dd7e55820177b..f34f0f955e94a415bf17de620274ca4acfd38045 100644 (file)
@@ -2130,10 +2130,11 @@ attributes are currently defined for functions on all targets:
 @code{weak}, @code{malloc}, @code{alias}, @code{ifunc},
 @code{warn_unused_result}, @code{nonnull}, @code{gnu_inline},
 @code{externally_visible}, @code{hot}, @code{cold}, @code{artificial},
-@code{error} and @code{warning}.  Several other attributes are defined
-for functions on particular target systems.  Other attributes,
-including @code{section} are supported for variables declarations
-(@pxref{Variable Attributes}) and for types (@pxref{Type Attributes}).
+@code{no_address_safety_analysis}, @code{error} and @code{warning}.
+Several other attributes are defined for functions on particular
+target systems.  Other attributes, including @code{section} are
+supported for variables declarations (@pxref{Variable Attributes})
+and for types (@pxref{Type Attributes}).
 
 GCC plugins may provide their own attributes.
 
@@ -3416,6 +3417,12 @@ with computed goto or @code{asm goto}.
 The @code{cold} attribute on labels is not implemented in GCC versions
 earlier than 4.8.
 
+@item no_address_safety_analysis
+@cindex @code{no_address_safety_analysis} function attribute
+The @code{no_address_safety_analysis} attribute on functions is used
+to inform the compiler that it should not instrument memory accesses
+in the function when compiling with the @option{-fsanitize=address} option.
+
 @item regparm (@var{number})
 @cindex @code{regparm} attribute
 @cindex functions that are passed arguments in registers on the 386
index 788266ffcee2102aa369f328e8c9c06fc5d02e6f..e3214b1380cac2dead07772711a2846d24c2ea1c 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/55435
+       * c-c++-common/asan/attrib-1.c: New test.
+
 2012-11-22  Ian Bolton  <ian.bolton@arm.com>
 
        * gcc.target/aarch64/builtin-bswap-1.c: New test.
diff --git a/gcc/testsuite/c-c++-common/asan/attrib-1.c b/gcc/testsuite/c-c++-common/asan/attrib-1.c
new file mode 100644 (file)
index 0000000..e633bb6
--- /dev/null
@@ -0,0 +1,34 @@
+/* PR sanitizer/55435 */
+/* { dg-do compile } */
+
+__attribute__((no_address_safety_analysis)) int
+f1 (int *p, int *q)
+{
+  *p = 42;
+  return *q;
+}
+
+void f2 (char *);
+void f2 (char *) __attribute__((no_address_safety_analysis));
+void f2 (char *) __attribute__((no_address_safety_analysis));
+void f2 (char *);
+
+void
+f2 (char *p)
+{
+  *p = 42;
+}
+
+void f3 (short *);
+__typeof (f3) f3  __attribute__((__no_address_safety_analysis__));
+
+void
+f3 (short *p)
+{
+  *p = 42;
+}
+
+int v __attribute__((no_address_safety_analysis)); /* { dg-warning "attribute ignored" } */
+
+/* { dg-final { scan-assembler-not "__asan_report_store" } } */
+/* { dg-final { scan-assembler-not "__asan_report_load" } } */