Patchwork Add no_sanitize_address attribute (PR sanitizer/56454)

login
register
mail settings
Submitter Jakub Jelinek
Date Feb. 28, 2013, 8:15 p.m.
Message ID <20130228201551.GZ12913@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/224180/
State New
Headers show

Comments

Jakub Jelinek - Feb. 28, 2013, 8:15 p.m.
Hi!

I'm not very happy about the renaming of the attribute, but it happened
in clang already, so here is a patch to do the same in gcc too.
The old name of the attribute is recognized too for compatibility e.g.
with code written for clang 3.[12] sanitizer, and during attribute parsing
changed into no_sanitize_address attribute which asan.c later tests.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2013-02-28  Konstantin Serebryany  <konstantin.s.serebryany@gmail.com>
	    Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/56454
	* asan.c (gate_asan): Lookup no_sanitize_address instead of
	no_address_safety_analysis attribute.
	* doc/extend.texi (no_address_safety_attribute): Rename to
	no_sanitize_address attribute, mention no_address_safety_analysis
	attribute as deprecated alias.

	* c-common.c (handle_no_sanitize_address_attribute): New function.
	(c_common_attribute_table): Add no_sanitize_address attribute.
	(handle_no_address_safety_analysis_attribute): Add
	no_sanitize_address attribute, not no_address_safety_analysis
	attribute.

	* g++.dg/asan/default-options-1.C (__asan_default_options): Use
	no_sanitize_address attribute rather than no_address_safety_analysis.
	* g++.dg/asan/sanitizer_test_utils.h
	(ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS): Likewise.
	* c-c++-common/asan/attrib-1.c: Test no_sanitize_address attribute
	in addition to no_address_safety_analysis.


	Jakub
Dodji Seketeli - Feb. 28, 2013, 9:17 p.m.
Jakub Jelinek <jakub@redhat.com> writes:

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2013-02-28  Konstantin Serebryany  <konstantin.s.serebryany@gmail.com>
> 	    Jakub Jelinek  <jakub@redhat.com>
>
> 	PR sanitizer/56454
> 	* asan.c (gate_asan): Lookup no_sanitize_address instead of
> 	no_address_safety_analysis attribute.
> 	* doc/extend.texi (no_address_safety_attribute): Rename to
> 	no_sanitize_address attribute, mention no_address_safety_analysis
> 	attribute as deprecated alias.
>
> 	* c-common.c (handle_no_sanitize_address_attribute): New function.
> 	(c_common_attribute_table): Add no_sanitize_address attribute.
> 	(handle_no_address_safety_analysis_attribute): Add
> 	no_sanitize_address attribute, not no_address_safety_analysis
> 	attribute.
>
> 	* g++.dg/asan/default-options-1.C (__asan_default_options): Use
> 	no_sanitize_address attribute rather than no_address_safety_analysis.
> 	* g++.dg/asan/sanitizer_test_utils.h
> 	(ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS): Likewise.
> 	* c-c++-common/asan/attrib-1.c: Test no_sanitize_address attribute
> 	in addition to no_address_safety_analysis.

This OK, thanks.

Patch

--- gcc/asan.c.jj	2013-02-18 16:39:55.600894178 +0100
+++ gcc/asan.c	2013-02-28 17:29:07.520363403 +0100
@@ -2278,6 +2278,6 @@  gate_asan (void)
 {
   return flag_asan != 0
-	  && !lookup_attribute ("no_address_safety_analysis",
+	  && !lookup_attribute ("no_sanitize_address",
 				DECL_ATTRIBUTES (current_function_decl));
 }
 
--- gcc/c-family/c-common.c.jj	2013-02-19 07:40:00.348377798 +0100
+++ gcc/c-family/c-common.c	2013-02-28 18:01:59.549869867 +0100
@@ -307,8 +307,10 @@  static tree handle_common_attribute (tre
 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_sanitize_address_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 *);
@@ -715,6 +717,9 @@  const struct attribute_spec c_common_att
 			      0, 0, true, false, false,
 			      handle_no_address_safety_analysis_attribute,
 			      false },
