aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-11-23 10:02:28 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-11-23 10:02:28 +0100
commit77bc5132136626017244cc4324c84e3210c8f4fc (patch)
tree5b2104a30f7e40b8672e50934d6b8b9c1f75ec85 /gcc
parentb131b583978ceadbe54325be3a09710a48481df2 (diff)
downloadgcc-77bc5132136626017244cc4324c84e3210c8f4fc.zip
gcc-77bc5132136626017244cc4324c84e3210c8f4fc.tar.gz
gcc-77bc5132136626017244cc4324c84e3210c8f4fc.tar.bz2
re PR sanitizer/55435 ([asan] implement an attribute to disable asan instrumentation for a particular function)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/asan.c6
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-common.c22
-rw-r--r--gcc/doc/extend.texi15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/asan/attrib-1.c34
7 files changed, 92 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 258bed5..6a146e0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/asan.c b/gcc/asan.c
index bd90e0a..26c4178 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -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 =
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 2938662..ce794a2 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index fac7190..0c9cccd 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -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. */
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 577643e..f34f0f9 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 788266f..e3214b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..e633bb6
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/asan/attrib-1.c
@@ -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" } } */