source: trunk/dll/fortify.h@ 1844

Last change on this file since 1844 was 1078, checked in by Steven Levine, 17 years ago

More Fortify infrastructure enhancements
Rework Fortify_SetOwner
Add Fortify_BecomeOwner
Avoid more spurious leak reports

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.4 KB
Line 
1
2/* $Id: fortify.h 1078 2008-07-19 04:08:02Z stevenhl $ */
3/* fortify.h - V2.2 - All C & C++ source files to be fortified should #include this file */
4
5/*
6 * This software is not public domain. All material in
7 * this archive is (C) Copyright 1995 Simon P. Bullen. The
8 * software is freely distributable, with the condition that
9 * no more than a nominal fee is charged for media.
10 * Everything in this distribution must be kept together, in
11 * original, unmodified form.
12 * The software may be modified for your own personal use,
13 * but modified files may not be distributed.
14 * The material is provided "as is" without warranty of
15 * any kind. The author accepts no responsibility for damage
16 * caused by this software.
17 * This software may not be used in any way by Microsoft
18 * Corporation or its subsidiaries, or current employees of
19 * Microsoft Corporation or its subsidiaries.
20 * This software may not be used for the construction,
21 * development, production, or testing of weapon systems of
22 * any kind.
23 * This software may not be used for the construction,
24 * development, production, or use of plants/installations
25 * which include the processing of radioactive/fissionable
26 * material.
27 */
28
29/*
30 * If you use this software at all, I'd love to hear from
31 * you. All questions, criticisms, suggestions, praise and
32 * postcards are most welcome.
33 *
34 * email: sbullen@cybergraphic.com.au
35 *
36 * snail: Simon P. Bullen
37 * PO BOX 12138
38 * A'Beckett St.
39 * Melbourne 3000
40 * Australia
41 */
42
43 /* 06 May 08 SHL Rework scope logic to be MT capable
44 17 Jul 08 SHL Add Fortify_PresetOwner Fortify_BecomeOwner Fortify_ChangeScope
45 18 Jul 08 SHL Rename Fortify_ChangeOwner to Fortify_BecomeOwner
46 18 Jul 08 SHL Add reworked Fortify_SetOwner
47 18 Jul 08 SHL Drop Fortify_PresetOwner
48 */
49
50#ifndef __FORTIFY_H__
51#define __FORTIFY_H__
52
53#include <stdlib.h> // Must include before fortify defintions
54// 16 Jan 08 SHL Ensure
55#ifdef __BORLANDC__
56#ifdef __OS2__
57#include <alloc.h> // Must include before fortify defintions
58#endif
59#endif
60#include <string.h>
61
62/* the user's options */
63#include "ufortify.h"
64
65#if defined(__WATCOMC__) && defined(_MT)
66#define MT_SCOPES 1
67#endif
68
69/* Ensure the configuration parameters have sensible defaults */
70#ifndef FORTIFY_STORAGE
71 #define FORTIFY_STORAGE
72#endif
73
74#ifndef FORTIFY_ALIGNMENT
75 #define FORTIFY_ALIGNMENT sizeof(double)
76#endif
77
78#ifndef FORTIFY_BEFORE_SIZE
79 #define FORTIFY_BEFORE_SIZE 32
80#endif
81#ifndef FORTIFY_BEFORE_VALUE
82 #define FORTIFY_BEFORE_VALUE 0xA3
83#endif
84
85#ifndef FORTIFY_AFTER_SIZE
86 #define FORTIFY_AFTER_SIZE 32
87#endif
88
89#ifndef FORTIFY_AFTER_VALUE
90 #define FORTIFY_AFTER_VALUE 0xA5
91#endif
92
93#ifndef FORTIFY_FILL_ON_ALLOCATE_VALUE
94 #define FORTIFY_FILL_ON_ALLOCATE_VALUE 0xA7
95#endif
96
97#ifndef FORTIFY_FILL_ON_DEALLOCATE_VALUE
98 #define FORTIFY_FILL_ON_DEALLOCATE_VALUE 0xA9
99#endif
100
101#ifndef FORTIFY_LOCK
102 #define FORTIFY_LOCK()
103#endif
104
105#ifndef FORTIFY_UNLOCK
106 #define FORTIFY_UNLOCK()
107#endif
108
109#ifndef FORTIFY_CHECKSUM_VALUE
110 #define FORTIFY_CHECKSUM_VALUE 0x0AD0
111#endif
112
113#ifndef FORTIFY_DELETE_STACK_SIZE
114 #define FORTIFY_DELETE_STACK_SIZE 256
115#endif
116
117#ifndef FORTIFY_NEW_HANDLER_FUNC
118 typedef void (*Fortify_NewHandlerFunc)(void);
119 #define FORTIFY_NEW_HANDLER_FUNC Fortify_NewHandlerFunc
120#endif
121
122/*
123 * Code to detect and configure for various compilers lives here.
124 */
125
126#ifdef __GNUG__
127 /* GCC configuration */
128 #define FORTIFY_PROVIDE_ARRAY_NEW
129 #define FORTIFY_PROVIDE_ARRAY_DELETE
130#endif
131
132#ifdef __BC45__
133 /* Borland C++ 4.5 configuration */
134 #define FORTIFY_PROVIDE_ARRAY_NEW
135 #define FORTIFY_PROVIDE_ARRAY_DELETE
136 #define FORTIFY_FAIL_ON_ZERO_MALLOC
137#endif
138
139// 16 Jan 08 SHL
140#ifdef __BORLANDC__
141#ifdef __OS2__
142 /* Borland C++ 2.0 OS/2 configuration */
143 #define FORTIFY_PROVIDE_ARRAY_NEW
144 #define FORTIFY_PROVIDE_ARRAY_DELETE
145 #define FORTIFY_FAIL_ON_ZERO_MALLOC
146 #define FORTIFY_STRDUP // have non-ANSI strdup()
147#endif
148#endif
149
150#ifdef __SASC
151 /* SAS configuration */
152 #define FORTIFY_FAIL_ON_ZERO_MALLOC
153#endif
154
155/* Allocators */
156#define Fortify_Allocator_malloc 0 /* ANSI C */
157#define Fortify_Allocator_calloc 1 /* ANSI C */
158#define Fortify_Allocator_realloc 2 /* ANSI C */
159#define Fortify_Allocator_strdup 3 /* C */
160#define Fortify_Allocator_new 4 /* ANSI C++ */
161#define Fortify_Allocator_array_new 5 /* Some C++ */
162
163/* Deallocators */
164#define Fortify_Deallocator_nobody 0
165#define Fortify_Deallocator_free 1 /* ANSI C */
166#define Fortify_Deallocator_realloc 2 /* ANSI C */
167#define Fortify_Deallocator_delete 3 /* ANSI C++ */
168#define Fortify_Deallocator_array_delete 4 /* Some C++ */
169
170/* Public Fortify Types */
171typedef void (*Fortify_OutputFuncPtr)(const char *);
172
173#ifdef __cplusplus
174extern "C" {
175#endif
176
177/* Core Fortify Functions */
178void *Fortify_Allocate (size_t size, unsigned char allocator, const char *file, unsigned long line);
179void Fortify_Deallocate(void *uptr, unsigned char deallocator, const char *file, unsigned long line);
180unsigned long Fortify_CheckAllMemory(const char *file, unsigned long line);
181unsigned long Fortify_ListAllMemory (const char *file, unsigned long line);
182unsigned long Fortify_DumpAllMemory (const char *file, unsigned long line);
183int Fortify_CheckPointer(void *uptr, const char *file, unsigned long line);
184void Fortify_LabelPointer(void *uptr, const char *label, const char *file, unsigned long line);
185unsigned char Fortify_EnterScope(const char *file, unsigned long line);
186unsigned char Fortify_LeaveScope(const char *file, unsigned long line);
187void Fortify_OutputStatistics(const char *file, unsigned long line);
188unsigned long Fortify_GetCurrentAllocation(const char *file, unsigned long line);
189void Fortify_SetAllocationLimit(unsigned long Limit, const char *file, unsigned long line);
190int Fortify_SetFailRate(int Percent);
191Fortify_OutputFuncPtr Fortify_SetOutputFunc(Fortify_OutputFuncPtr Output);
192void Fortify_Disable(const char *file, unsigned long line);
193
194#ifdef MT_SCOPES
195#if 0 // 18 Jul 08 SHL fixme to be gone
196void Fortify_PresetOwner(long lOwnerTID);
197#endif
198void Fortify_BecomeOwner(void *pBlock);
199void Fortify_SetOwner(void *pBlock, unsigned ordinal);
200void Fortify_ChangeScope(void *pBlock, int delta);
201void Fortify_SetScope(void *pBlock, unsigned char scope);
202#endif
203
204/* Fortify versions of the ANSI C memory allocation functions */
205void *Fortify_malloc(size_t size, const char *file, unsigned long line);
206void *Fortify_realloc(void *ptr, size_t new_size, const char *file, unsigned long line);
207void *Fortify_calloc(size_t num, size_t size, const char *file, unsigned long line);
208void Fortify_free(void *uptr, const char *file, unsigned long line);
209
210/* Fortify versions of some non-ANSI C memory allocation functions */
211#ifdef FORTIFY_STRDUP
212 char *Fortify_strdup(const char *oldStr, const char *file, unsigned long line);
213#endif
214
215#ifdef __cplusplus
216/* Magic global variable */
217extern int gbl_FortifyMagic;
218#endif
219
220#ifdef __cplusplus
221}
222#endif
223
224#ifdef __cplusplus
225#include <new.h>
226
227 /* Fortify versions of new and delete */
228 void *operator new(size_t size);
229 void *operator new(size_t size, const char *file, int line); // 16 Jan 08 SHL
230 void operator delete(void *pointer);
231 void Fortify_PreDelete(const char *file, int line); // 16 Jan 08 SHL
232 void Fortify_PostDelete();
233
234 /* Some compilers use a different new operator for newing arrays.
235 * This includes GNU G++ (2.6.0) and Borland C++ (4.02)
236 */
237 #ifdef FORTIFY_PROVIDE_ARRAY_NEW
238 void *operator new[](size_t size);
239 void *operator new[](size_t size, const char *file, unsigned long line); // 16 Jan 08 SHL
240 #endif
241
242 /* Some compilers provide a different delete operator for deleting arrays.
243 * This incldues GNU G++ (2.6.0)
244 */
245 #ifdef FORTIFY_PROVIDE_ARRAY_DELETE
246 void operator delete[](void *pointer);
247 #endif
248
249#endif /* __cplusplus */
250
251#ifndef __FORTIFY_C__ /* Only define the macros if we're NOT in fortify.c */
252
253/* Add file and line information to the fortify calls */
254#ifdef FORTIFY
255 /* Core Fortify Functions */
256 #define Fortify_CheckAllMemory() Fortify_CheckAllMemory(__FILE__, __LINE__)
257 #define Fortify_ListAllMemory() Fortify_ListAllMemory (__FILE__, __LINE__)
258 #define Fortify_DumpAllMemory() Fortify_DumpAllMemory (__FILE__, __LINE__)
259 #define Fortify_CheckPointer(ptr) Fortify_CheckPointer(ptr, __FILE__, __LINE__)
260 #define Fortify_LabelPointer(ptr,str) Fortify_LabelPointer(ptr, str, __FILE__, __LINE__)
261 #define Fortify_EnterScope() Fortify_EnterScope(__FILE__, __LINE__)
262 #define Fortify_LeaveScope() Fortify_LeaveScope(__FILE__, __LINE__)
263 #define Fortify_OutputStatistics() Fortify_OutputStatistics(__FILE__, __LINE__)
264 #define Fortify_GetCurrentAllocation() Fortify_GetCurrentAllocation(__FILE__, __LINE__)
265 #define Fortify_SetAllocationLimit(x) Fortify_SetAllocationLimit(x, __FILE__, __LINE__)
266 #define Fortify_Disable() Fortify_Disable(__FILE__, __LINE__)
267
268 /* Fortify versions of the ANSI C memory allocation functions */
269 #define malloc(size) Fortify_malloc(size, __FILE__, __LINE__)
270 #define realloc(ptr,new_size) Fortify_realloc(ptr, new_size, __FILE__, __LINE__)
271 #define calloc(num,size) Fortify_calloc(num, size, __FILE__, __LINE__)
272 #define free(ptr) Fortify_free(ptr, __FILE__, __LINE__)
273
274 /* Fortify versions of some non-ANSI C memory allocation functions */
275 #ifdef FORTIFY_STRDUP
276 #define strdup(ptr) Fortify_strdup(ptr, __FILE__, __LINE__)
277 #endif
278
279 /* Fortify versions of new and delete */
280 #ifdef __cplusplus
281 #define Fortify_New new(__FILE__, __LINE__)
282 #define Fortify_Delete for(gbl_FortifyMagic = 1, \
283 Fortify_PreDelete(__FILE__, __LINE__); \
284 gbl_FortifyMagic; Fortify_PostDelete()) \
285 gbl_FortifyMagic = 0, delete
286 #define new Fortify_New
287 #define delete Fortify_Delete
288 #endif /* __cplusplus */
289
290#else /* Define the special fortify functions away to nothing */
291
292 // 17 Jul 08 SHL fixme to avoid spurious OpenWatcom warnings
293 #define Fortify_CheckAllMemory() 0
294 #define Fortify_ListAllMemory() 0
295 #define Fortify_DumpAllMemory() 0
296 #define Fortify_CheckPointer(ptr) 1
297 #define Fortify_LabelPointer(ptr,str)
298 #define Fortify_SetOutputFunc() 0
299 #define Fortify_SetMallocFailRate(p) 0
300 #define Fortify_EnterScope() 0
301 #define Fortify_LeaveScope() 0
302 #define Fortify_OutputStatistics() 0
303 #define Fortify_GetCurrentAllocation() 0
304 #define Fortify_SetAllocationLimit(x) 0
305 #define Fortify_Disable() 0
306#if 0 // 18 Jul 08 SHL fixme to be gone
307 #define Fortify_PresetOwner() 0
308#endif
309 #define Fortify_BecomeOwner 0
310 #define Fortify_SetOwner 0
311 #define Fortify_ChangeScope 0
312 #define Fortify_SetScope 0
313
314 #ifdef __cplusplus
315 #define Fortify_New new
316 #define Fortify_Delete delete
317 #endif /* __cplusplus */
318
319#endif /* FORTIFY */
320#endif /* __FORTIFY_C__ */
321#endif /* __FORTIFY_H__ */
Note: See TracBrowser for help on using the repository browser.