diff options
author | Robert Hensing <robert@roberthensing.nl> | 2023-08-11 17:22:55 +0200 |
---|---|---|
committer | Robert Hensing <robert@roberthensing.nl> | 2023-08-11 17:25:42 +0200 |
commit | c4dbb55ba93c9c81d798faa6a19285ebe2717a25 (patch) | |
tree | f1b6af5ceb18a01ae860a476289d70707a614546 /src/libutil/util.cc | |
parent | 010dc7958e23dd8acc72a154e40a6ce5761dccdf (diff) |
initLibUtil: Add exception handling self-check
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r-- | src/libutil/util.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 26f9dc8a8..f24a6e165 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -48,6 +48,23 @@ extern char * * environ __attribute__((weak)); namespace nix { void initLibUtil() { + // Check that exception handling works. Exception handling has been observed + // not to work on darwin when the linker flags aren't quite right. + // In this case we don't want to expose the user to some unrelated uncaught + // exception, but rather tell them exactly that exception handling is + // broken. + // When exception handling fails, the message tends to be printed by the + // C++ runtime, followed by an abort. + // For example on macOS we might see an error such as + // libc++abi: terminating with uncaught exception of type nix::SysError: error: C++ exception handling is broken. This would appear to be a problem with the way Nix was compiled and/or linked and/or loaded. + bool caught = false; + try { + throwExceptionSelfCheck(); + } catch (nix::Error _e) { + caught = true; + } + // This is not actually the main point of this check, but let's make sure anyway: + assert(caught); } std::optional<std::string> getEnv(const std::string & key) |