Skip to content

Address sanitization

include/mem/asan.h View source View on GitHub
bool asan_shadow_is_poison(uint8_t s);
void asan_init(void);
enum errno asan_shadow_install(vaddr_t base, size_t len);
void asan_shadow_release(vaddr_t base, size_t len);
void asan_alloc(void *addr, size_t requested, size_t slot);
void asan_free(void *addr, size_t slot);
void asan_poison(void *addr, size_t size);
void asan_unpoison(void *addr, size_t size);
void asan_init(void);
enum errno asan_shadow_install(vaddr_t base, size_t len);
void asan_shadow_release(vaddr_t base, size_t len);
void asan_alloc(void *addr, size_t requested, size_t slot);
void asan_free(void *addr, size_t slot);
void asan_poison(void *addr, size_t size);
void asan_unpoison(void *addr, size_t size);
#define ASAN_SHADOW_SCALE 3ULL /* 1 shadow byte per 8 real bytes */
#define ASAN_SHADOW_OFFSET 0xDFFFFE0000000000
#define ASAN_SHADOW_ADDR(a) \
    ((uintptr_t) (((uintptr_t) (a) >> ASAN_SHADOW_SCALE) + ASAN_SHADOW_OFFSET))
#define ASAN_GRANULE (1ULL << ASAN_SHADOW_SCALE)
#define ASAN_REDZONE 16 /* optional redzone per allocation */
#define ASAN_POISON_VALUE 0xFF        /* generic: never handed out */
#define ASAN_POISON_HEAP_REDZONE 0xFA /* slack around/inside a live slot */
#define ASAN_POISON_HEAP_FREED 0xFD   /* was live, has been freed */
#define ASAN_ABORT_IF_NOT_READY() \
    do { \
        if (!asan_ready) \
            return; \
    } while (0)
#define asan_log(lvl, fmt, ...) \
    log(LOG_SITE(asan), LOG_HANDLE(asan), lvl, fmt, ##__VA_ARGS__)
#define asan_err(fmt, ...) asan_log(LOG_ERROR, fmt, ##__VA_ARGS__)
#define asan_warn(fmt, ...) asan_log(LOG_WARN, fmt, ##__VA_ARGS__)
#define asan_info(fmt, ...) asan_log(LOG_INFO, fmt, ##__VA_ARGS__)
#define asan_debug(fmt, ...) asan_log(LOG_DEBUG, fmt, ##__VA_ARGS__)
#define asan_trace(fmt, ...) asan_log(LOG_TRACE, fmt, ##__VA_ARGS__)