diff --git a/tests/auto/corelib/io/qprocess/crasher.h b/tests/auto/corelib/io/qprocess/crasher.h new file mode 100644 index 00000000000..d34d6dd058a --- /dev/null +++ b/tests/auto/corelib/io/qprocess/crasher.h @@ -0,0 +1,58 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2020 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#if defined(_MSC_VER) +# include +#endif +#if __has_include() +# include +#endif +#if __has_include() +# include +#endif + +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +namespace tst_QProcessCrash { +struct NoCoreDumps +{ +#if defined(RLIMIT_CORE) + struct rlimit rlim; + NoCoreDumps() + { + if (getrlimit(RLIMIT_CORE, &rlim) == 0 && rlim.rlim_cur != 0) { + struct rlimit newrlim = rlim; + newrlim.rlim_cur = 0; + setrlimit(RLIMIT_CORE, &newrlim); + } + } + ~NoCoreDumps() + { + setrlimit(RLIMIT_CORE, &rlim); + } +#endif // RLIMIT_CORE +}; + +void crashFallback(volatile int *ptr = nullptr) +{ + *ptr = 0; +} + +void crash() +{ +#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + __ud2(); +#elif __has_builtin(__builtin_trap) + __builtin_trap(); +#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + asm("ud2"); +#elif defined(SIGILL) + raise(SIGILL); +#endif + + crashFallback(); +} +} // namespace tst_QProcessCrash diff --git a/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp b/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp index ddf0ef0ad79..474508c453f 100644 --- a/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp +++ b/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp @@ -2,49 +2,12 @@ // Copyright (C) 2020 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#if __has_include() -# include -# if defined(RLIMIT_CORE) -static bool disableCoreDumps() -{ - // Unix: set our core dump limit to zero to request no dialogs. - if (struct rlimit rlim; getrlimit(RLIMIT_CORE, &rlim) == 0) { - rlim.rlim_cur = 0; - setrlimit(RLIMIT_CORE, &rlim); - } - return true; -} -static bool disabledCoreDumps = disableCoreDumps(); -# endif // RLIMIT_CORE -#endif // - -void crashFallback(volatile int *ptr = nullptr) -{ - *ptr = 0; -} - -#if defined(_MSC_VER) -# include +#include "../crasher.h" +using namespace tst_QProcessCrash; int main() { -# if defined(_M_IX86) || defined(_M_X64) - __ud2(); -# endif - - crashFallback(); + NoCoreDumps disableCoreDumps; + crash(); + return 0; } -#elif defined(__MINGW32__) -int main() -{ - asm("ud2"); - crashFallback(); -} -#else -# include - -int main() -{ - abort(); -} -#endif