+  { "no_sanitize_address",    0, 0, true, false, false,
+			      handle_no_sanitize_address_attribute,
+			      false },
   { "warning",		      1, 1, true,  false, false,
 			      handle_error_attribute, false },
   { "error",		      1, 1, true,  false, false,
@@ -6505,12 +6510,12 @@  handle_cold_attribute (tree *node, tree
   return NULL_TREE;
 }
 
-/* Handle a "no_address_safety_analysis" attribute; arguments as in
+/* Handle a "no_sanitize_address" 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)
+handle_no_sanitize_address_attribute (tree *node, tree name, tree, int,
+				      bool *no_add_attrs)
 {
   if (TREE_CODE (*node) != FUNCTION_DECL)
     {
@@ -6521,6 +6526,23 @@  handle_no_address_safety_analysis_attrib
   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);
+  else if (!lookup_attribute ("no_sanitize_address", DECL_ATTRIBUTES (*node)))
+    DECL_ATTRIBUTES (*node)
+      = tree_cons (get_identifier ("no_sanitize_address"),
+		   NULL_TREE, DECL_ATTRIBUTES (*node));
+  *no_add_attrs = true;
+  return NULL_TREE;
+}
+
 /* Handle a "noinline" attribute; arguments as in
    struct attribute_spec.handler.  */
 
--- gcc/doc/extend.texi.jj	2013-02-25 15:25:43.897463673 +0100
+++ gcc/doc/extend.texi	2013-02-28 17:31:40.789468660 +0100
@@ -2133,7 +2133,8 @@  attributes are currently defined for fun
 @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{no_address_safety_analysis}, @code{error} and @code{warning}.
+@code{no_sanitize_address}, @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})
@@ -3432,11 +3433,15 @@  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
+@item no_sanitize_address
+@itemx no_address_safety_analysis
+@cindex @code{no_sanitize_address} function attribute
+The @code{no_sanitize_address} 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.
+The @code{no_address_safety_analysis} is a deprecated alias of the
+@code{no_sanitize_address} attribute, new code should use
+@code{no_sanitize_address}.
 
 @item regparm (@var{number})
 @cindex @code{regparm} attribute
--- gcc/testsuite/g++.dg/asan/default-options-1.C.jj	2012-12-13 00:02:50.644073632 +0100
+++ gcc/testsuite/g++.dg/asan/default-options-1.C	2013-02-28 17:29:07.591362989 +0100
@@ -3,7 +3,7 @@ 
 const char *kAsanDefaultOptions="verbosity=1 foo=bar";
 
 extern "C"
-__attribute__((no_address_safety_analysis))
+__attribute__((no_sanitize_address))
 const char *__asan_default_options() {
   return kAsanDefaultOptions;
 }
--- gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h.jj	2013-02-14 09:38:05.744773391 +0100
+++ gcc/testsuite/g++.dg/asan/sanitizer_test_utils.h	2013-02-28 17:29:07.596362955 +0100
@@ -36,7 +36,7 @@  typedef __int64          int64_t;
 
 #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
 # define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
-    __attribute__((no_address_safety_analysis))
+    __attribute__((no_sanitize_address))
 #else
 # define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
 #endif
--- gcc/testsuite/c-c++-common/asan/attrib-1.c.jj	2012-11-23 10:00:37.015136497 +0100
+++ gcc/testsuite/c-c++-common/asan/attrib-1.c	2013-02-28 18:04:32.121980030 +0100
@@ -1,7 +1,7 @@ 
 /* PR sanitizer/55435 */
 /* { dg-do compile } */
 
-__attribute__((no_address_safety_analysis)) int
+__attribute__((no_sanitize_address)) int
 f1 (int *p, int *q)
 {
   *p = 42;
@@ -9,8 +9,8 @@  f1 (int *p, int *q)
 }
 
 void f2 (char *);
-void f2 (char *) __attribute__((no_address_safety_analysis));
-void f2 (char *) __attribute__((no_address_safety_analysis));
+void f2 (char *) __attribute__((no_sanitize_address));
+void f2 (char *) __attribute__((no_sanitize_address));
 void f2 (char *);
 
 void
@@ -20,7 +20,7 @@  f2 (char *p)
 }
 
 void f3 (short *);
-__typeof (f3) f3  __attribute__((__no_address_safety_analysis__));
+__typeof (f3) f3  __attribute__((__no_sanitize_address__));
 
 void
 f3 (short *p)
@@ -28,7 +28,35 @@  f3 (short *p)
   *p = 42;
 }
 
-int v __attribute__((no_address_safety_analysis)); /* { dg-warning "attribute ignored" } */
+__attribute__((no_sanitize_address)) int
+f4 (int *p, int *q)
+{
+  *p = 42;
+  return *q;
+}
+
+void f5 (char *);
+void f5 (char *) __attribute__((no_sanitize_address));
+void f5 (char *) __attribute__((no_sanitize_address));
+void f5 (char *);
+
+void
+f5 (char *p)
+{
+  *p = 42;
+}
+
+void f6 (short *);
+__typeof (f6) f6  __attribute__((__no_address_safety_analysis__));
+
+void
+f6 (short *p)
+{
+  *p = 42;
+}
+
+int v __attribute__((no_sanitize_address)); /* { dg-warning "attribute ignored" } */
+int v2 __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" } } */