On 25/03/2019 17:14, Florian Weimer wrote:
* Andrew Haley:
On 3/25/19 2:01 PM, Florian Weimer wrote:
* Xi Ruoyao:
On 2019-03-25 13:06 +0000, Jonny Grant wrote:
I built & ran with the Sanitizer, it seems it's also stack overflow
within the operator new()
I had thoughts GCC would generate code that monitored the stack size and
aborted with a clear message when the stack size was exceeded. Looked
online, and it doesn't seem to be the case.
Impossible. We can't distinguish "stack overflow" with other segmentation
faults.
I think “impossible” is too strong.
It is. We do it with stack banging and a few guard pages in the HotSpot JVM.
The problem is that recovering well enough to throw an exception requires
some quite hairy non-portable code.
Of course it's going to be non-portable. Ideally, this would be
handled out-of-process: the shell registers itself with the system
coredump handler, and the handler analyzes the crash and provides
information back to the shell for display.
It's quite difficult to get there, but it's certainly not impossible.
We really should have lightweight tracebacks for aborts and the like
in C/C++ code. Right now, every moderately large piece of software
tries to write their robust in-process crash handler, with varying
results.
.
Hi!
Thank you for your reply and input.
Maybe GCC's "libbacktrace" module could be used?
I was wondering if -fsanitize=address would output a backtrace for the
C++ exception, but it doesn't seem to. Also it actually prevents the
core being dumped - that's probably not intended?
Compile without Sanitizer, and it does dump the core to a file at least!
$ export UBSAN_OPTIONS=print_stacktrace=1
// g++-8 -fsanitize=address -Wall -o exception exception.cpp
#include <vector>
int main()
{
std::vector<int> v;
return v.at(0);
}
$ ./exception
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 0) >= this->size()
(which is 0)
Aborted
What would be very useful is simple -fcrash-handler it would link in
automatically, and probably register before main() any stack-overflow,
segv or bus handlers etc
Maybe it could simply integrate with
https://www.gnu.org/software/libsigsegv/
(suggested by Xi) in this thread?
Or GCC has the "libbacktrace" in the GCC tree, maybe use that?
Cheers
Jonny