xref: /optee_os/lib/libutils/ext/include/asan_test.h (revision d6d1731bef3d306080076b5a9be15682e353241a)
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