On Tue, Feb 13, 2018 at 03:40:20PM +0100, Jakub Jelinek wrote:
> BTW, your testcase shows a more severe problem, that we actually don't
> handle compound literals correctly.
> C99 says that:
> "If the compound literal occurs outside the body of a function, the object
> has static storage duration; otherwise, it has automatic storage duration
> associated with the enclosing block."
> but if we create an object with automatic storage duration, we don't
> actually put that object into the scope of the enclosing block, but of the
> enclosing function, which explains the weird ASAN_MARK UNPOISON present, but
> corresponding ASAN_MARK POISON not present.  The following testcase should
> IMHO FAIL with -fsanitize=address on the second bar call, but doesn't, even
> at -O0 without any DSE.  When optimizing we because of this don't emit
> CLOBBER stmts when the compound literal object goes out of scope, and with
> -fsanitize=address -fsanitize-address-use-after-scope we don't emit the

Here is the full patch that passed bootstrap/regtest on x86_64-linux and
i686-linux, ok for stage1?

The mark_addressable part is needed to fix
gcc.c-torture/compile/compound-literal-3.c, where we marked the underlying
automatic temporary of the compound literal as addressable too late and
the gimplifier already set DECL_GIMPLE_REG_P on it when seeing it in the
block scope.

2018-02-13  Jakub Jelinek  <ja...@redhat.com>

        PR sanitizer/84340
        * c-decl.c (build_compound_literal): Call pushdecl (decl) even when
        it is not TREE_STATIC.
        * c-typeck.c (c_mark_addressable) <case COMPOUND_LITERAL_EXPR>: Mark
        not just the COMPOUND_LITERAL_EXPR node itself addressable, but also

--- gcc/c/c-decl.c.jj   2018-02-13 21:21:35.447978191 +0100
+++ gcc/c/c-decl.c      2018-02-13 22:13:02.030148159 +0100
@@ -5348,6 +5348,8 @@ build_compound_literal (location_t loc,
       pushdecl (decl);
       rest_of_decl_compilation (decl, 1, 0);
+  else
+    pushdecl (decl);
   if (non_const)
--- gcc/c/c-typeck.c.jj 2018-02-10 00:15:36.398163493 +0100
+++ gcc/c/c-typeck.c    2018-02-13 22:24:06.294104876 +0100
@@ -4821,6 +4821,10 @@ c_mark_addressable (tree exp, bool array
+       TREE_ADDRESSABLE (x) = 1;
+       return true;
       case CONSTRUCTOR:
        TREE_ADDRESSABLE (x) = 1;
        return true;


Reply via email to