473,288 Members | 1,704 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,288 software developers and data experts.

using exceptions to catch segmentation faults?

Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?

Thanks.

Dec 27 '05 #1
18 26025

Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?

Thanks.


It is implementation dependent; standard says nothing of it. If you're
trying to find an equivalent to Java 's run-time exception by catching
Throwable, then you can try something like this, but it's NOT
guaranteed be caught - thus you can still suffer from segmentation
fault or bus error in form of unexpected program abort.

try
{
//access invalid memory location.
}catch(...)
{
std::cerr<<"something bad happened\n"
}
-----------------
catch(...) -- is somewhat equivalent to catch(throwable), beware the
implementation detail and read on compiler vendor provisions regarding
it.
Best,

Dec 27 '05 #2
"Digital Puer" <di**********@hotmail.com> wrote in message
news:11*********************@f14g2000cwb.googlegro ups.com
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


If you use vectors instead of arrays and use the at() member function rather
than the subscript operator, an exception is thrown for out of range
accesses. There is, however, no general C++ exception mechanism for
segmentation faults.

Windows has "structured exceptions" in addition to C++ exceptions. These
structured exceptions do include segmentation faults (or "access violations"
as they are more commonly called). Other platforms may have similar
facilities, but I don't know about them.
--
John Carson
Dec 27 '05 #3
I posted some code that does that (for non-windows MT processes) in a
discussion in that subject sometime ago.
I hope you'll find it use, and I'll be glad to have feedback on it,
look at:

http://groups.google.com/group/comp....3a342b9836cb9/

Yuval.

Dec 27 '05 #4

John Carson wrote:
"Digital Puer" <di**********@hotmail.com> wrote in message
news:11*********************@f14g2000cwb.googlegro ups.com
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


If you use vectors instead of arrays and use the at() member function rather
than the subscript operator, an exception is thrown for out of range
accesses. There is, however, no general C++ exception mechanism for
segmentation faults.


Thank you for the info about vector::at. I looked through the docs
on vector, but there doesn't seem to be an analogous 'setter'
function for vector that can throw an exception. Is that right?
All I can find are append functions (e.g. push_back). I would
like 'data[12] = foo' to throw an exception if it's past the end.

Dec 27 '05 #5
"Digital Puer" <di**********@hotmail.com> wrote in message
news:11**********************@g49g2000cwa.googlegr oups.com
John Carson wrote:
"Digital Puer" <di**********@hotmail.com> wrote in message
news:11*********************@f14g2000cwb.googlegro ups.com
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


If you use vectors instead of arrays and use the at() member
function rather than the subscript operator, an exception is thrown
for out of range accesses. There is, however, no general C++
exception mechanism for segmentation faults.


Thank you for the info about vector::at. I looked through the docs
on vector, but there doesn't seem to be an analogous 'setter'
function for vector that can throw an exception. Is that right?
All I can find are append functions (e.g. push_back). I would
like 'data[12] = foo' to throw an exception if it's past the end.


at is overloaded to be both a getter and a setter function (just like the
subscript operator is). Thus you can use

data.at(12) = foo;

Note that range errors are relative to the value returned by size(), not the
value returned by capacity(), e.g.,

vector<int> vec;
vec.reserve(1);
try
{
vec.at(0) = 2;
}
catch (exception &e)
{
cout << "Caught: " << e.what( ) << endl;
cout << "Type: " << typeid( e ).name( ) << endl;
};

will throw an exception because size() returns 0 so the index is >= size().
However

vector<int> vec;
vec.resize(1);
try
{
vec.at(0) = 2;
}
catch (exception &e)
{
cout << "Caught: " << e.what( ) << endl;
cout << "Type: " << typeid( e ).name( ) << endl;
};

does not throw an exception because size() is 1 and so the index is <
size().

--
John Carson
Dec 27 '05 #6
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


such mechanisms are platform specific and there is some good reason why
they have not been incooperated into the c++ language itself, for
example:

- common out-of-bounds errors often do not trigger a segfault because
your program has to access non-mapped or foreign memory for that to
happen. small off-bounds errors may pass unnoticed.
- writing into memory off bounds that your process owns will invoke
undefined behaviour and may wreak havoc.
- your process might have been corrupted on OS side before the
segmentation fault occured anyways.

in c++ you should always ensure that memory operations are valid and
use related tools like checked array index access, smart pointers and
the like if you need language support to do so.

if you are still interested into handling segfaults have a look into
platform specific newsgroups for more details.

-- peter

Dec 27 '05 #7

Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


It useless. After a segmentation fault, at least on unix, the behavior
of the process is undefined. You can not reliably handle or recover
from it. I see no reason why this wouldn't apply for windoze.

http://www.opengroup.org/onlinepubs/...chap02_04.html
....
The behavior of a process is undefined after it ignores a SIGFPE,
SIGILL, SIGSEGV, or SIGBUS signal that was not generated by kill(),
sigqueue(), or raise().
....

