tst_QProcess: move the crasher code to a header
So I can use it in tst_QProcess itself. This also modernizes it a bit by using __builtin_trap() where available. On x86-64, this expands to the ud2 instruction. Pick-to: 6.6 Change-Id: Ib5ce7a497e034ebabb2cfffd176288433378731b Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
1dfa922606
commit
f992402f15
58
tests/auto/corelib/io/qprocess/crasher.h
Normal file
58
tests/auto/corelib/io/qprocess/crasher.h
Normal file
@ -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 <intrin.h>
|
||||
#endif
|
||||
#if __has_include(<signal.h>)
|
||||
# include <signal.h>
|
||||
#endif
|
||||
#if __has_include(<sys/resource.h>)
|
||||
# include <sys/resource.h>
|
||||
#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
|
@ -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(<sys/resource.h>)
|
||||
# include <sys/resource.h>
|
||||
# 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 // <sys/resource.h>
|
||||
|
||||
void crashFallback(volatile int *ptr = nullptr)
|
||||
{
|
||||
*ptr = 0;
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# include <intrin.h>
|
||||
#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 <stdlib.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user