public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-5493] attribs: Fix ICEs on attributes starting with _ [PR103365]
@ 2021-11-24 9:09 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2021-11-24 9:09 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:709716b9f49f2fcf46f319000562cf6e61bd2f71
commit r12-5493-g709716b9f49f2fcf46f319000562cf6e61bd2f71
Author: Jakub Jelinek <jakub@redhat.com>
Date: Wed Nov 24 10:08:35 2021 +0100
attribs: Fix ICEs on attributes starting with _ [PR103365]
As the patch shows, we have quite a few asserts that we don't call
lookup_attribute etc. with attr_name that starts with an underscore,
to make sure nobody is trying to call it with non-canonicalized
attribute name like "__cold__" instead of "cold".
We canonicalize only attributes that start with 2 underscores and end
with 2 underscores though.
Before Marek's patch, that wasn't an issue, we had no attributes like
"_foo" or "__bar_" etc., so lookup_scoped_attribute_spec would
always return NULL for those and we wouldn't try to register them,
look them up etc., just with -Wattributes would warn about them.
But now, as the new testcases show, users can actually request such
attributes to be ignored, and we ICE for those during
register_scoped_attribute and when that is fixed, ICE later on when
somebody uses those attributes because they will be looked up
to find out that they should be ignored.
So, the following patch instead of or in addition to, depending on
how performance sensitive a particular spot is, checking that
attribute doesn't start with underscore allows attribute
names that start with underscore as long as it doesn't canonicalize
(i.e. doesn't start and end with 2 underscores).
In addition to that, I've noticed lookup_attribute_by_prefix
was calling get_attribute_name twice unnecessarily, and 2 tests
were running in c++98 mode with -std=c++98 -std=c++11 which IMHO
isn't useful because -std=c++11 testing is done too when testing
all language versions.
2021-11-24 Jakub Jelinek <jakub@redhat.com>
PR middle-end/103365
* attribs.h (lookup_attribute): Allow attr_name to start with
underscore, as long as canonicalize_attr_name returns false.
(lookup_attribute_by_prefix): Don't call get_attribute_name twice.
* attribs.c (extract_attribute_substring): Reimplement using
canonicalize_attr_name.
(register_scoped_attribute): Change gcc_assert into
gcc_checking_assert, verify !canonicalize_attr_name rather than
that str.str doesn't start with '_'.
* c-c++-common/Wno-attributes-1.c: Require effective target
c || c++11 and drop dg-additional-options.
* c-c++-common/Wno-attributes-2.c: Likewise.
* c-c++-common/Wno-attributes-4.c: New test.
* c-c++-common/Wno-attributes-5.c: New test.
Diff:
---
gcc/attribs.c | 9 ++-------
gcc/attribs.h | 11 ++++++++---
gcc/testsuite/c-c++-common/Wno-attributes-1.c | 3 +--
gcc/testsuite/c-c++-common/Wno-attributes-2.c | 3 +--
gcc/testsuite/c-c++-common/Wno-attributes-4.c | 7 +++++++
gcc/testsuite/c-c++-common/Wno-attributes-5.c | 8 ++++++++
6 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 0284e5bf2fd..c252f5af07b 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -115,12 +115,7 @@ static const struct attribute_spec empty_attribute_table[] =
static void
extract_attribute_substring (struct substring *str)
{
- if (str->length > 4 && str->str[0] == '_' && str->str[1] == '_'
- && str->str[str->length - 1] == '_' && str->str[str->length - 2] == '_')
- {
- str->length -= 4;
- str->str += 2;
- }
+ canonicalize_attr_name (str->str, str->length);
}
/* Insert an array of attributes ATTRIBUTES into a namespace. This
@@ -387,7 +382,7 @@ register_scoped_attribute (const struct attribute_spec *attr,
/* Attribute names in the table must be in the form 'text' and not
in the form '__text__'. */
- gcc_assert (str.length > 0 && str.str[0] != '_');
+ gcc_checking_assert (!canonicalize_attr_name (str.str, str.length));
slot = name_space->attribute_hash
->find_slot_with_hash (&str, substring_hash (str.str, str.length),
diff --git a/gcc/attribs.h b/gcc/attribs.h
index ba657881940..73f0ccc24b8 100644
--- a/gcc/attribs.h
+++ b/gcc/attribs.h
@@ -188,7 +188,11 @@ is_attribute_p (const char *attr_name, const_tree ident)
static inline tree
lookup_attribute (const char *attr_name, tree list)
{
- gcc_checking_assert (attr_name[0] != '_');
+ if (CHECKING_P && attr_name[0] != '_')
+ {
+ size_t attr_len = strlen (attr_name);
+ gcc_checking_assert (!canonicalize_attr_name (attr_name, attr_len));
+ }
/* In most cases, list is NULL_TREE. */
if (list == NULL_TREE)
return NULL_TREE;
@@ -219,7 +223,8 @@ lookup_attribute_by_prefix (const char *attr_name, tree list)
size_t attr_len = strlen (attr_name);
while (list)
{
- size_t ident_len = IDENTIFIER_LENGTH (get_attribute_name (list));
+ tree name = get_attribute_name (list);
+ size_t ident_len = IDENTIFIER_LENGTH (name);
if (attr_len > ident_len)
{
@@ -227,7 +232,7 @@ lookup_attribute_by_prefix (const char *attr_name, tree list)
continue;
}
- const char *p = IDENTIFIER_POINTER (get_attribute_name (list));
+ const char *p = IDENTIFIER_POINTER (name);
gcc_checking_assert (attr_len == 0 || p[0] != '_');
if (strncmp (attr_name, p, attr_len) == 0)
diff --git a/gcc/testsuite/c-c++-common/Wno-attributes-1.c b/gcc/testsuite/c-c++-common/Wno-attributes-1.c
index aac1a69fd85..84a84ea3352 100644
--- a/gcc/testsuite/c-c++-common/Wno-attributes-1.c
+++ b/gcc/testsuite/c-c++-common/Wno-attributes-1.c
@@ -1,6 +1,5 @@
/* PR c++/101940 */
-/* { dg-do compile } */
-/* { dg-additional-options "-std=c++11" { target c++ } } */
+/* { dg-do compile { target { c || c++11 } } } */
/* { dg-additional-options "-Wno-attributes=company::,yoyodyne::attr" } */
/* { dg-additional-options "-Wno-attributes=c1::attr,c1::attr,c1::__attr__" } */
/* { dg-additional-options "-Wno-attributes=c2::,c2::attr" } */
diff --git a/gcc/testsuite/c-c++-common/Wno-attributes-2.c b/gcc/testsuite/c-c++-common/Wno-attributes-2.c
index 4307c74b048..8e044011d12 100644
--- a/gcc/testsuite/c-c++-common/Wno-attributes-2.c
+++ b/gcc/testsuite/c-c++-common/Wno-attributes-2.c
@@ -1,6 +1,5 @@
/* PR c++/101940 */
-/* { dg-do compile } */
-/* { dg-additional-options "-std=c++11" { target c++ } } */
+/* { dg-do compile { target { c || c++11 } } } */
#pragma GCC diagnostic ignored_attributes "company::,yoyodyne::attr"
#pragma GCC diagnostic ignored_attributes "c1::attr,c1::attr,c1::__attr__"
diff --git a/gcc/testsuite/c-c++-common/Wno-attributes-4.c b/gcc/testsuite/c-c++-common/Wno-attributes-4.c
new file mode 100644
index 00000000000..c5ea3e33776
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wno-attributes-4.c
@@ -0,0 +1,7 @@
+/* PR middle-end/103365 */
+/* { dg-do compile { target { c || c++11 } } } */
+/* { dg-additional-options "-Wno-attributes=foo::_bar" } */
+/* { dg-additional-options "-Wno-attributes=_foo::bar" } */
+
+[[foo::_bar]] void foo (void);
+[[_foo::bar]] void bar (void);
diff --git a/gcc/testsuite/c-c++-common/Wno-attributes-5.c b/gcc/testsuite/c-c++-common/Wno-attributes-5.c
new file mode 100644
index 00000000000..9c0c3da8442
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wno-attributes-5.c
@@ -0,0 +1,8 @@
+/* PR middle-end/103365 */
+/* { dg-do compile { target { c || c++11 } } } */
+
+#pragma GCC diagnostic ignored_attributes "foo::_bar"
+#pragma GCC diagnostic ignored_attributes "_foo::bar"
+
+[[foo::_bar]] void foo (void);
+[[_foo::bar]] void bar (void);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-11-24 9:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-24 9:09 [gcc r12-5493] attribs: Fix ICEs on attributes starting with _ [PR103365] Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).