1*0f4c859eSApple OSS Distributions /* 2*0f4c859eSApple OSS Distributions * Copyright (c) 2018-2021 Apple Inc. All rights reserved. 3*0f4c859eSApple OSS Distributions * 4*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*0f4c859eSApple OSS Distributions * 6*0f4c859eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*0f4c859eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*0f4c859eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*0f4c859eSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*0f4c859eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*0f4c859eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*0f4c859eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*0f4c859eSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*0f4c859eSApple OSS Distributions * 15*0f4c859eSApple OSS Distributions * Please obtain a copy of the License at 16*0f4c859eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*0f4c859eSApple OSS Distributions * 18*0f4c859eSApple OSS Distributions * The Original Code and all software distributed under the License are 19*0f4c859eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*0f4c859eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*0f4c859eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*0f4c859eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*0f4c859eSApple OSS Distributions * Please see the License for the specific language governing rights and 24*0f4c859eSApple OSS Distributions * limitations under the License. 25*0f4c859eSApple OSS Distributions * 26*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*0f4c859eSApple OSS Distributions */ 28*0f4c859eSApple OSS Distributions 29*0f4c859eSApple OSS Distributions #ifndef _UBSAN_H_ 30*0f4c859eSApple OSS Distributions #define _UBSAN_H_ 31*0f4c859eSApple OSS Distributions 32*0f4c859eSApple OSS Distributions #include <stdint.h> 33*0f4c859eSApple OSS Distributions #include <stdbool.h> 34*0f4c859eSApple OSS Distributions 35*0f4c859eSApple OSS Distributions struct san_type_desc { 36*0f4c859eSApple OSS Distributions uint16_t type; // 0: integer, 1: float 37*0f4c859eSApple OSS Distributions union { 38*0f4c859eSApple OSS Distributions struct { 39*0f4c859eSApple OSS Distributions uint16_t issigned : 1; 40*0f4c859eSApple OSS Distributions uint16_t width : 15; 41*0f4c859eSApple OSS Distributions }; /* int descriptor */ 42*0f4c859eSApple OSS Distributions struct { 43*0f4c859eSApple OSS Distributions uint16_t float_desc; 44*0f4c859eSApple OSS Distributions }; /* float descriptor */ 45*0f4c859eSApple OSS Distributions }; 46*0f4c859eSApple OSS Distributions const char name[]; 47*0f4c859eSApple OSS Distributions }; 48*0f4c859eSApple OSS Distributions 49*0f4c859eSApple OSS Distributions struct san_src_loc { 50*0f4c859eSApple OSS Distributions const char *filename; 51*0f4c859eSApple OSS Distributions uint32_t line; 52*0f4c859eSApple OSS Distributions uint32_t col; 53*0f4c859eSApple OSS Distributions }; 54*0f4c859eSApple OSS Distributions 55*0f4c859eSApple OSS Distributions struct ubsan_overflow_desc { 56*0f4c859eSApple OSS Distributions struct san_src_loc loc; 57*0f4c859eSApple OSS Distributions struct san_type_desc *ty; 58*0f4c859eSApple OSS Distributions }; 59*0f4c859eSApple OSS Distributions 60*0f4c859eSApple OSS Distributions struct ubsan_unreachable_desc { 61*0f4c859eSApple OSS Distributions struct san_src_loc loc; 62*0f4c859eSApple OSS Distributions }; 63*0f4c859eSApple OSS Distributions 64*0f4c859eSApple OSS Distributions struct ubsan_shift_desc { 65*0f4c859eSApple OSS Distributions struct san_src_loc loc; 66*0f4c859eSApple OSS Distributions struct san_type_desc *lhs_t; 67*0f4c859eSApple OSS Distributions struct san_type_desc *rhs_t; 68*0f4c859eSApple OSS Distributions }; 69*0f4c859eSApple OSS Distributions 70*0f4c859eSApple OSS Distributions struct ubsan_align_desc { 71*0f4c859eSApple OSS Distributions struct san_src_loc loc; 72*0f4c859eSApple OSS Distributions struct san_type_desc *ty; 73*0f4c859eSApple OSS Distributions uint8_t align; 74*0f4c859eSApple OSS Distributions uint8_t kind; 75*0f4c859eSApple OSS Distributions }; 76*0f4c859eSApple OSS Distributions 77*0f4c859eSApple OSS Distributions struct ubsan_ptroverflow_desc { 78*0f4c859eSApple OSS Distributions struct san_src_loc loc; 79*0f4c859eSApple OSS Distributions }; 80*0f4c859eSApple OSS Distributions 81*0f4c859eSApple OSS Distributions struct ubsan_oob_desc { 82*0f4c859eSApple OSS Distributions struct san_src_loc loc; 83*0f4c859eSApple OSS Distributions struct san_type_desc *array_ty; 84*0f4c859eSApple OSS Distributions struct san_type_desc *index_ty; 85*0f4c859eSApple OSS Distributions }; 86*0f4c859eSApple OSS Distributions 87*0f4c859eSApple OSS Distributions struct ubsan_load_invalid_desc { 88*0f4c859eSApple OSS Distributions struct san_src_loc loc; 89*0f4c859eSApple OSS Distributions struct san_type_desc *type; 90*0f4c859eSApple OSS Distributions }; 91*0f4c859eSApple OSS Distributions 92*0f4c859eSApple OSS Distributions struct ubsan_nullability_arg_desc { 93*0f4c859eSApple OSS Distributions struct san_src_loc loc; 94*0f4c859eSApple OSS Distributions struct san_src_loc attr_loc; 95*0f4c859eSApple OSS Distributions int arg_index; 96*0f4c859eSApple OSS Distributions }; 97*0f4c859eSApple OSS Distributions 98*0f4c859eSApple OSS Distributions struct ubsan_nullability_ret_desc { 99*0f4c859eSApple OSS Distributions struct san_src_loc loc; 100*0f4c859eSApple OSS Distributions }; 101*0f4c859eSApple OSS Distributions 102*0f4c859eSApple OSS Distributions struct ubsan_missing_ret_desc { 103*0f4c859eSApple OSS Distributions struct san_src_loc loc; 104*0f4c859eSApple OSS Distributions }; 105*0f4c859eSApple OSS Distributions 106*0f4c859eSApple OSS Distributions struct ubsan_float_desc { 107*0f4c859eSApple OSS Distributions struct san_src_loc loc; 108*0f4c859eSApple OSS Distributions struct san_type_desc *type_from; 109*0f4c859eSApple OSS Distributions struct san_type_desc *type_to; 110*0f4c859eSApple OSS Distributions }; 111*0f4c859eSApple OSS Distributions 112*0f4c859eSApple OSS Distributions struct ubsan_implicit_conv_desc { 113*0f4c859eSApple OSS Distributions struct san_src_loc loc; 114*0f4c859eSApple OSS Distributions struct san_type_desc *type_from; 115*0f4c859eSApple OSS Distributions struct san_type_desc *type_to; 116*0f4c859eSApple OSS Distributions unsigned char kind; 117*0f4c859eSApple OSS Distributions }; 118*0f4c859eSApple OSS Distributions 119*0f4c859eSApple OSS Distributions struct ubsan_func_type_mismatch_desc { 120*0f4c859eSApple OSS Distributions struct san_src_loc loc; 121*0f4c859eSApple OSS Distributions struct san_type_desc *type; 122*0f4c859eSApple OSS Distributions }; 123*0f4c859eSApple OSS Distributions 124*0f4c859eSApple OSS Distributions struct ubsan_vla_bound_desc { 125*0f4c859eSApple OSS Distributions struct san_src_loc loc; 126*0f4c859eSApple OSS Distributions struct san_type_desc *type; 127*0f4c859eSApple OSS Distributions }; 128*0f4c859eSApple OSS Distributions 129*0f4c859eSApple OSS Distributions struct ubsan_invalid_builtin { 130*0f4c859eSApple OSS Distributions struct san_src_loc loc; 131*0f4c859eSApple OSS Distributions unsigned char kind; 132*0f4c859eSApple OSS Distributions }; 133*0f4c859eSApple OSS Distributions 134*0f4c859eSApple OSS Distributions OS_ENUM(ubsan_violation_type, uint8_t, 135*0f4c859eSApple OSS Distributions UBSAN_OVERFLOW_add = 1, 136*0f4c859eSApple OSS Distributions UBSAN_OVERFLOW_sub, 137*0f4c859eSApple OSS Distributions UBSAN_OVERFLOW_mul, 138*0f4c859eSApple OSS Distributions UBSAN_OVERFLOW_divrem, 139*0f4c859eSApple OSS Distributions UBSAN_OVERFLOW_negate, 140*0f4c859eSApple OSS Distributions UBSAN_UNREACHABLE, 141*0f4c859eSApple OSS Distributions UBSAN_SHIFT, 142*0f4c859eSApple OSS Distributions UBSAN_ALIGN, 143*0f4c859eSApple OSS Distributions UBSAN_POINTER_OVERFLOW, 144*0f4c859eSApple OSS Distributions UBSAN_OOB, 145*0f4c859eSApple OSS Distributions UBSAN_TYPE_MISMATCH, 146*0f4c859eSApple OSS Distributions UBSAN_LOAD_INVALID_VALUE, 147*0f4c859eSApple OSS Distributions UBSAN_NULLABILITY_ARG, 148*0f4c859eSApple OSS Distributions UBSAN_NULLABILITY_RETURN, 149*0f4c859eSApple OSS Distributions UBSAN_MISSING_RETURN, 150*0f4c859eSApple OSS Distributions UBSAN_FLOAT_CAST_OVERFLOW, 151*0f4c859eSApple OSS Distributions UBSAN_IMPLICIT_CONVERSION, 152*0f4c859eSApple OSS Distributions UBSAN_FUNCTION_TYPE_MISMATCH, 153*0f4c859eSApple OSS Distributions UBSAN_VLA_BOUND_NOT_POSITIVE, 154*0f4c859eSApple OSS Distributions UBSAN_INVALID_BUILTIN, 155*0f4c859eSApple OSS Distributions UBSAN_VIOLATION_MAX 156*0f4c859eSApple OSS Distributions ); 157*0f4c859eSApple OSS Distributions 158*0f4c859eSApple OSS Distributions typedef struct ubsan_violation { 159*0f4c859eSApple OSS Distributions ubsan_violation_type_t ubsan_type; 160*0f4c859eSApple OSS Distributions uint64_t lhs; 161*0f4c859eSApple OSS Distributions uint64_t rhs; 162*0f4c859eSApple OSS Distributions union { 163*0f4c859eSApple OSS Distributions struct ubsan_overflow_desc *overflow; 164*0f4c859eSApple OSS Distributions struct ubsan_unreachable_desc *unreachable; 165*0f4c859eSApple OSS Distributions struct ubsan_shift_desc *shift; 166*0f4c859eSApple OSS Distributions struct ubsan_align_desc *align; 167*0f4c859eSApple OSS Distributions struct ubsan_ptroverflow_desc *ptroverflow; 168*0f4c859eSApple OSS Distributions struct ubsan_oob_desc *oob; 169*0f4c859eSApple OSS Distributions struct ubsan_load_invalid_desc *invalid; 170*0f4c859eSApple OSS Distributions struct ubsan_nullability_arg_desc *nonnull_arg; 171*0f4c859eSApple OSS Distributions struct ubsan_nullability_ret_desc *nonnull_ret; 172*0f4c859eSApple OSS Distributions struct ubsan_missing_ret_desc *missing_ret; 173*0f4c859eSApple OSS Distributions struct ubsan_float_desc *flt; 174*0f4c859eSApple OSS Distributions struct ubsan_implicit_conv_desc *implicit; 175*0f4c859eSApple OSS Distributions struct ubsan_func_type_mismatch_desc *func_mismatch; 176*0f4c859eSApple OSS Distributions struct ubsan_vla_bound_desc *vla_bound; 177*0f4c859eSApple OSS Distributions struct ubsan_invalid_builtin *invalid_builtin; 178*0f4c859eSApple OSS Distributions const char *func; 179*0f4c859eSApple OSS Distributions }; 180*0f4c859eSApple OSS Distributions struct san_src_loc *loc; 181*0f4c859eSApple OSS Distributions } ubsan_violation_t; 182*0f4c859eSApple OSS Distributions 183*0f4c859eSApple OSS Distributions typedef struct ubsan_buf { 184*0f4c859eSApple OSS Distributions char *ub_buf; 185*0f4c859eSApple OSS Distributions size_t ub_buf_size; 186*0f4c859eSApple OSS Distributions size_t ub_written; 187*0f4c859eSApple OSS Distributions bool ub_err; 188*0f4c859eSApple OSS Distributions } ubsan_buf_t; 189*0f4c859eSApple OSS Distributions 190*0f4c859eSApple OSS Distributions void ubsan_log_append(ubsan_violation_t *); 191*0f4c859eSApple OSS Distributions 192*0f4c859eSApple OSS Distributions void ubsan_json_init(ubsan_buf_t *, char *, size_t); 193*0f4c859eSApple OSS Distributions void ubsan_json_begin(ubsan_buf_t *, size_t); 194*0f4c859eSApple OSS Distributions size_t ubsan_json_finish(ubsan_buf_t *); 195*0f4c859eSApple OSS Distributions bool ubsan_json_format(ubsan_violation_t *, ubsan_buf_t *); 196*0f4c859eSApple OSS Distributions 197*0f4c859eSApple OSS Distributions /* 198*0f4c859eSApple OSS Distributions * UBSan ABI 199*0f4c859eSApple OSS Distributions */ 200*0f4c859eSApple OSS Distributions void __ubsan_handle_add_overflow(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 201*0f4c859eSApple OSS Distributions void __ubsan_handle_add_overflow_abort(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 202*0f4c859eSApple OSS Distributions void __ubsan_handle_builtin_unreachable(struct ubsan_unreachable_desc *); 203*0f4c859eSApple OSS Distributions void __ubsan_handle_divrem_overflow(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 204*0f4c859eSApple OSS Distributions void __ubsan_handle_divrem_overflow_abort(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 205*0f4c859eSApple OSS Distributions void __ubsan_handle_float_cast_overflow(struct ubsan_float_desc *, uint64_t); 206*0f4c859eSApple OSS Distributions void __ubsan_handle_float_cast_overflow_abort(struct ubsan_float_desc *, uint64_t); 207*0f4c859eSApple OSS Distributions void __ubsan_handle_function_type_mismatch(struct ubsan_func_type_mismatch_desc*, uint64_t); 208*0f4c859eSApple OSS Distributions void __ubsan_handle_function_type_mismatch_abort(struct ubsan_func_type_mismatch_desc *, uint64_t); 209*0f4c859eSApple OSS Distributions void __ubsan_handle_implicit_conversion(struct ubsan_implicit_conv_desc *, uint64_t, uint64_t); 210*0f4c859eSApple OSS Distributions void __ubsan_handle_implicit_conversion_abort(struct ubsan_implicit_conv_desc *, uint64_t, uint64_t); 211*0f4c859eSApple OSS Distributions void __ubsan_handle_invalid_builtin(struct ubsan_invalid_builtin *); 212*0f4c859eSApple OSS Distributions void __ubsan_handle_invalid_builtin_abort(struct ubsan_invalid_builtin *); 213*0f4c859eSApple OSS Distributions void __ubsan_handle_load_invalid_value(struct ubsan_load_invalid_desc *, uint64_t); 214*0f4c859eSApple OSS Distributions void __ubsan_handle_load_invalid_value_abort(struct ubsan_load_invalid_desc *, uint64_t); 215*0f4c859eSApple OSS Distributions void __ubsan_handle_missing_return(struct ubsan_missing_ret_desc *); 216*0f4c859eSApple OSS Distributions void __ubsan_handle_missing_return_abort(struct ubsan_missing_ret_desc *); 217*0f4c859eSApple OSS Distributions void __ubsan_handle_mul_overflow(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 218*0f4c859eSApple OSS Distributions void __ubsan_handle_mul_overflow_abort(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 219*0f4c859eSApple OSS Distributions void __ubsan_handle_negate_overflow(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 220*0f4c859eSApple OSS Distributions void __ubsan_handle_negate_overflow_abort(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 221*0f4c859eSApple OSS Distributions void __ubsan_handle_nonnull_arg(struct ubsan_nullability_arg_desc *); 222*0f4c859eSApple OSS Distributions void __ubsan_handle_nonnull_arg_abort(struct ubsan_nullability_arg_desc *); 223*0f4c859eSApple OSS Distributions void __ubsan_handle_nonnull_return_v1(struct ubsan_nullability_ret_desc *, uint64_t); 224*0f4c859eSApple OSS Distributions void __ubsan_handle_nonnull_return_v1_abort(struct ubsan_nullability_ret_desc *, uint64_t); 225*0f4c859eSApple OSS Distributions void __ubsan_handle_nullability_arg(struct ubsan_nullability_arg_desc *); 226*0f4c859eSApple OSS Distributions void __ubsan_handle_nullability_arg_abort(struct ubsan_nullability_arg_desc *); 227*0f4c859eSApple OSS Distributions void __ubsan_handle_nullability_return_v1(struct ubsan_nullability_ret_desc *, uint64_t); 228*0f4c859eSApple OSS Distributions void __ubsan_handle_nullability_return_v1_abort(struct ubsan_nullability_ret_desc *, uint64_t); 229*0f4c859eSApple OSS Distributions void __ubsan_handle_out_of_bounds(struct ubsan_oob_desc *, uint64_t idx); 230*0f4c859eSApple OSS Distributions void __ubsan_handle_out_of_bounds_abort(struct ubsan_oob_desc *, uint64_t idx); 231*0f4c859eSApple OSS Distributions void __ubsan_handle_pointer_overflow(struct ubsan_ptroverflow_desc *, uint64_t lhs, uint64_t rhs); 232*0f4c859eSApple OSS Distributions void __ubsan_handle_pointer_overflow_abort(struct ubsan_ptroverflow_desc *, uint64_t lhs, uint64_t rhs); 233*0f4c859eSApple OSS Distributions void __ubsan_handle_shift_out_of_bounds(struct ubsan_shift_desc *, uint64_t lhs, uint64_t rhs); 234*0f4c859eSApple OSS Distributions void __ubsan_handle_shift_out_of_bounds_abort(struct ubsan_shift_desc *, uint64_t lhs, uint64_t rhs); 235*0f4c859eSApple OSS Distributions void __ubsan_handle_sub_overflow(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 236*0f4c859eSApple OSS Distributions void __ubsan_handle_sub_overflow_abort(struct ubsan_overflow_desc *, uint64_t lhs, uint64_t rhs); 237*0f4c859eSApple OSS Distributions void __ubsan_handle_type_mismatch_v1(struct ubsan_align_desc *, uint64_t val); 238*0f4c859eSApple OSS Distributions void __ubsan_handle_type_mismatch_v1_abort(struct ubsan_align_desc *, uint64_t val); 239*0f4c859eSApple OSS Distributions void __ubsan_handle_vla_bound_not_positive(struct ubsan_vla_bound_desc *, uint64_t); 240*0f4c859eSApple OSS Distributions void __ubsan_handle_vla_bound_not_positive_abort(struct ubsan_vla_bound_desc *, uint64_t); 241*0f4c859eSApple OSS Distributions 242*0f4c859eSApple OSS Distributions #endif /* _UBSAN_H_ */ 243