Blame view
lib/test_ubsan.c
2.37 KB
854686f4e lib: add testing ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// SPDX-License-Identifier: GPL-2.0 #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> typedef void(*test_ubsan_fp)(void); static void test_ubsan_add_overflow(void) { volatile int val = INT_MAX; val += 2; } static void test_ubsan_sub_overflow(void) { volatile int val = INT_MIN; volatile int val2 = 2; val -= val2; } static void test_ubsan_mul_overflow(void) { volatile int val = INT_MAX / 2; val *= 3; } static void test_ubsan_negate_overflow(void) { volatile int val = INT_MIN; val = -val; } static void test_ubsan_divrem_overflow(void) { volatile int val = 16; volatile int val2 = 0; val /= val2; } |
854686f4e lib: add testing ... |
44 45 46 47 48 49 50 51 52 53 54 |
static void test_ubsan_shift_out_of_bounds(void) { volatile int val = -1; int val2 = 10; val2 <<= val; } static void test_ubsan_out_of_bounds(void) { volatile int i = 4, j = 5; |
9d7ca61b1 lib/test_ubsan.c:... |
55 |
volatile int arr[4]; |
854686f4e lib: add testing ... |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
arr[j] = i; } static void test_ubsan_load_invalid_value(void) { volatile char *dst, *src; bool val, val2, *ptr; char c = 4; dst = (char *)&val; src = &c; *dst = *src; ptr = &val2; val2 = val; } static void test_ubsan_null_ptr_deref(void) { volatile int *ptr = NULL; int val; val = *ptr; } |
317506009 lib/test_ubsan.c:... |
81 |
static void test_ubsan_misaligned_access(void) |
854686f4e lib: add testing ... |
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
{ volatile char arr[5] __aligned(4) = {1, 2, 3, 4, 5}; volatile int *ptr, val = 6; ptr = (int *)(arr + 1); *ptr = val; } static void test_ubsan_object_size_mismatch(void) { /* "((aligned(8)))" helps this not into be misaligned for ptr-access. */ volatile int val __aligned(8) = 4; volatile long long *ptr, val2; ptr = (long long *)&val; val2 = *ptr; } static const test_ubsan_fp test_ubsan_array[] = { test_ubsan_add_overflow, test_ubsan_sub_overflow, test_ubsan_mul_overflow, test_ubsan_negate_overflow, test_ubsan_divrem_overflow, |
854686f4e lib: add testing ... |
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
test_ubsan_shift_out_of_bounds, test_ubsan_out_of_bounds, test_ubsan_load_invalid_value, //test_ubsan_null_ptr_deref, /* exclude it because there is a crash */ test_ubsan_misaligned_access, test_ubsan_object_size_mismatch, }; static int __init test_ubsan_init(void) { unsigned int i; for (i = 0; i < ARRAY_SIZE(test_ubsan_array); i++) test_ubsan_array[i](); (void)test_ubsan_null_ptr_deref; /* to avoid unsed-function warning */ return 0; } module_init(test_ubsan_init); static void __exit test_ubsan_exit(void) { /* do nothing */ } module_exit(test_ubsan_exit); MODULE_AUTHOR("Jinbum Park <jinb.park7@gmail.com>"); MODULE_LICENSE("GPL v2"); |