109 lines
3.1 KiB
C
109 lines
3.1 KiB
C
|
|
/*
|
|
** NOTE: Running this program in a Win32 or Unix environment
|
|
** will probably result in a segmentation fault or protection
|
|
** error. These errors may be caused by MEMWATCH when it's
|
|
** looking at memory to see if it owns it, or may be caused by
|
|
** the test program writing to memory it does not own.
|
|
**
|
|
** MEMWATCH has two functions called 'mwIsReadAddr()' and
|
|
** 'mwIsSafeAddr()', which are system-specific.
|
|
** If they are implemented for your system, and works
|
|
** correctly, MEMWATCH will identify garbage pointers and
|
|
** avoid causing segmentation faults, GP's etc.
|
|
**
|
|
** If they are NOT implemented, count on getting the core
|
|
** dumped when running this test program! As of this writing,
|
|
** the safe-address checking has been implemented for Win32
|
|
** and ANSI-C compliant systems. The ANSI-C checking traps
|
|
** SIGSEGV and uses setjmp/longjmp to resume processing,
|
|
** but I've only tested this under Linux (where it works).
|
|
**
|
|
** Note for Win95 users: The Win32 IsBadReadPtr() and it's
|
|
** similar functions can return incorrect values. This has
|
|
** not happened under WinNT, though, just Win95.
|
|
**
|
|
** 980318 Johan Lindh
|
|
**
|
|
*/
|
|
|
|
#include "../config.h"
|
|
#include "libs.h"
|
|
#include "memwatch.h"
|
|
|
|
#error "Hey! Don't just compile this program, read the comments first!"
|
|
#ifndef SIGSEGV
|
|
#error SIGNAL.H does not define SIGSEGV; running this program WILL cause a core dump/crash!
|
|
#endif
|
|
|
|
main()
|
|
{
|
|
char *p;
|
|
|
|
/* Collect stats on a line number basis */
|
|
mwStatistics( 2 );
|
|
|
|
/* Slows things down, but OK for this test prg */
|
|
/* mwAutoCheck( 1 ); */
|
|
|
|
TRACE("Hello world!\n");
|
|
|
|
p = malloc(210);
|
|
free(p);
|
|
p = malloc(20);
|
|
p = malloc(200); /* causes unfreed error */
|
|
p[-1] = 0; /* causes underflow error */
|
|
free(p);
|
|
|
|
p = malloc(100);
|
|
p[ -(int)(sizeof(long)*8) ] = -1; /* try to damage MW's heap chain */
|
|
free( p ); /* should cause relink */
|
|
|
|
mwSetAriFunc( mwAriHandler );
|
|
ASSERT(1==2);
|
|
|
|
mwLimit(1000000);
|
|
mwNoMansLand( MW_NML_ALL );
|
|
|
|
/* These may cause a general protection fault (segmentation fault) */
|
|
/* They're here to help test the no-mans-land protection */
|
|
if( mwIsSafeAddr(p+50000,1) ) {
|
|
TRACE("Killing byte at %p\n", p+50000);
|
|
*(p+50000) = 0;
|
|
}
|
|
if( mwIsSafeAddr(p+30000,1) ) {
|
|
TRACE("Killing byte at %p\n", p+30000);
|
|
*(p+30000) = 0;
|
|
}
|
|
if( mwIsSafeAddr(p+1000,1) ) {
|
|
TRACE("Killing byte at %p\n", p+1000);
|
|
*(p+1000) = 0;
|
|
}
|
|
if( mwIsSafeAddr(p-100,1) ) {
|
|
TRACE("Killing byte at %p\n", p-100);
|
|
*(p-100) = 0;
|
|
}
|
|
|
|
/* This may cause a GP fault as well, since MW data buffers */
|
|
/* have been damaged in the above killing spree */
|
|
CHECK();
|
|
|
|
p = malloc(12000);
|
|
p[-5] = 1;
|
|
p[-10] = 2;
|
|
p[-15] = 3;
|
|
p[-20] = 4;
|
|
|
|
/* This may cause a GP fault since MW's buffer list may have */
|
|
/* been damaged by above killing, and it will try to repair it. */
|
|
free(p);
|
|
|
|
p = realloc(p,10); /* causes realloc: free'd from error */
|
|
|
|
/* May cause GP since MW will inspect the memory to see if it owns it. */
|
|
free( (void*)main );
|
|
|
|
return 0;
|
|
}
|
|
|