Backport r249833
2017-07-27 Martin Liska <mliska@suse.cz> Backport from mainline 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-07-27 Martin Liska <mliska@suse.cz> Backport from mainline 2017-06-30 Martin Liska <mliska@suse.cz> PR sanitizer/81021 * g++.dg/asan/pr81021.C: New test. From-SVN: r250604
This commit is contained in:
parent
7d3d0ac762
commit
da7b783895
|
@ -1,3 +1,12 @@
|
|||
2017-07-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
Backport from mainline
|
||||
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-07-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2017-07-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
Backport from mainline
|
||||
2017-06-30 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR sanitizer/81021
|
||||
* g++.dg/asan/pr81021.C: New test.
|
||||
|
||||
2017-07-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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. */
|
||||
|
@ -3304,6 +3305,20 @@ 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 ((flag_sanitize & SANITIZE_ADDRESS) != 0
|
||||
&& !lookup_attribute ("no_sanitize_address",
|
||||
DECL_ATTRIBUTES (current_function_decl)))
|
||||
{
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue