passage/minorGems/util/development/fortify/fortify.h
2025-10-03 02:19:59 -04:00

273 lines
10 KiB
C

/* fortify.h - V2.2 - All C & C++ source files to be fortified should #include this file */
/*
* This software is not public domain. All material in
* this archive is (C) Copyright 1995 Simon P. Bullen. The
* software is freely distributable, with the condition that
* no more than a nominal fee is charged for media.
* Everything in this distribution must be kept together, in
* original, unmodified form.
* The software may be modified for your own personal use,
* but modified files may not be distributed.
* The material is provided "as is" without warranty of
* any kind. The author accepts no responsibility for damage
* caused by this software.
* This software may not be used in any way by Microsoft
* Corporation or its subsidiaries, or current employees of
* Microsoft Corporation or its subsidiaries.
* This software may not be used for the construction,
* development, production, or testing of weapon systems of
* any kind.
* This software may not be used for the construction,
* development, production, or use of plants/installations
* which include the processing of radioactive/fissionable
* material.
*/
/*
* If you use this software at all, I'd love to hear from
* you. All questions, criticisms, suggestions, praise and
* postcards are most welcome.
*
* email: sbullen@cybergraphic.com.au
*
* snail: Simon P. Bullen
* PO BOX 12138
* A'Beckett St.
* Melbourne 3000
* Australia
*/
#ifndef __FORTIFY_H__
#define __FORTIFY_H__
#include <stdlib.h>
#include <string.h>
/* the user's options */
#include "ufortify.h"
/* Ensure the configuration parameters have sensible defaults */
#ifndef FORTIFY_STORAGE
#define FORTIFY_STORAGE
#endif
#ifndef FORTIFY_ALIGNMENT
#define FORTIFY_ALIGNMENT sizeof(double)
#endif
#ifndef FORTIFY_BEFORE_SIZE
#define FORTIFY_BEFORE_SIZE 32
#endif
#ifndef FORTIFY_BEFORE_VALUE
#define FORTIFY_BEFORE_VALUE 0xA3
#endif
#ifndef FORTIFY_AFTER_SIZE
#define FORTIFY_AFTER_SIZE 32
#endif
#ifndef FORTIFY_AFTER_VALUE
#define FORTIFY_AFTER_VALUE 0xA5
#endif
#ifndef FORTIFY_FILL_ON_ALLOCATE_VALUE
#define FORTIFY_FILL_ON_ALLOCATE_VALUE 0xA7
#endif
#ifndef FORTIFY_FILL_ON_DEALLOCATE_VALUE
#define FORTIFY_FILL_ON_DEALLOCATE_VALUE 0xA9
#endif
#ifndef FORTIFY_LOCK
#define FORTIFY_LOCK()
#endif
#ifndef FORTIFY_UNLOCK
#define FORTIFY_UNLOCK()
#endif
#ifndef FORTIFY_CHECKSUM_VALUE
#define FORTIFY_CHECKSUM_VALUE 0x0AD0
#endif
#ifndef FORTIFY_DELETE_STACK_SIZE
#define FORTIFY_DELETE_STACK_SIZE 256
#endif
#ifndef FORTIFY_NEW_HANDLER_FUNC
typedef void (*Fortify_NewHandlerFunc)(void);
#define FORTIFY_NEW_HANDLER_FUNC Fortify_NewHandlerFunc
#endif
/*
* Code to detect and configure for various compilers lives here.
*/
#ifdef __GNUG__
/* GCC configuration */
#define FORTIFY_PROVIDE_ARRAY_NEW
#define FORTIFY_PROVIDE_ARRAY_DELETE
#endif
#ifdef __BC45__
/* Borland C++ 4.5 configuration */
#define FORTIFY_PROVIDE_ARRAY_NEW
#define FORTIFY_PROVIDE_ARRAY_DELETE
#define FORTIFY_FAIL_ON_ZERO_MALLOC
#endif
#ifdef __SASC
/* SAS configuration */
#define FORTIFY_FAIL_ON_ZERO_MALLOC
#endif
/* Allocators */
#define Fortify_Allocator_malloc 0 /* ANSI C */
#define Fortify_Allocator_calloc 1 /* ANSI C */
#define Fortify_Allocator_realloc 2 /* ANSI C */
#define Fortify_Allocator_strdup 3 /* C */
#define Fortify_Allocator_new 4 /* ANSI C++ */
#define Fortify_Allocator_array_new 5 /* Some C++ */
/* Deallocators */
#define Fortify_Deallocator_nobody 0
#define Fortify_Deallocator_free 1 /* ANSI C */
#define Fortify_Deallocator_realloc 2 /* ANSI C */
#define Fortify_Deallocator_delete 3 /* ANSI C++ */
#define Fortify_Deallocator_array_delete 4 /* Some C++ */
/* Public Fortify Types */
typedef void (*Fortify_OutputFuncPtr)(const char *);
#ifdef __cplusplus
extern "C" {
#endif
/* Core Fortify Functions */
void *Fortify_Allocate (size_t size, unsigned char allocator, const char *file, unsigned long line);
void Fortify_Deallocate(void *uptr, unsigned char deallocator, const char *file, unsigned long line);
unsigned long Fortify_CheckAllMemory(const char *file, unsigned long line);
unsigned long Fortify_ListAllMemory (const char *file, unsigned long line);
unsigned long Fortify_DumpAllMemory (const char *file, unsigned long line);
int Fortify_CheckPointer(void *uptr, const char *file, unsigned long line);
void Fortify_LabelPointer(void *uptr, const char *label, const char *file, unsigned long line);
unsigned char Fortify_EnterScope(const char *file, unsigned long line);
unsigned char Fortify_LeaveScope(const char *file, unsigned long line);
void Fortify_OutputStatistics(const char *file, unsigned long line);
unsigned long Fortify_GetCurrentAllocation(const char *file, unsigned long line);
void Fortify_SetAllocationLimit(unsigned long Limit, const char *file, unsigned long line);
int Fortify_SetFailRate(int Percent);
Fortify_OutputFuncPtr Fortify_SetOutputFunc(Fortify_OutputFuncPtr Output);
void Fortify_Disable(const char *file, unsigned long line);
/* Fortify versions of the ANSI C memory allocation functions */
void *Fortify_malloc(size_t size, const char *file, unsigned long line);
void *Fortify_realloc(void *ptr, size_t new_size, const char *file, unsigned long line);
void *Fortify_calloc(size_t num, size_t size, const char *file, unsigned long line);
void Fortify_free(void *uptr, const char *file, unsigned long line);
/* Fortify versions of some non-ANSI C memory allocation functions */
#ifdef FORTIFY_STRDUP
char *Fortify_strdup(const char *oldStr, const char *file, unsigned long line);
#endif
#ifdef __cplusplus
/* Magic global variable */
extern int gbl_FortifyMagic;
#endif
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
#include <new.h>
/* Fortify versions of new and delete */
void *operator new(size_t size);
void *operator new(size_t size, const char *file, unsigned long line);
void operator delete(void *pointer);
void Fortify_PreDelete(const char *file, unsigned long line);
void Fortify_PostDelete();
/* Some compilers use a different new operator for newing arrays.
* This includes GNU G++ (2.6.0) and Borland C++ (4.02)
*/
#ifdef FORTIFY_PROVIDE_ARRAY_NEW
void *operator new[](size_t size);
void *operator new[](size_t size, const char *file, unsigned long line);
#endif
/* Some compilers provide a different delete operator for deleting arrays.
* This incldues GNU G++ (2.6.0)
*/
#ifdef FORTIFY_PROVIDE_ARRAY_DELETE
void operator delete[](void *pointer);
#endif
#endif /* __cplusplus */
#ifndef __FORTIFY_C__ /* Only define the macros if we're NOT in fortify.c */
/* Add file and line information to the fortify calls */
#ifdef FORTIFY
/* Core Fortify Functions */
#define Fortify_CheckAllMemory() Fortify_CheckAllMemory(__FILE__, __LINE__)
#define Fortify_ListAllMemory() Fortify_ListAllMemory (__FILE__, __LINE__)
#define Fortify_DumpAllMemory() Fortify_DumpAllMemory (__FILE__, __LINE__)
#define Fortify_CheckPointer(ptr) Fortify_CheckPointer(ptr, __FILE__, __LINE__)
#define Fortify_LabelPointer(ptr,str) Fortify_LabelPointer(ptr, str, __FILE__, __LINE__)
#define Fortify_EnterScope() Fortify_EnterScope(__FILE__, __LINE__)
#define Fortify_LeaveScope() Fortify_LeaveScope(__FILE__, __LINE__)
#define Fortify_OutputStatistics() Fortify_OutputStatistics(__FILE__, __LINE__)
#define Fortify_GetCurrentAllocation() Fortify_GetCurrentAllocation(__FILE__, __LINE__)
#define Fortify_SetAllocationLimit(x) Fortify_SetAllocationLimit(x, __FILE__, __LINE__)
#define Fortify_Disable() Fortify_Disable(__FILE__, __LINE__)
/* Fortify versions of the ANSI C memory allocation functions */
#define malloc(size) Fortify_malloc(size, __FILE__, __LINE__)
#define realloc(ptr,new_size) Fortify_realloc(ptr, new_size, __FILE__, __LINE__)
#define calloc(num,size) Fortify_calloc(num, size, __FILE__, __LINE__)
#define free(ptr) Fortify_free(ptr, __FILE__, __LINE__)
/* Fortify versions of some non-ANSI C memory allocation functions */
#ifdef FORTIFY_STRDUP
#define strdup(ptr) Fortify_strdup(ptr, __FILE__, __LINE__)
#endif
/* Fortify versions of new and delete */
#ifdef __cplusplus
#define Fortify_New new(__FILE__, __LINE__)
#define Fortify_Delete for(gbl_FortifyMagic = 1, \
Fortify_PreDelete(__FILE__, __LINE__); \
gbl_FortifyMagic; Fortify_PostDelete()) \
gbl_FortifyMagic = 0, delete
#define new Fortify_New
#define delete Fortify_Delete
#endif /* __cplusplus */
#else /* Define the special fortify functions away to nothing */
#define Fortify_CheckAllMemory() 0
#define Fortify_ListAllMemory() 0
#define Fortify_DumpAllMemory() 0
#define Fortify_CheckPointer(ptr) 1
#define Fortify_LabelPointer(ptr,str)
#define Fortify_SetOutputFunc() 0
#define Fortify_SetMallocFailRate(p) 0
#define Fortify_EnterScope() 0
#define Fortify_LeaveScope() 0
#define Fortify_OutputStatistics() 0
#define Fortify_GetCurrentAllocation() 0
#define Fortify_SetAllocationLimit(x) 0
#define Fortify_Disable() 0
#ifdef __cplusplus
#define Fortify_New new
#define Fortify_Delete delete
#endif /* __cplusplus */
#endif /* FORTIFY */
#endif /* __FORTIFY_C__ */
#endif /* __FORTIFY_H__ */