Difference between revisions of "cpp/utility/program/abort"
m (Text replace - "(===\s*Exceptions?\s*===\s+)\(none\)" to "$1Throws nothing.") |
(~) |
||
Line 24: | Line 24: | ||
===Notes=== | ===Notes=== | ||
− | POSIX [http://pubs.opengroup.org/onlinepubs/9699919799/functions/abort.html specifies] that the abort() function overrides blocking or ignoring the SIGABRT signal. | + | POSIX [http://pubs.opengroup.org/onlinepubs/9699919799/functions/abort.html specifies] that the {{tt|abort()}} function overrides blocking or ignoring the {{tt|SIGABRT}} signal. |
+ | |||
+ | Some compiler intrinsics, e.g. [https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html {{tt|__builtin_trap}}] (gcc, clang, and icc) or [https://docs.microsoft.com/en-us/cpp/intrinsics/debugbreak?view=msvc-160 {{tt|__debugbreak}}] (msvc) can be used to terminate the program as soon as possible. | ||
===Example=== | ===Example=== |
Revision as of 00:17, 12 February 2021
Defined in header <cstdlib>
|
||
void abort(); |
(until C++11) | |
[[noreturn]] void abort() noexcept; |
(since C++11) | |
Causes abnormal program termination unless SIGABRT is being caught by a signal handler passed to std::signal and the handler does not return.
Destructors of variables with automatic, thread local(since C++11) and static storage durations are not called. Functions registered with std::atexit() and std::at_quick_exit(since C++11) are also not called. Whether open resources such as files are closed is implementation defined. An implementation defined status is returned to the host environment that indicates unsuccessful execution.
Contents |
Parameters
(none)
Return value
(none)
Exceptions
Throws nothing.
Notes
POSIX specifies that the abort()
function overrides blocking or ignoring the SIGABRT
signal.
Some compiler intrinsics, e.g. __builtin_trap
(gcc, clang, and icc) or __debugbreak
(msvc) can be used to terminate the program as soon as possible.
Example
#include <csignal> #include <iostream> #include <cstdlib> class Tester { public: Tester() { std::cout << "Tester ctor\n"; } ~Tester() { std::cout << "Tester dtor\n"; } }; Tester static_tester; // Destructor not called void signal_handler(int signal) { if (signal == SIGABRT) { std::cerr << "SIGABRT received\n"; } else { std::cerr << "Unexpected signal " << signal << " received\n"; } std::_Exit(EXIT_FAILURE); } int main() { Tester automatic_tester; // Destructor not called // Setup handler auto previous_handler = std::signal(SIGABRT, signal_handler); if (previous_handler == SIG_ERR) { std::cerr << "Setup failed\n"; return EXIT_FAILURE; } std::abort(); // Raise SIGABRT std::cout << "This code is unreachable\n"; }
Output:
Tester ctor Tester ctor SIGABRT received
See also
causes normal program termination with cleaning up (function) | |
registers a function to be called on std::exit() invocation (function) | |
(C++11) |
causes quick program termination without completely cleaning up (function) |
(C++11) |
registers a function to be called on std::quick_exit invocation (function) |
sets a signal handler for particular signal (function) | |
C documentation for abort
|