On 05/10/2018 11:45 AM, Jakub Jelinek wrote: > On Thu, May 10, 2018 at 11:28:15AM +0200, Martin Liška wrote: >> Parsing of no_sanitize attribute now supports >> __attribute__((no_sanitize("address,undefined"))) > > Why is that wrong? I don't see why we shouldn't support it that way. > It matches how we handle other similar attributes, say target attribute.
Good, let's support both formats. > >> which is wrong. And on the other hand this is not recognized: >> __attribute__((no_sanitize("address", "undefined"))) > > But we can certainly add support for this too for compatibility with clang. > > Jakub > Done that in updated version of the patch. I've been running bootstrap and tests. Ready after it finishes? Martin
>From 9e2570eee9bb160b58075f6802d6ac1bb7b77341 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Thu, 10 May 2018 10:27:02 +0200 Subject: [PATCH] Support LLVM style of no_sanitize attribute (PR sanitizer/85556). gcc/ChangeLog: 2018-05-10 Martin Liska <mli...@suse.cz> * doc/extend.texi: Document LLVM style format for no_sanitize attribute. gcc/c-family/ChangeLog: 2018-05-10 Martin Liska <mli...@suse.cz> PR sanitizer/85556 * c-attribs.c (handle_no_sanitize_attribute): Iterate all TREE_LIST values. gcc/testsuite/ChangeLog: 2018-05-10 Martin Liska <mli...@suse.cz> PR sanitizer/85556 * c-c++-common/ubsan/attrib-6.c: New test. --- gcc/c-family/c-attribs.c | 20 ++++++++++++-------- gcc/doc/extend.texi | 2 ++ gcc/testsuite/c-c++-common/ubsan/attrib-6.c | 26 ++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/ubsan/attrib-6.c diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index e0630885cca..744315eec86 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 9d085844cfd..a4664cad819 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/c-c++-common/ubsan/attrib-6.c b/gcc/testsuite/c-c++-common/ubsan/attrib-6.c new file mode 100644 index 00000000000..2af70c8c2cf --- /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) { +} -- 2.16.3