From: Martin Liska Date: Fri, 11 May 2018 07:37:35 +0000 (+0200) Subject: Support LLVM style of no_sanitize attribute (PR sanitizer/85556). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=19916065b7fb26bbb36f7bbe5688ae2c1661dec3;p=gcc.git Support LLVM style of no_sanitize attribute (PR sanitizer/85556). 2018-05-11 Martin Liska PR sanitizer/85556 * doc/extend.texi: Document LLVM style format for no_sanitize attribute. 2018-05-11 Martin Liska PR sanitizer/85556 * c-attribs.c (handle_no_sanitize_attribute): Iterate all TREE_LIST values. 2018-05-11 Martin Liska PR sanitizer/85556 * c-c++-common/ubsan/attrib-6.c: New test. From-SVN: r260154 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5c1d8e7c92..75ed3b33f70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-05-11 Martin Liska + + PR sanitizer/85556 + * doc/extend.texi: Document LLVM style format for no_sanitize + attribute. + 2018-05-10 Michael Meissner * config/rs6000/rs6000.c (mode_supports_dq_form): Rename diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 052b2226588..d2fba2fae8a 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2018-05-11 Martin Liska + + PR sanitizer/85556 + * c-attribs.c (handle_no_sanitize_attribute): Iterate all + TREE_LIST values. + 2018-05-10 Jakub Jelinek PR c++/85662 diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 9bddc1aad4f..d302b4f22c7 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/ChangeLog b/gcc/testsuite/ChangeLog index bafd284857a..ee9f633ad84 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-05-11 Martin Liska + + PR sanitizer/85556 + * c-c++-common/ubsan/attrib-6.c: New test. + 2018-05-10 Steven G. Kargl 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 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) { +}