From ebd2f85818e76bf2c565cc59b35544e81dfa87a5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 30 May 2017 09:19:49 +0200 Subject: [PATCH] backport: re PR sanitizer/77396 (address sanitizer crashes if all static global variables are optimized) Backported from mainline 2016-09-05 Jakub Jelinek PR sanitizer/77396 * asan/asan_globals.cc: Cherry-pick upstream r280657. 2016-09-05 Jakub Jelinek PR sanitizer/77396 * g++.dg/asan/pr77396-2.C: New test. 2016-09-02 Jakub Jelinek PR sanitizer/77396 * g++.dg/asan/pr77396.C: New test. From-SVN: r248603 --- gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/g++.dg/asan/pr77396-2.C | 12 ++++++++++++ gcc/testsuite/g++.dg/asan/pr77396.C | 12 ++++++++++++ libsanitizer/ChangeLog | 8 ++++++++ libsanitizer/asan/asan_globals.cc | 7 ++++--- 5 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/asan/pr77396-2.C create mode 100644 gcc/testsuite/g++.dg/asan/pr77396.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc5e04bb5779..16f15aaa6751 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,16 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2016-09-05 Jakub Jelinek + + PR sanitizer/77396 + * g++.dg/asan/pr77396-2.C: New test. + + 2016-09-02 Jakub Jelinek + + PR sanitizer/77396 + * g++.dg/asan/pr77396.C: New test. + 2016-08-30 Jakub Jelinek PR debug/77363 diff --git a/gcc/testsuite/g++.dg/asan/pr77396-2.C b/gcc/testsuite/g++.dg/asan/pr77396-2.C new file mode 100644 index 000000000000..0570a14940ed --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/pr77396-2.C @@ -0,0 +1,12 @@ +// PR sanitizer/77396 +// { dg-do run } +// { dg-set-target-env-var ASAN_OPTIONS "check_initialization_order=true" } + +struct S { S () { asm volatile ("" : : : "memory"); } }; +static S c; + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/asan/pr77396.C b/gcc/testsuite/g++.dg/asan/pr77396.C new file mode 100644 index 000000000000..3b3195ec1eca --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/pr77396.C @@ -0,0 +1,12 @@ +// PR sanitizer/77396 +// { dg-do run } +// { dg-set-target-env-var ASAN_OPTIONS "check_initialization_order=true" } + +static int a = 0; +static int b = a; + +int +main () +{ + return 0; +} diff --git a/libsanitizer/ChangeLog b/libsanitizer/ChangeLog index cf0bb56e5fee..995f3c93ca26 100644 --- a/libsanitizer/ChangeLog +++ b/libsanitizer/ChangeLog @@ -1,3 +1,11 @@ +2017-05-30 Jakub Jelinek + + Backported from mainline + 2016-09-05 Jakub Jelinek + + PR sanitizer/77396 + * asan/asan_globals.cc: Cherry-pick upstream r280657. + 2017-05-29 Martin Liska Backport from mainline diff --git a/libsanitizer/asan/asan_globals.cc b/libsanitizer/asan/asan_globals.cc index 4bb88cfa001f..be128ea52356 100644 --- a/libsanitizer/asan/asan_globals.cc +++ b/libsanitizer/asan/asan_globals.cc @@ -249,10 +249,10 @@ void __asan_unregister_globals(__asan_global *globals, uptr n) { // initializer can only touch global variables in the same TU. void __asan_before_dynamic_init(const char *module_name) { if (!flags()->check_initialization_order || - !flags()->poison_heap) + !flags()->poison_heap || + !dynamic_init_globals) return; bool strict_init_order = flags()->strict_init_order; - CHECK(dynamic_init_globals); CHECK(module_name); CHECK(asan_inited); BlockingMutexLock lock(&mu_for_globals); @@ -275,7 +275,8 @@ void __asan_before_dynamic_init(const char *module_name) { // TU are poisoned. It simply unpoisons all dynamically initialized globals. void __asan_after_dynamic_init() { if (!flags()->check_initialization_order || - !flags()->poison_heap) + !flags()->poison_heap || + !dynamic_init_globals) return; CHECK(asan_inited); BlockingMutexLock lock(&mu_for_globals); -- 2.47.2