]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimple-low: Remove .ASAN_MARK calls on TREE_STATIC variables [PR113531]
authorJakub Jelinek <jakub@redhat.com>
Thu, 1 Feb 2024 08:16:57 +0000 (09:16 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 1 Feb 2024 08:16:57 +0000 (09:16 +0100)
Since the r14-1500-g4d935f52b0d5c0 commit we promote an initializer_list
backing array to static storage where appropriate, but this happens after
we decided to add it to asan_poisoned_variables.  As a result we add
unpoison/poison for it to the gimple.  But then sanopt removes the unpoison.
So the second time we call the function and want to load from the array asan
still considers it poisoned.

The following patch fixes it by removing the .ASAN_MARK internal calls
during gimple lowering if they refer to TREE_STATIC vars.

2024-02-01  Jakub Jelinek  <jakub@redhat.com>
    Jason Merrill  <jason@redhat.com>

PR c++/113531
* gimple-low.cc (lower_stmt): Remove .ASAN_MARK calls
on variables which were promoted to TREE_STATIC.

* g++.dg/asan/initlist1.C: New test.

Co-authored-by: Jason Merrill <jason@redhat.com>
gcc/gimple-low.cc
gcc/testsuite/g++.dg/asan/initlist1.C [new file with mode: 0644]

index 0fca9740898b6b935f25398f1c5263b4f3ba95ec..e19fc2cce9d40da1e4e29f9041d38c19d4ac1446 100644 (file)
@@ -790,6 +790,21 @@ lower_stmt (gimple_stmt_iterator *gsi, struct lower_data *data)
            return;
          }
 
+       if (gimple_call_internal_p (stmt, IFN_ASAN_MARK))
+         {
+           tree base = gimple_call_arg (stmt, 1);
+           gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
+           tree decl = TREE_OPERAND (base, 0);
+           if (VAR_P (decl) && TREE_STATIC (decl))
+             {
+               /* Don't poison a variable with static storage; it might have
+                  gotten marked before gimplify_init_constructor promoted it
+                  to static.  */
+               gsi_remove (gsi, true);
+               return;
+             }
+         }
+
        /* We delay folding of built calls from gimplification to
           here so the IL is in consistent state for the diagnostic
           machineries job.  */
diff --git a/gcc/testsuite/g++.dg/asan/initlist1.C b/gcc/testsuite/g++.dg/asan/initlist1.C
new file mode 100644 (file)
index 0000000..6cd5b7d
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/113531
+// { dg-do run { target c++11 } }
+// { dg-additional-options "-fsanitize=address" }
+
+#include <initializer_list>
+
+void f(int) { }
+
+void g()
+{
+  for (auto i : { 1, 2, 3 })
+    f (i);
+  f(42);
+}
+
+int main()
+{
+  g();
+  g();
+}