aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-05-11 09:37:35 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-05-11 07:37:35 +0000
commit19916065b7fb26bbb36f7bbe5688ae2c1661dec3 (patch)
treef5d45b2c3debefede4370624eb06a7a8ed2947ab /gcc
parent683be2f77b3ce4db09e1175c1de4ec7f26f803e6 (diff)
downloadgcc-19916065b7fb26bbb36f7bbe5688ae2c1661dec3.zip
gcc-19916065b7fb26bbb36f7bbe5688ae2c1661dec3.tar.gz
gcc-19916065b7fb26bbb36f7bbe5688ae2c1661dec3.tar.bz2
Support LLVM style of no_sanitize attribute (PR sanitizer/85556).
2018-05-11 Martin Liska <mliska@suse.cz> PR sanitizer/85556 * doc/extend.texi: Document LLVM style format for no_sanitize attribute. 2018-05-11 Martin Liska <mliska@suse.cz> PR sanitizer/85556 * c-attribs.c (handle_no_sanitize_attribute): Iterate all TREE_LIST values. 2018-05-11 Martin Liska <mliska@suse.cz> PR sanitizer/85556 * c-c++-common/ubsan/attrib-6.c: New test. From-SVN: r260154
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-attribs.c20
-rw-r--r--gcc/doc/extend.texi2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/attrib-6.c26
6 files changed, 57 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e5c1d8e..75ed3b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-05-11 Martin Liska <mliska@suse.cz>
+
+ PR sanitizer/85556
+ * doc/extend.texi: Document LLVM style format for no_sanitize
+ attribute.
+
2018-05-10 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (mode_supports_dq_form): Rename
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 052b222..d2fba2f 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2018-05-11 Martin Liska <mliska@suse.cz>
+
+ PR sanitizer/85556
+ * c-attribs.c (handle_no_sanitize_attribute): Iterate all
+ TREE_LIST values.
+
2018-05-10 Jakub Jelinek <jakub@redhat.com>
PR c++/85662
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 9bddc1a..d302b4f 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -403,7 +403,7 @@ const struct attribute_spec c_common_attribute_table[] =
0, 0, true, false, false, false,
handle_no_address_safety_analysis_attribute,
NULL },
- { "no_sanitize", 1, 1, true, false, false, false,
+ { "no_sanitize", 1, -1, true, false, false, false,
handle_no_sanitize_attribute, NULL },
{ "no_sanitize_address", 0, 0, true, false, false, false,
handle_no_sanitize_address_attribute, NULL },
@@ -683,22 +683,26 @@ static tree
handle_no_sanitize_attribute (tree *node, tree name, tree args, int,
bool *no_add_attrs)
{
+ unsigned int flags = 0;
*no_add_attrs = true;
- tree id = TREE_VALUE (args);
if (TREE_CODE (*node) != FUNCTION_DECL)
{
warning (OPT_Wattributes, "%qE attribute ignored", name);
return NULL_TREE;
}
- if (TREE_CODE (id) != STRING_CST)
+ for (; args; args = TREE_CHAIN (args))
{
- error ("no_sanitize argument not a string");
- return NULL_TREE;
- }
+ tree id = TREE_VALUE (args);
+ if (TREE_CODE (id) != STRING_CST)
+ {
+ error ("no_sanitize argument not a string");
+ return NULL_TREE;
+ }
- char *string = ASTRDUP (TREE_STRING_POINTER (id));
- unsigned int flags = parse_no_sanitize_attribute (string);
+ char *string = ASTRDUP (TREE_STRING_POINTER (id));
+ flags |= parse_no_sanitize_attribute (string);
+ }
add_no_sanitize_value (*node, flags);
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 9d08584..a4664ca 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -2977,6 +2977,8 @@ mentioned in @var{sanitize_option}. A list of values acceptable by
@smallexample
void __attribute__ ((no_sanitize ("alignment", "object-size")))
f () @{ /* @r{Do something.} */; @}
+void __attribute__ ((no_sanitize ("alignment,object-size")))
+g () @{ /* @r{Do something.} */; @}
@end smallexample
@item no_sanitize_address
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bafd284..ee9f633 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-11 Martin Liska <mliska@suse.cz>
+
+ PR sanitizer/85556
+ * c-c++-common/ubsan/attrib-6.c: New test.
+
2018-05-10 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/85687
diff --git a/gcc/testsuite/c-c++-common/ubsan/attrib-6.c b/gcc/testsuite/c-c++-common/ubsan/attrib-6.c
new file mode 100644
index 0000000..2af70c8
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/attrib-6.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined" } */
+
+static void __attribute__((no_sanitize("foobar")))
+foo (void) { /* { dg-warning "attribute directive ignored" } */
+}
+
+static void __attribute__((no_sanitize("address,undefined")))
+foo2 (void) {
+}
+
+static void __attribute__((no_sanitize("address", "undefined")))
+foo3 (void) {
+}
+
+static void __attribute__((no_sanitize("address", "address", "")))
+foo4 (void) {
+}
+
+static void __attribute__((no_sanitize("address", "address", "address,address")))
+foo5 (void) {
+}
+
+static void __attribute__((no_sanitize("address", "address,kernel-address,thread,leak,undefined,vptr,shift,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,bounds-strict,alignment,object-size,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum")))
+foo6 (void) {
+}