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