Dec 27 '05 #8
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?

Thanks.

I have no clue what you mean by your allusion to Java. Segementation
faults are a foreign concept to Java as well. There's no portable
way of catching them in C++ (and in many implementations there's no
good way to catch them at all). There's no indication that accessing
off the end of an array generates a segmentation fault either. Chances
are you just access/clobber some other piece of memory.
Dec 27 '05 #9
"Maxim Yegorushkin" <ma***************@gmail.com> wrote in message
news:11**********************@g49g2000cwa.googlegr oups.com
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


It useless. After a segmentation fault, at least on unix, the behavior
of the process is undefined. You can not reliably handle or recover
from it. I see no reason why this wouldn't apply for windoze.


It doesn't apply. Of course a segmentation fault normally indicates a
program bug, so it is doubtful if the program can continue successfully from
that point on. However, it is certainly not the case that the behaviour of
the process becomes undefined as a matter of course.

For example, the following crashes on Windows:

int main()
{
int *ptr = 0;
*ptr = 2;

return 0;
}

However, using structure exception handling, we can do this:

int main()
{
int *ptr = 0;

__try
{
*ptr = 2;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
cout << "exception thrown\n";
}

// code execution resumes here and the process is in a
// completely robust state.

return 0;
}

The details of structured exception handling are described in Jeffrey
Richter's book, Programming Applications for Microsoft Windows.
--
John Carson
Dec 27 '05 #10
> In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


Please consider this article.
http://en.wikipedia.org/wiki/Segmentation_fault

You get this error if any instruction in the code "attempts to access a
memory location in a way it is not allowed to". How much do you trust
your environment if it was tried to read or overwrite the value at an
unexpected address?
Is the infrastructure and mechanism for exception handling still
working after this kind of programming error was detected?
Should a direct program abort be the prefered reaction in this case so
that the error context can be analysed from a core dump file by a
debugger?
http://lambdacs.com/debugger/USENIX/...ENIX_2003.html
(Omniscient Debugging)

http://en.wikipedia.org/wiki/Buffer_overflow
How much effort do you put on a code structure with guarantees that out
of range accesses can not happen?

Regards,
Markus

Dec 27 '05 #11
> In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


Please consider this article.
http://en.wikipedia.org/wiki/Segmentation_fault

You get this error if an instruction in the code "attempts to access a
memory location in a way it is not allowed to". How much do you trust
your environment if it was tried to read or overwrite the value at an
unexpected address?
Is the infrastructure and mechanism for exception handling still
working after this kind of programming error was detected?
Should a direct program abort be the prefered reaction in this case so
that the error context can be analysed from a core dump file by a
debugger?
http://lambdacs.com/debugger/USENIX/...ENIX_2003.html
(Omniscient Debugging)

Can your program safely continue its execution if an
"access_violation_exception" will be caught?
Can any further damage from unexpected or undefined behaviour be
restricted?

How much effort do you put on a code structure with guarantees that out
of range accesses can not happen?
- http://en.wikipedia.org/wiki/Static_code_analysis
- http://en.wikipedia.org/wiki/Buffer_overflow

Regards,
Markus

Dec 27 '05 #12

Ron Natalie wrote:
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?

Thanks.

I have no clue what you mean by your allusion to Java. Segementation
faults are a foreign concept to Java as well. There's no portable
way of catching them in C++ (and in many implementations there's no
good way to catch them at all). There's no indication that accessing
off the end of an array generates a segmentation fault either. Chances
are you just access/clobber some other piece of memory.

In Java, accessing an array beyond its allocated length generates
an exception. Since on my system (linux w/g++) accessing an
array beyond its allocation generally results in a seg fault, I am
trying to catch it with an exception handler to tell me where
the fault occurred.

Dec 27 '05 #13

Maxim Yegorushkin wrote:
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?


It useless. After a segmentation fault, at least on unix, the behavior
of the process is undefined. You can not reliably handle or recover
from it. I see no reason why this wouldn't apply for windoze.

http://www.opengroup.org/onlinepubs/...chap02_04.html
...
The behavior of a process is undefined after it ignores a SIGFPE,
SIGILL, SIGSEGV, or SIGBUS signal that was not generated by kill(),
sigqueue(), or raise().
...

I'm not trying to recover from the seg fault. I just want to find out
where in the code it happened.

Dec 27 '05 #14
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults

No
I'm not trying to recover from the seg fault. I just want to find out
where in the code it happened.


Even if it were possible, it would still not tell you where in the code
the error happened. When you catch an exception, all you know
is that it occurred somewhere inside the corresponding try-block.
So unless you were planning to wrap EVERY statement in a
try..catch block, you're out of luck.

