diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ddc1717c8c7b09c6e563746e807e839e1f73941..aab38b1ce78edeaa411a078ba43a27467eff608b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-06-19 Martin Liska <mliska@suse.cz> + + PR sanitizer/80879 + * gimplify.c (gimplify_switch_expr): + Initialize live_switch_vars for SWITCH_BODY == STATEMENT_LIST. + 2017-06-19 Martin Liska <mliska@suse.cz> * doc/install.texi: Document that PGO runs in 4 stages. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 9af95a28704731fc30c3309de0950d934d204500..cf82f95160a22c0210fafbbb95c74c4b72535983 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2279,7 +2279,8 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p) /* Do not create live_switch_vars if SWITCH_BODY is not a BIND_EXPR. */ saved_live_switch_vars = gimplify_ctxp->live_switch_vars; - if (TREE_CODE (SWITCH_BODY (switch_expr)) == BIND_EXPR) + tree_code body_type = TREE_CODE (SWITCH_BODY (switch_expr)); + if (body_type == BIND_EXPR || body_type == STATEMENT_LIST) gimplify_ctxp->live_switch_vars = new hash_set<tree> (4); else gimplify_ctxp->live_switch_vars = NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0b55fe02fab0a5d7110302696b4d07905b560228..26e527c7e153d1cf44f1cab870584ac723c6a7e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-19 Martin Liska <mliska@suse.cz> + + PR sanitizer/80879 + * gcc.dg/asan/use-after-scope-switch-4.c: New test. + 2017-06-19 Martin Liska <mliska@suse.cz> PR ipa/80732 diff --git a/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c b/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c new file mode 100644 index 0000000000000000000000000000000000000000..290a920633baf4ab377286d3a22974bd04eda31f --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c @@ -0,0 +1,35 @@ +// { dg-do run } +// { dg-additional-options "-fdump-tree-gimple" } + +int *ptr; + +struct a +{ + int c; +}; + +int main(int argc, char **argv) +{ + struct a e; + e.c = 2; + int x = 0; + + for (;;) + switch (e.c) + case 3: + { + int resxxx; + case 2: + ptr = &resxxx; + *ptr = 123; + + if (x) + return 0; + else + x = 1; + } + + return 1; +} + +/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &resxxx, \[0-9\]\\);" 2 "gimple" } } */