1
0
mirror of https://gitlab.com/80486DX2-66/gists synced 2024-12-28 00:00:18 +05:30
gists/c-programming/mem/safe_mem.h

63 lines
2.0 KiB
C

/*
* safe_mem.h
*
* A header-only library (macro collection) for safer memory management.
*
* Author: Intel A80486DX2-66
* License: Creative Commons Zero 1.0 Universal
*/
#ifndef _SAFE_MEM_H
#define _SAFE_MEM_H
#include <stdlib.h>
typedef unsigned char byte;
#define SAFE_FREE_ERROR_HOOK /* user-defined */
#define safe_free(ptr) do { \
/* prevents NULL-freeing and double freeing */ \
if (ptr != NULL) { \
free(ptr); \
ptr = NULL; \
} else { SAFE_FREE_ERROR_HOOK; } \
} while (0)
#define precise_malloc(nmemb, size) \
/* prevents incorrect casting */ \
malloc((size_t) (nmemb) * (size_t) (size))
/* secure_erase(dest, count): erases memory explicitly */
#ifdef __FreeBSD__
# define NO_SECURE_ERASE_WARRANTY 0
# define SECURE_ERASE_WARRANTY "OpenBSD/FreeBSD: explicit_bzero"
# include <strings.h>
# define secure_erase explicit_bzero
#elif defined(_WIN32)
# define NO_SECURE_ERASE_WARRANTY 0
# define SECURE_ERASE_WARRANTY "Microsoft Windows: SecureZeroMemory"
# include <windows.h>
# define secure_erase SecureZeroMemory
#elif __STDC_LIB_EXT1__
# define NO_SECURE_ERASE_WARRANTY 0
# define SECURE_ERASE_WARRANTY "C11+: memset_s"
# include <string.h>
# define secure_erase(dest, count) memset_s((dest), (count), 0, (count))
#else
# define NO_SECURE_ERASE_WARRANTY 1
# include <string.h>
# define secure_erase(dest, count) do { \
uintptr_t max = (uintptr_t) ((count) / sizeof(byte)); \
for (size_t i = 0; i < max; i++) \
*((byte*) (dest) + i) = 0; \
} while (0)
#endif
#endif /* _SAFE_MEM_H */