diff options
author | marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-06-30 08:51:00 +0000 |
---|---|---|
committer | marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-06-30 08:51:00 +0000 |
commit | 5b64e274ea8c9aaedcebc1d6ad285a11e64ab086 (patch) | |
tree | bc8710aa85afaf74385085ba3f7dc7a14c9f7f3b /gcc | |
parent | bbf37e6046ec1fc51f2ab2df0e0c7953de4a736c (diff) | |
download | gcc-5b64e274ea8c9aaedcebc1d6ad285a11e64ab086.tar.gz |
Call BUILT_IN_ASAN_HANDLE_NO_RETURN before BUILT_IN_UNWIND_RESUME (PR sanitizer/81021).
2017-06-30 Martin Liska <mliska@suse.cz>
PR sanitizer/81021
* g++.dg/asan/pr81021.C: New test.
2017-06-30 Martin Liska <mliska@suse.cz>
PR sanitizer/81021
* tree-eh.c (lower_resx): Call BUILT_IN_ASAN_HANDLE_NO_RETURN
before BUILT_IN_UNWIND_RESUME when ASAN is used.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@249833 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/asan/pr81021.C | 33 | ||||
-rw-r--r-- | gcc/tree-eh.c | 13 |
4 files changed, 57 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5f699d6634..5401bdab0f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Martin Liska <mliska@suse.cz> + + PR sanitizer/81021 + * tree-eh.c (lower_resx): Call BUILT_IN_ASAN_HANDLE_NO_RETURN + before BUILT_IN_UNWIND_RESUME when ASAN is used. + 2017-06-30 Yvan Roux <yvan.roux@linaro.org> * doc/invoke.texi (AArch64): Add missing options and remove redundant diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9b92e447724..274fced11a2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-30 Martin Liska <mliska@suse.cz> + + PR sanitizer/81021 + * g++.dg/asan/pr81021.C: New test. + 2017-06-30 Richard Biener <rguenther@suse.de> PR tree-optimization/81249 diff --git a/gcc/testsuite/g++.dg/asan/pr81021.C b/gcc/testsuite/g++.dg/asan/pr81021.C new file mode 100644 index 00000000000..daa0525c273 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/pr81021.C @@ -0,0 +1,33 @@ +// { dg-do run } + +#include <string> + +struct ConfigFile { + ConfigFile(std::string filename, std::string delimiter) { throw "error"; } + ConfigFile(std::string filename) {} +}; + +struct Configuration { + ConfigFile _configFile; + + Configuration(const std::string &root, const char *baseName) + : _configFile(root + baseName, "=") { } + Configuration(const std::string &root, const char *a, const char *b) + : _configFile(root + a + b) { } +}; + + +void test() { + std::string root("etc"); + try { + Configuration config(root, "notthere"); + } + catch (...) { + // exception is thrown, caught here and ignored... + } + Configuration config(root, "a", "b"); // ASAN error during constructor here +} + +int main(int argc, const char *argv[]) { + test(); +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 34c223d661d..79d02adbade 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "langhooks.h" #include "cfgloop.h" #include "gimple-low.h" +#include "asan.h" /* In some instances a tree and a gimple need to be stored in a same table, i.e. in hash tables. This is a structure to do this. */ @@ -3302,6 +3303,18 @@ lower_resx (basic_block bb, gresx *stmt, gimple_call_set_lhs (x, var); gsi_insert_before (&gsi, x, GSI_SAME_STMT); + /* When exception handling is delegated to a caller function, we + have to guarantee that shadow memory variables living on stack + will be cleaner before control is given to a parent function. */ + if (sanitize_flags_p (SANITIZE_ADDRESS)) + { + tree decl + = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN); + gimple *g = gimple_build_call (decl, 0); + gimple_set_location (g, gimple_location (stmt)); + gsi_insert_before (&gsi, g, GSI_SAME_STMT); + } + fn = builtin_decl_implicit (BUILT_IN_UNWIND_RESUME); x = gimple_build_call (fn, 1, var); gsi_insert_before (&gsi, x, GSI_SAME_STMT); |