]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: For default(none) ignore variables created by ubsan_create_data [PR64888]
authorJakub Jelinek <jakub@redhat.com>
Wed, 10 Nov 2021 07:51:07 +0000 (08:51 +0100)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 10 Nov 2021 07:51:30 +0000 (08:51 +0100)
We weren't ignoring the ubsan variables created by c-ubsan.c before gimplification
(others are added later).  One way to fix this would be to introduce further
UBSAN_ internal functions and lower it later (sanopt pass) like other ifns,
this patch instead recognizes those magic vars by name/name of type and DECL_ARTIFICIAL
and TYPE_ARTIFICIAL.

2021-10-21  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/64888
gcc/c-family/
* c-omp.c (c_omp_predefined_variable): Return true also for
ubsan_create_data created artificial variables.
gcc/testsuite/
* c-c++-common/ubsan/pr64888.c: New test.

(cherry picked from commit 40dd9d839e52f679d8eabc1c5ca0ca17a5ccfd14)

gcc/c-family/ChangeLog.omp
gcc/c-family/c-omp.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/c-c++-common/ubsan/pr64888.c [new file with mode: 0644]

index c7b3c24bd542f34b55490a1c9084c171fc9ba790..e704d7d726178c11c99ad8ce502c9ebd8ce4a2f3 100644 (file)
@@ -1,3 +1,12 @@
+2021-11-10  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-10-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/64888
+       * c-omp.c (c_omp_predefined_variable): Return true also for
+       ubsan_create_data created artificial variables.
+
 2021-10-27  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
index 54f21ea3f393866fec3d2cf784b9903fee91470a..443d1da7189ac35ffb922d607af6a3b108aa5973 100644 (file)
@@ -3030,13 +3030,44 @@ c_omp_predefined_variable (tree decl)
 {
   if (VAR_P (decl)
       && DECL_ARTIFICIAL (decl)
-      && TREE_READONLY (decl)
       && TREE_STATIC (decl)
-      && DECL_NAME (decl)
-      && (DECL_NAME (decl) == ridpointers[RID_C99_FUNCTION_NAME]
-         || DECL_NAME (decl) == ridpointers[RID_FUNCTION_NAME]
-         || DECL_NAME (decl) == ridpointers[RID_PRETTY_FUNCTION_NAME]))
-    return true;
+      && DECL_NAME (decl))
+    {
+      if (TREE_READONLY (decl)
+         && (DECL_NAME (decl) == ridpointers[RID_C99_FUNCTION_NAME]
+             || DECL_NAME (decl) == ridpointers[RID_FUNCTION_NAME]
+             || DECL_NAME (decl) == ridpointers[RID_PRETTY_FUNCTION_NAME]))
+       return true;
+      /* For UBSan handle the same also ubsan_create_data created
+        variables.  There is no magic flag for those, but user variables
+        shouldn't be DECL_ARTIFICIAL or have TYPE_ARTIFICIAL type with
+        such names.  */
+      if ((flag_sanitize & (SANITIZE_UNDEFINED
+                           | SANITIZE_UNDEFINED_NONDEFAULT)) != 0
+         && DECL_IGNORED_P (decl)
+         && !TREE_READONLY (decl)
+         && TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE
+         && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
+         && TYPE_ARTIFICIAL (TREE_TYPE (decl))
+         && TYPE_NAME (TREE_TYPE (decl))
+         && TREE_CODE (TYPE_NAME (TREE_TYPE (decl))) == TYPE_DECL
+         && DECL_NAME (TYPE_NAME (TREE_TYPE (decl)))
+         && (TREE_CODE (DECL_NAME (TYPE_NAME (TREE_TYPE (decl))))
+             == IDENTIFIER_NODE))
+       {
+         tree id1 = DECL_NAME (decl);
+         tree id2 = DECL_NAME (TYPE_NAME (TREE_TYPE (decl)));
+         if (IDENTIFIER_LENGTH (id1) >= sizeof ("ubsan_data") - 1
+             && IDENTIFIER_LENGTH (id2) >= sizeof ("__ubsan__data")
+             && !memcmp (IDENTIFIER_POINTER (id2), "__ubsan_",
+                         sizeof ("__ubsan_") - 1)
+             && !memcmp (IDENTIFIER_POINTER (id2) + IDENTIFIER_LENGTH (id2)
+                         - sizeof ("_data") + 1, "_data",
+                         sizeof ("_data") - 1)
+             && strstr (IDENTIFIER_POINTER (id1), "ubsan_data"))
+           return true;
+       }
+    }
   return false;
 }
 
index f0036d95396c7da43ef654efd8ba396219377bba..6016e798b5d510c71345d98855d0b32af8b53a44 100644 (file)
@@ -1,3 +1,11 @@
+2021-11-10  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-10-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/64888
+       * c-c++-common/ubsan/pr64888.c: New test.
+
 2021-11-02  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from master:
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr64888.c b/gcc/testsuite/c-c++-common/ubsan/pr64888.c
new file mode 100644 (file)
index 0000000..6319c2f
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR middle-end/64888 */
+/* { dg-do compile { target fopenmp } } */
+/* { dg-options "-fopenmp -fsanitize=undefined" } */
+
+int a, b;
+
+void
+foo ()
+{
+  int c;
+#pragma omp parallel default (none) shared (a, b) private (c)
+  {
+    c = a / b; /* { dg-bogus "not specified in enclosing" } */
+    (void) c;
+  }
+#pragma omp task default (none) shared (a, b) private (c)
+  {
+    c = a << b;        /* { dg-bogus "not specified in enclosing" } */
+    (void) c;
+  }
+#pragma omp teams default (none) shared (a, b)
+  {
+    int d[a];  /* { dg-bogus "not specified in enclosing" } */
+    d[0] = 0;
+    (void) d[0];
+  }
+}