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_strdup(const char *); | ||||||
| char * safe_alloc nasm_strndup(const char *, size_t); | 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_new(p) ((p) = nasm_zalloc(sizeof(*(p)))) | ||||||
| #define nasm_newn(p,n) ((p) = nasm_calloc(sizeof(*(p)),(n))) | #define nasm_newn(p,n) ((p) = nasm_calloc(sizeof(*(p)),(n))) | ||||||
| /* | /* | ||||||
|  * Careful: nasm_delete() is not side-effect safe. |  * This is broken on platforms where there are pointers which don't | ||||||
|  * Any ideas how to fix that? |  * 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)))) | #define nasm_zero(p) (memset((p), 0, sizeof(*(p)))) | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user