diff options
author | Martin Liska <mliska@suse.cz> | 2018-09-24 13:22:38 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-09-24 11:22:38 +0000 |
commit | bf9f9292131058faa03177b7a0d6f1c265eb29f2 (patch) | |
tree | 91afbb9244655cef727a35df6ce34bfce80453b6 /gcc/cfgexpand.c | |
parent | 54b7d98ec40895719d5d62be02e5f03d08aac543 (diff) | |
download | gcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.zip gcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.tar.gz gcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.tar.bz2 |
Unpoison variable partition properly (PR sanitizer/85774).
2018-09-24 Martin Liska <mliska@suse.cz>
PR sanitizer/85774
* asan.c: Make asan_handled_variables extern.
* asan.h: Likewise.
* cfgexpand.c (expand_stack_vars): Make sure
a representative is unpoison if another
variable in the partition is handled by
use-after-scope sanitization.
2018-09-24 Martin Liska <mliska@suse.cz>
PR sanitizer/85774
* g++.dg/asan/pr85774.C: New test.
From-SVN: r264528
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index c8d7805..35ca276 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1155,6 +1155,20 @@ expand_stack_vars (bool (*pred) (size_t), struct stack_vars_data *data) if (repr_decl == NULL_TREE) repr_decl = stack_vars[i].decl; data->asan_decl_vec.safe_push (repr_decl); + + /* Make sure a representative is unpoison if another + variable in the partition is handled by + use-after-scope sanitization. */ + if (asan_handled_variables != NULL + && !asan_handled_variables->contains (repr_decl)) + { + for (j = i; j != EOC; j = stack_vars[j].next) + if (asan_handled_variables->contains (stack_vars[j].decl)) + break; + if (j != EOC) + asan_handled_variables->add (repr_decl); + } + data->asan_alignb = MAX (data->asan_alignb, alignb); if (data->asan_base == NULL) data->asan_base = gen_reg_rtx (Pmode); |