It sounds like you are looking for a program that will tell you
when you access memory that you shouldn't. This is normally
called "a debugger" and there are lots of those available (valgrind
is one that springs to mind).

Dec 27 '05 #15
Digital Puer wrote:

Ron Natalie wrote:
Digital Puer wrote:
> Hi, I'm coming over from Java to C++, so please bear with me.
> In C++, is there a way for me to use exceptions to catch
> segmentation faults (e.g. when I access a location off
> the end of an array)?
>
> Thanks.
>

I have no clue what you mean by your allusion to Java. Segementation
faults are a foreign concept to Java as well. There's no portable
way of catching them in C++ (and in many implementations there's no
good way to catch them at all). There's no indication that accessing
off the end of an array generates a segmentation fault either. Chances
are you just access/clobber some other piece of memory.

In Java, accessing an array beyond its allocated length generates
an exception. Since on my system (linux w/g++) accessing an
array beyond its allocation generally results in a seg fault, I am
trying to catch it with an exception handler to tell me where
the fault occurred.

Enable core-files and examine them with a debugger.

To enable core-files enter "ulimit -c unlimited". When your program
segfaults it generates a file named core or core.$PID. Start gdb with 2
arguments: the first is your program and the second is the core-file. In
gdb enter "where" and you get a nice stacktrace. It will be even nicer if
you compile your program with -g (and don't use -O or -O2 or something).

Tommi
Dec 27 '05 #16
> The details of structured exception handling are described in Jeffrey
Richter's book, Programming Applications for Microsoft Windows.


See also:
Article "A Crash Course on the Depths of Win32™ Structured Exception
Handling"
by Matt Pietrek
Microsoft Systems Journal (January 1997)
http://www.microsoft.com/msj/0197/ex...exception.aspx

Regards,
Markus

Dec 28 '05 #17
> In Java, accessing an array beyond its allocated length generates
an exception. Since on my system (linux w/g++) accessing an
array beyond its allocation generally results in a seg fault, I am
trying to catch it with an exception handler to tell me where
the fault occurred.


I guess that the compiler should be corrected. Would you like to create
a bug report?
http://gcc.gnu.org/bugzilla/
http://en.wikipedia.org/wiki/GCJ

Do you find it under the known errors altready?

Regards,
Markus

Dec 28 '05 #18
Digital Puer wrote:
Ron Natalie wrote:
Digital Puer wrote:
Hi, I'm coming over from Java to C++, so please bear with me.
In C++, is there a way for me to use exceptions to catch
segmentation faults (e.g. when I access a location off
the end of an array)?

Thanks.
I have no clue what you mean by your allusion to Java. Segementation
faults are a foreign concept to Java as well. There's no portable
way of catching them in C++ (and in many implementations there's no
good way to catch them at all). There's no indication that accessing
off the end of an array generates a segmentation fault either. Chances
are you just access/clobber some other piece of memory.

In Java, accessing an array beyond its allocated length generates
an exception.


But not a segmentation fault.
Since on my system (linux w/g++) accessing an
array beyond its allocation generally results in a seg fault,


Sorry, but that's not true. What causes a segmentation fault is
accessing a piece of memory that's restricted (either not mapped,
or mapped for read only and you are trying to write it). Since
memory is allocated in chunks, and array allocations are interleaved
with other memory objects, the chances are unless you have a totally
wild subscript (much larger than the end), you won't get a segmentation
fault directly from the access.

As others pointed out C (and hence by inheritance C++) does no range
checking on it's arrays. You can use a different object in C++
(such as vector) to provide that. There are also packages out there
that instrument C++ in certain ways to do the check (at a substantial
performance penalty) to do these checks.

Your initial premise is wrong (that an array index error necessarily
generates a segmentation fault in C++) and there is no way to detect
either one.

Dec 28 '05 #19

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Miyra | last post by:
Hi. I'm working with an app that uses exceptions for control flow. These are code blocks where exceptions are thrown/caught regularly. A couple hundred exceptions occur per hour and they're caught...
40
by: Mark P | last post by:
I'm implementing an algorithm and the computational flow is a somewhat deep. That is, fcn A makes many calls to fcn B which makes many calls to fcn C, and so on. The return value of the outermost...
1
by: Anonieko | last post by:
Understanding and Using Exceptions (this is a really long post...only read it if you (a) don't know what try/catch is OR (b) actually write catch(Exception ex) or catch{ }) The first thing I...
8
by: Mathias | last post by:
Dear ng, I use the thread module (not threading) for a client/server app where I distribute large amounts of pickled data over ssh tunnels. Now I get regular Segmentation Faults during high load...
6
by: mast2as | last post by:
I have posted a few messages in the last few days about a project I am working on which is a quite simple parser. I ended up using the try/ catch structure as a general mechanism to control what's...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
by: marcoviolo | last post by:
Dear all, I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.