It has been a long time since I have coded in C++ but I seem to remember that a program can set a global memory error handler. Then this error can do something marginally appropriate for the problem. In our situation, we used it to try to log a short static message and exit the program.

When we had this in place we never checked the return of any object allocation.

Daniel Glassey wrote:

On 10/06/05, Troy A. Griffitts <[EMAIL PROTECTED]> wrote:
Hey Daniel,
       Thanks for the catch, but we don't check for successful memory
allocation anywhere in the engine.  I'm not sure what we'd do if we ran
out of memory.  Gracefully degradating from such a state is a complex
problem.  Also, our engine doesn't use try/catch/throw error handling,
so throwing anything would cross a consistency line.  Note: not debating
that we SHOULDN'T use exception error handling, only that we currently
do not.

Fair enough to not throw as long as it does something. It is one thing
to not check and another thing to allow someone to overwrite bits of
memory that they shouldn't.

The *end = 0; is a _really_ bad idea if you aren't certain that that
memory has been allocated.

d


Daniel Glassey wrote:
Hi,
While encountering other problems on my machine I've found a potential
problem with SWBuf::assureSize.

It reallocs or mallocs the buffer but doesn't check that that has
succeeded before setting the 'end' of the buffer to 0.

Patch attached that does a check. Thought I'd just check before checking it in.

Regards,
Daniel


------------------------------------------------------------------------

Index: include/swbuf.h
===================================================================
--- include/swbuf.h   (revision 1827)
+++ include/swbuf.h   (working copy)
@@ -58,6 +58,7 @@
                     long size = (end - buf);
                     checkSize += 128;
                     buf = (char *)((allocSize) ? realloc(buf, checkSize) : 
malloc(checkSize));
+                     if (!buf) throw("Failed to extend SWBuf buffer");
                     allocSize = checkSize;
                     end = (buf + size);
                     *end = 0;

_______________________________________________
sword-devel mailing list: [email protected]
http://www.crosswire.org/mailman/listinfo/sword-devel
Instructions to unsubscribe/change your settings at above page

_______________________________________________
sword-devel mailing list: [email protected]
http://www.crosswire.org/mailman/listinfo/sword-devel
Instructions to unsubscribe/change your settings at above page

Reply via email to