Source: catch Followup-For: Bug #993515 Actually upsteam catch (catch2) had some criticisms of the PR#2317 patch that I referenced.
Among other things it should still use SIGSTKSZ not MINSIGSTKSZ. The actual patch to catch2 was commit c0d0a50bd https://github.com/catchorg/Catch2/commit/c0d0a50bdb2ae2f749443c0386c2b25379bdbf76 I adapted my dolfin patch to align with commit c0d0a50bd to use SIGSTKSZ not MINSIGSTKSZ (and use 32 * 1024 as the backup default value). I'm attaching the updated dolfin patch here for reference.
Index: dolfin/test/unit/cpp/catch/catch.hpp =================================================================== --- dolfin.orig/test/unit/cpp/catch/catch.hpp 2022-02-04 17:07:26.964175029 +0100 +++ dolfin/test/unit/cpp/catch/catch.hpp 2022-02-04 17:08:30.528792625 +0100 @@ -6472,6 +6472,17 @@ int id; const char* name; }; + +// 32kb for the alternate stack seems to be sufficient. However, this value +// is experimentally determined, so that's not guaranteed. +#if defined(_SC_SIGSTKSZ_SOURCE) || defined(_GNU_SOURCE) + // on glibc > 2.33 this is no longer constant, see + // https://sourceware.org/git/?p=glibc.git;a=blob;f=NEWS;h=85e84fe53699fe9e392edffa993612ce08b2954a;hb=HEAD + static constexpr std::size_t altStackSize = 32 * 1024; +#else + static constexpr std::size_t altStackSize = std::max(static_cast<size_t>(SIGSTKSZ), 32 * 1024) +#endif + extern SignalDefs signalDefs[]; SignalDefs signalDefs[] = { { SIGINT, "SIGINT - Terminal interrupt signal" }, @@ -6487,7 +6498,7 @@ static bool isSet; static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)]; static stack_t oldSigStack; - static char altStackMem[SIGSTKSZ]; + static char altStackMem[altStackSize]; static void handleSignal( int sig ) { std::string name = "<unknown signal>"; @@ -6507,7 +6518,7 @@ isSet = true; stack_t sigStack; sigStack.ss_sp = altStackMem; - sigStack.ss_size = SIGSTKSZ; + sigStack.ss_size = altStackSize; sigStack.ss_flags = 0; sigaltstack(&sigStack, &oldSigStack); struct sigaction sa = { 0 }; @@ -6538,7 +6549,7 @@ bool FatalConditionHandler::isSet = false; struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; stack_t FatalConditionHandler::oldSigStack = {}; - char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; + char FatalConditionHandler::altStackMem[altStackSize] = {}; } // namespace Catch