On 15 Feb, 22:07, Bruce Wheeler <[email protected]> wrote:
> On Mon, 15 Feb 2010 02:42:28 -0800 (PST), James Kanze

> <[email protected]> wrote:
> >How do you get a memory fault to simply return a bad return
> >code under Windows?

> >I'm interested in writing regression test programs which run
> >in batch mode.  At present, if my code has an assertion
> >failure, I get a pop-up window with an offer to go to the
> >debugger---this will be worthless on the remote machine (and
> >is a pain even on my machine, if I happen to hit a sequence
> >of tests which each trigger the same error).

> The dialog box is called from abort(), which is called by
> assert().  Maybe there's a way to change this behavior, but
> I'm not aware of a way.

I would expect abort() to raise a signal, as specified in the C
and C++ standards, and that it was the default signal handler
which called up the dialog box, or the system, when a signal is
uncaught.

> A kludge for the assert problem could be something like

> void myAssert(int expression)
> {
>     /* text output and possible other processing */
>     exit(EXIT_FAILURE);
> }

> and call myAssert() instead of assert(). Note that exit(n)
> exits with status n and does not create the dialog box.

The problem isn't just assert---it's anything which would have
caused the program to crash.  If a program crashes during a
regression test (which is run as a batch process, often
overnight), I would expect only a specific error status, and to
be able to go on to the next test.

> (snip)

> >I've also tried converting the structured exception to a C++
> >exception, as per
> >http://msdn.microsoft.com/en-us/library/ms680621%28VS.85%29.aspx,
> >and catching the exception to return EXIT_FAILURE, with no
> >success either.

> That should probably work. Maybe you aren't catching the
> exception properly, and terminate() is being called. Note that
> terminate() also calls abort() by default. You can change this
> by calling set_terminate() with a function which exits instead
> of aborting.
> See http://msdn.microsoft.com/en-us/library/k0k9c522.aspx for
> an example of this.

I know how to change the behavior in case of an uncaught
exception.  I intentionally made my exception derive from
std::runtime_error, and caught std::exception, so that I'd fall
into the usual cases.

Anyway, it seems to be working except for assert, so possibly
changing the assert macro would do the trick.  (If I find the
original code which caused the problems, I'll repost.  And it
may depend on the compiler options.)

> >So how do you run a suite of regression tests under Windows?

> myAssert() above would be a possibility if you are only trying
> to capture asserts.

Asserts are just part of the issue.  I'm concerned about
anything which might cause the program to crash.

> I tend to just print an error message and
> call exit(n) directly. Note that n can (nonportably) have
> values other than EXIT_SUCCESS and EXIT_FAILURE under Windows,
> so a batch file can branch based on different types of error
> returns.

I know.  I use this in my actual code (since I'm only concerned
with portability between Windows and various Unix).

--
James Kanze

-- 
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php

Reply via email to