1*d6d1731bSAleksandr Iashchenko /* SPDX-License-Identifier: BSD-2-Clause */ 2*d6d1731bSAleksandr Iashchenko /* 3*d6d1731bSAleksandr Iashchenko * Copyright (c) 2026, Linutronix GmbH 4*d6d1731bSAleksandr Iashchenko */ 5*d6d1731bSAleksandr Iashchenko #ifndef __ASAN_TEST_H 6*d6d1731bSAleksandr Iashchenko #define __ASAN_TEST_H 7*d6d1731bSAleksandr Iashchenko 8*d6d1731bSAleksandr Iashchenko #include <compiler.h> 9*d6d1731bSAleksandr Iashchenko #include <stddef.h> 10*d6d1731bSAleksandr Iashchenko 11*d6d1731bSAleksandr Iashchenko /* 12*d6d1731bSAleksandr Iashchenko * Context used by ASan runtime tests. 13*d6d1731bSAleksandr Iashchenko */ 14*d6d1731bSAleksandr Iashchenko struct asan_test_ctx { 15*d6d1731bSAleksandr Iashchenko char *pmalloc1; 16*d6d1731bSAleksandr Iashchenko char *pmalloc2[3]; 17*d6d1731bSAleksandr Iashchenko char write_value; 18*d6d1731bSAleksandr Iashchenko void (*write_func)(char *buf, size_t pos, char value); 19*d6d1731bSAleksandr Iashchenko char (*read_func)(char *buf, size_t pos); 20*d6d1731bSAleksandr Iashchenko void *(*memcpy_func)(void *__restrict dst, 21*d6d1731bSAleksandr Iashchenko const void *__restrict src, size_t size); 22*d6d1731bSAleksandr Iashchenko void *(*memset_func)(void *buf, int val, size_t size); 23*d6d1731bSAleksandr Iashchenko void (*free_func)(void *ptr); 24*d6d1731bSAleksandr Iashchenko }; 25*d6d1731bSAleksandr Iashchenko 26*d6d1731bSAleksandr Iashchenko 27*d6d1731bSAleksandr Iashchenko /* 28*d6d1731bSAleksandr Iashchenko * Initialize ASan test context. 29*d6d1731bSAleksandr Iashchenko * Allocations and function pointers are set up for subsequent tests. 30*d6d1731bSAleksandr Iashchenko */ 31*d6d1731bSAleksandr Iashchenko void asan_test_init(struct asan_test_ctx *ctx); 32*d6d1731bSAleksandr Iashchenko 33*d6d1731bSAleksandr Iashchenko /* 34*d6d1731bSAleksandr Iashchenko * Release any resources owned by the context. 35*d6d1731bSAleksandr Iashchenko */ 36*d6d1731bSAleksandr Iashchenko void asan_test_deinit(struct asan_test_ctx *ctx); 37*d6d1731bSAleksandr Iashchenko 38*d6d1731bSAleksandr Iashchenko /* 39*d6d1731bSAleksandr Iashchenko * Helper to run a single ASan test. 40*d6d1731bSAleksandr Iashchenko * 41*d6d1731bSAleksandr Iashchenko * Returns 0 on success, or a negative error code on internal failure. 42*d6d1731bSAleksandr Iashchenko */ 43*d6d1731bSAleksandr Iashchenko int asan_call_test(struct asan_test_ctx *ctx, 44*d6d1731bSAleksandr Iashchenko void (*test)(struct asan_test_ctx *ctx), 45*d6d1731bSAleksandr Iashchenko const char __unused *desc); 46*d6d1731bSAleksandr Iashchenko 47*d6d1731bSAleksandr Iashchenko /* Individual ASan test cases */ 48*d6d1731bSAleksandr Iashchenko void asan_test_stack(struct asan_test_ctx *ctx); 49*d6d1731bSAleksandr Iashchenko void asan_test_global_stat(struct asan_test_ctx *ctx); 50*d6d1731bSAleksandr Iashchenko void asan_test_global_ro(struct asan_test_ctx *ctx); 51*d6d1731bSAleksandr Iashchenko void asan_test_global(struct asan_test_ctx *ctx); 52*d6d1731bSAleksandr Iashchenko void asan_test_malloc(struct asan_test_ctx *ctx); 53*d6d1731bSAleksandr Iashchenko void asan_test_malloc2(struct asan_test_ctx *ctx); 54*d6d1731bSAleksandr Iashchenko void asan_test_use_after_free(struct asan_test_ctx *ctx); 55*d6d1731bSAleksandr Iashchenko void asan_test_memcpy_dst(struct asan_test_ctx *ctx); 56*d6d1731bSAleksandr Iashchenko void asan_test_memcpy_src(struct asan_test_ctx *ctx); 57*d6d1731bSAleksandr Iashchenko void asan_test_memset(struct asan_test_ctx *ctx); 58*d6d1731bSAleksandr Iashchenko 59*d6d1731bSAleksandr Iashchenko #endif /* __ASAN_TEST_H */ 60