2002-10-12 11:37:38 +00:00
|
|
|
/**
|
|
|
|
* $Id$
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2008-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* $Id$
|
|
|
|
* Copyright (C) 2001 NaN Technologies B.V.
|
|
|
|
* Simple test of memory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Number of chunks to test with */
|
|
|
|
#define NUM_BLOCKS 10
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
2010-02-16 16:47:41 +00:00
|
|
|
static void mem_error_cb(const char *errorStr)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s", errorStr);
|
|
|
|
fflush(stderr);
|
|
|
|
}
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
int main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int verbose = 0;
|
|
|
|
int error_status = 0;
|
|
|
|
int retval = 0;
|
|
|
|
int *ip;
|
|
|
|
|
|
|
|
void *p[NUM_BLOCKS];
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------- */
|
2011-04-21 15:53:30 +00:00
|
|
|
switch (argc) {
|
2002-10-12 11:37:38 +00:00
|
|
|
case 2:
|
|
|
|
verbose = atoi(argv[1]);
|
|
|
|
if (verbose < 0) verbose = 0;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
default:
|
|
|
|
verbose = 0;
|
|
|
|
}
|
|
|
|
if (verbose) {
|
|
|
|
fprintf(stderr,"\n*** Simple memory test\n|\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
|
|
/* Round one, do a normal allocation, and free the blocks again. */
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
|
|
/* flush mem lib output to stderr */
|
2010-02-16 16:47:41 +00:00
|
|
|
MEM_set_error_callback(mem_error_cb);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
for (i = 0; i < NUM_BLOCKS; i++) {
|
|
|
|
int blocksize = 10000;
|
|
|
|
char tagstring[1000];
|
|
|
|
if (verbose >1) printf("|--* Allocating block %d\n", i);
|
|
|
|
sprintf(tagstring,"Memblock no. %d : ", i);
|
|
|
|
p[i]= MEM_callocN(blocksize, strdup(tagstring));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* report on that */
|
|
|
|
if (verbose > 1) MEM_printmemlist();
|
|
|
|
|
|
|
|
/* memory is there: test it */
|
|
|
|
error_status = MEM_check_memory_integrity();
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
if (error_status) {
|
|
|
|
fprintf(stderr, "|--* Memory test FAILED\n|\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "|--* Memory tested as good (as it should be)\n|\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_BLOCKS; i++) {
|
|
|
|
MEM_freeN(p[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
|
|
/* Round two, do a normal allocation, and corrupt some blocks. */
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
|
|
/* switch off, because it will complain about some things. */
|
2006-03-23 17:45:40 +00:00
|
|
|
MEM_set_error_callback(NULL);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
for (i = 0; i < NUM_BLOCKS; i++) {
|
|
|
|
int blocksize = 10000;
|
|
|
|
char tagstring[1000];
|
|
|
|
if (verbose >1) printf("|--* Allocating block %d\n", i);
|
|
|
|
sprintf(tagstring,"Memblock no. %d : ", i);
|
|
|
|
p[i]= MEM_callocN(blocksize, strdup(tagstring));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now corrupt a few blocks...*/
|
|
|
|
ip = (int*) p[5] - 50 ;
|
|
|
|
for (i = 0; i< 1000; i++,ip++) *ip = i+1;
|
|
|
|
ip = (int*) p[6];
|
|
|
|
*(ip+10005) = 0;
|
|
|
|
|
|
|
|
retval = MEM_check_memory_integrity();
|
|
|
|
|
|
|
|
/* the test should have failed */
|
|
|
|
error_status |= !retval;
|
|
|
|
if (verbose) {
|
|
|
|
if (retval) {
|
|
|
|
fprintf(stderr, "|--* Memory test failed (as it should be)\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "|--* Memory test FAILED to find corrupted blocks \n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_BLOCKS; i++) {
|
|
|
|
MEM_freeN(p[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (verbose && error_status) {
|
|
|
|
fprintf(stderr,"|--* Memory was corrupted\n");
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
|
|
if (verbose) {
|
|
|
|
if (error_status) {
|
|
|
|
fprintf(stderr,"|\n|--* Errors were detected\n");
|
|
|
|
} else {
|
|
|
|
fprintf(stderr,"|\n|--* Test exited succesfully\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr,"|\n*** Finished test\n\n");
|
|
|
|
}
|
|
|
|
return error_status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|