mirror of
				https://github.com/netwide-assembler/nasm.git
				synced 2025-10-10 00:25:06 -04:00 
			
		
		
		
	nasm_delete(): ugly hack to make it side-effect-free
Use an ugly hack to make nasm_delete() side effect free. This assumes all pointers have the same internal NULL pointer representation as void *, however, we already assume zero-initialized memory will represent a NULL pointer, so hopefully this is okay on any platform we actually care about. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
		| @@ -153,13 +153,24 @@ void nasm_free(void *); | ||||
| char * safe_alloc nasm_strdup(const char *); | ||||
| char * safe_alloc nasm_strndup(const char *, size_t); | ||||
|  | ||||
| /* Assert the argument is a pointer without evaluating it */ | ||||
| #define nasm_assert_pointer(p) ((void)sizeof(*(p))) | ||||
|  | ||||
| #define nasm_new(p) ((p) = nasm_zalloc(sizeof(*(p)))) | ||||
| #define nasm_newn(p,n) ((p) = nasm_calloc(sizeof(*(p)),(n))) | ||||
| /* | ||||
|  * Careful: nasm_delete() is not side-effect safe. | ||||
|  * Any ideas how to fix that? | ||||
|  * This is broken on platforms where there are pointers which don't | ||||
|  * match void * in their internal layout.  It unfortunately also | ||||
|  * loses any "const" part of the argument, although hopefully the | ||||
|  * compiler will warn in that case. | ||||
|  */ | ||||
| #define nasm_delete(p) do { nasm_free(p); (p) = NULL; } while (0) | ||||
| #define nasm_delete(p)						\ | ||||
|     do {							\ | ||||
| 	void **_pp = (void **)&(p);				\ | ||||
| 	nasm_assert_pointer(p);					\ | ||||
| 	nasm_free(*_pp);					\ | ||||
| 	*_pp = NULL;						\ | ||||
|     } while (0) | ||||
| #define nasm_zero(p) (memset((p), 0, sizeof(*(p)))) | ||||
|  | ||||
| /* | ||||
|   | ||||
		Reference in New Issue
	
	Block a user