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
This commit is contained in:
parent
b131b58397
commit
77bc513213
7 changed files with 92 additions and 6 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
34
gcc/testsuite/c-c++-common/asan/attrib-1.c
Normal file
34
gcc/testsuite/c-c++-common/asan/attrib-1.c
Normal file
|
@ -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" } } */
|
Loading…
Add table
Reference in a new issue