Lines Matching +full:loc +full:- +full:code
1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <kunit/test-bug.h>
25 * The mappings of struct SanitizerKind (the -fsanitize=xxx args) to
62 return "UBSAN: unreachable code"; in report_ubsan_failure()
96 return "UBSAN: unrecognized failure code"; in report_ubsan_failure()
128 return test_and_set_bit(REPORTED_BIT, &location->reported); in was_reported()
131 static bool suppress_report(struct source_location *loc) in suppress_report() argument
133 return current->in_ubsan || was_reported(loc); in suppress_report()
138 return type->type_kind == type_kind_int; in type_is_int()
144 return type->type_info & 1; in type_is_signed()
149 return 1 << (type->type_info >> 1); in type_bit_width()
165 unsigned extra_bits = sizeof(s_max)*8 - type_bit_width(type); in get_signed_val()
219 static void ubsan_prologue(struct source_location *loc, const char *reason) in ubsan_prologue() argument
221 current->in_ubsan++; in ubsan_prologue()
225 pr_err("UBSAN: %s in %s:%d:%d\n", reason, loc->file_name, in ubsan_prologue()
226 loc->line & LINE_MASK, loc->column & COLUMN_MASK); in ubsan_prologue()
228 kunit_fail_current_test("%s in %s", reason, loc->file_name); in ubsan_prologue()
234 pr_warn("---[ end trace ]---\n"); in ubsan_epilogue()
236 current->in_ubsan--; in ubsan_epilogue()
245 struct type_descriptor *type = data->type; in handle_overflow()
249 if (suppress_report(&data->location)) in handle_overflow()
252 ubsan_prologue(&data->location, type_is_signed(type) ? in handle_overflow()
253 "signed-integer-overflow" : in handle_overflow()
254 "unsigned-integer-overflow"); in handle_overflow()
262 type->type_name); in handle_overflow()
278 handle_overflow(data, lhs, rhs, '-'); in __ubsan_handle_sub_overflow()
294 if (suppress_report(&data->location)) in __ubsan_handle_negate_overflow()
297 ubsan_prologue(&data->location, "negation-overflow"); in __ubsan_handle_negate_overflow()
299 val_to_string(old_val_str, sizeof(old_val_str), data->type, old_val); in __ubsan_handle_negate_overflow()
302 old_val_str, data->type->type_name); in __ubsan_handle_negate_overflow()
314 if (suppress_report(&data->location)) in __ubsan_handle_implicit_conversion()
317 val_to_string(from_val_str, sizeof(from_val_str), data->from_type, from_val); in __ubsan_handle_implicit_conversion()
318 val_to_string(to_val_str, sizeof(to_val_str), data->to_type, to_val); in __ubsan_handle_implicit_conversion()
320 ubsan_prologue(&data->location, "implicit-conversion"); in __ubsan_handle_implicit_conversion()
323 data->from_type->type_name, in __ubsan_handle_implicit_conversion()
325 type_check_kinds[data->type_check_kind], in __ubsan_handle_implicit_conversion()
326 data->to_type->type_name, in __ubsan_handle_implicit_conversion()
338 if (suppress_report(&data->location)) in __ubsan_handle_divrem_overflow()
341 ubsan_prologue(&data->location, "division-overflow"); in __ubsan_handle_divrem_overflow()
343 val_to_string(rhs_val_str, sizeof(rhs_val_str), data->type, rhs); in __ubsan_handle_divrem_overflow()
345 if (type_is_signed(data->type) && get_signed_val(data->type, rhs) == -1) in __ubsan_handle_divrem_overflow()
346 pr_err("division of %s by -1 cannot be represented in type %s\n", in __ubsan_handle_divrem_overflow()
347 rhs_val_str, data->type->type_name); in __ubsan_handle_divrem_overflow()
357 if (suppress_report(data->location)) in handle_null_ptr_deref()
360 ubsan_prologue(data->location, "null-ptr-deref"); in handle_null_ptr_deref()
363 type_check_kinds[data->type_check_kind], in handle_null_ptr_deref()
364 data->type->type_name); in handle_null_ptr_deref()
372 if (suppress_report(data->location)) in handle_misaligned_access()
375 ubsan_prologue(data->location, "misaligned-access"); in handle_misaligned_access()
378 type_check_kinds[data->type_check_kind], in handle_misaligned_access()
379 (void *)ptr, data->type->type_name); in handle_misaligned_access()
380 pr_err("which requires %ld byte alignment\n", data->alignment); in handle_misaligned_access()
388 if (suppress_report(data->location)) in handle_object_size_mismatch()
391 ubsan_prologue(data->location, "object-size-mismatch"); in handle_object_size_mismatch()
393 type_check_kinds[data->type_check_kind], in handle_object_size_mismatch()
395 pr_err("for an object of type %s\n", data->type->type_name); in handle_object_size_mismatch()
406 else if (data->alignment && !IS_ALIGNED(ptr, data->alignment)) in ubsan_type_mismatch_common()
418 .location = &data->location, in __ubsan_handle_type_mismatch()
419 .type = data->type, in __ubsan_handle_type_mismatch()
420 .alignment = data->alignment, in __ubsan_handle_type_mismatch()
421 .type_check_kind = data->type_check_kind in __ubsan_handle_type_mismatch()
432 .location = &data->location, in __ubsan_handle_type_mismatch_v1()
433 .type = data->type, in __ubsan_handle_type_mismatch_v1()
434 .alignment = 1UL << data->log_alignment, in __ubsan_handle_type_mismatch_v1()
435 .type_check_kind = data->type_check_kind in __ubsan_handle_type_mismatch_v1()
447 if (suppress_report(&data->location)) in __ubsan_handle_out_of_bounds()
450 ubsan_prologue(&data->location, "array-index-out-of-bounds"); in __ubsan_handle_out_of_bounds()
452 val_to_string(index_str, sizeof(index_str), data->index_type, index); in __ubsan_handle_out_of_bounds()
454 data->array_type->type_name); in __ubsan_handle_out_of_bounds()
462 struct type_descriptor *rhs_type = data->rhs_type; in __ubsan_handle_shift_out_of_bounds()
463 struct type_descriptor *lhs_type = data->lhs_type; in __ubsan_handle_shift_out_of_bounds()
468 if (suppress_report(&data->location)) in __ubsan_handle_shift_out_of_bounds()
471 ubsan_prologue(&data->location, "shift-out-of-bounds"); in __ubsan_handle_shift_out_of_bounds()
481 pr_err("shift exponent %s is too large for %u-bit type %s\n", in __ubsan_handle_shift_out_of_bounds()
484 lhs_type->type_name); in __ubsan_handle_shift_out_of_bounds()
492 lhs_type->type_name); in __ubsan_handle_shift_out_of_bounds()
504 ubsan_prologue(&data->location, "unreachable"); in __ubsan_handle_builtin_unreachable()
517 if (suppress_report(&data->location)) in __ubsan_handle_load_invalid_value()
520 ubsan_prologue(&data->location, "invalid-load"); in __ubsan_handle_load_invalid_value()
522 val_to_string(val_str, sizeof(val_str), data->type, val); in __ubsan_handle_load_invalid_value()
525 val_str, data->type->type_name); in __ubsan_handle_load_invalid_value()
540 if (suppress_report(&data->location)) in __ubsan_handle_alignment_assumption()
543 ubsan_prologue(&data->location, "alignment-assumption"); in __ubsan_handle_alignment_assumption()
547 align, offset, data->type->type_name); in __ubsan_handle_alignment_assumption()
550 align, data->type->type_name); in __ubsan_handle_alignment_assumption()
552 real_ptr = ptr - offset; in __ubsan_handle_alignment_assumption()
555 real_ptr & (align - 1)); in __ubsan_handle_alignment_assumption()