authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-12-17 04:29:39-08:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2025-02-25 11:22:33-08:00
logeef8d4ff4fff849c7b214bed05e49e7906cc7809
tree917f74e6d1f96a6b1812e3a4069edd3fbd8087aa
parent5e0073c898b74f03f0c0e7f8cb859b9ac719bf43

ubsan: switch to using `std.builtin.panicExtra` to log errors


1 files changed, 15 insertions(+), 17 deletions(-)

lib/std/ubsan.zig+15-17
...@@ -146,7 +146,7 @@ fn overflowHandler(...@@ -146,7 +146,7 @@ fn overflowHandler(
146146
147 const is_signed = data.type_descriptor.isSigned();147 const is_signed = data.type_descriptor.isSigned();
148 const fmt = "{s} integer overflow: " ++ "{} " ++148 const fmt = "{s} integer overflow: " ++ "{} " ++
149 operator ++ " {} cannot be represented in type {s}\n";149 operator ++ " {} cannot be represented in type {s}";
150150
151 logMessage(fmt, .{151 logMessage(fmt, .{
152 if (is_signed) "signed" else "unsigned",152 if (is_signed) "signed" else "unsigned",
...@@ -166,7 +166,7 @@ fn negationHandler(...@@ -166,7 +166,7 @@ fn negationHandler(
166) callconv(.C) noreturn {166) callconv(.C) noreturn {
167 const old_value = old_value_handle.getValue(data);167 const old_value = old_value_handle.getValue(data);
168 logMessage(168 logMessage(
169 "negation of {} cannot be represented in type {s}\n",169 "negation of {} cannot be represented in type {s}",
170 .{ old_value, data.type_descriptor.getName() },170 .{ old_value, data.type_descriptor.getName() },
171 );171 );
172}172}
...@@ -182,10 +182,10 @@ fn divRemHandler(...@@ -182,10 +182,10 @@ fn divRemHandler(
182182
183 if (is_signed and rhs.getSignedInteger() == -1) {183 if (is_signed and rhs.getSignedInteger() == -1) {
184 logMessage(184 logMessage(
185 "division of {} by -1 cannot be represented in type {s}\n",185 "division of {} by -1 cannot be represented in type {s}",
186 .{ lhs, data.type_descriptor.getName() },186 .{ lhs, data.type_descriptor.getName() },
187 );187 );
188 } else logMessage("division by zero\n", .{});188 } else logMessage("division by zero", .{});
189}189}
190190
191const AlignmentAssumptionData = extern struct {191const AlignmentAssumptionData = extern struct {
...@@ -212,12 +212,12 @@ fn alignmentAssumptionHandler(...@@ -212,12 +212,12 @@ fn alignmentAssumptionHandler(
212212
213 if (maybe_offset) |offset| {213 if (maybe_offset) |offset| {
214 logMessage(214 logMessage(
215 "assumption of {} byte alignment (with offset of {} byte) for pointer of type {s} failed\n",215 "assumption of {} byte alignment (with offset of {} byte) for pointer of type {s} failed",
216 .{ alignment.getValue(data), @intFromPtr(offset), data.type_descriptor.getName() },216 .{ alignment.getValue(data), @intFromPtr(offset), data.type_descriptor.getName() },
217 );217 );
218 } else {218 } else {
219 logMessage(219 logMessage(
220 "assumption of {} byte alignment for pointer of type {s} failed\n",220 "assumption of {} byte alignment for pointer of type {s} failed",
221 .{ alignment.getValue(data), data.type_descriptor.getName() },221 .{ alignment.getValue(data), data.type_descriptor.getName() },
222 );222 );
223 }223 }
...@@ -241,19 +241,19 @@ fn shiftOob(...@@ -241,19 +241,19 @@ fn shiftOob(
241 rhs.getPositiveInteger() >= data.lhs_type.getIntegerSize())241 rhs.getPositiveInteger() >= data.lhs_type.getIntegerSize())
242 {242 {
243 if (rhs.isNegative()) {243 if (rhs.isNegative()) {
244 logMessage("shift exponent {} is negative\n", .{rhs});244 logMessage("shift exponent {} is negative", .{rhs});
245 } else {245 } else {
246 logMessage(246 logMessage(
247 "shift exponent {} is too large for {}-bit type {s}\n",247 "shift exponent {} is too large for {}-bit type {s}",
248 .{ rhs, data.lhs_type.getIntegerSize(), data.lhs_type.getName() },248 .{ rhs, data.lhs_type.getIntegerSize(), data.lhs_type.getName() },
249 );249 );
250 }250 }
251 } else {251 } else {
252 if (lhs.isNegative()) {252 if (lhs.isNegative()) {
253 logMessage("left shift of negative value {}\n", .{lhs});253 logMessage("left shift of negative value {}", .{lhs});
254 } else {254 } else {
255 logMessage(255 logMessage(
256 "left shift of {} by {} places cannot be represented in type {s}\n",256 "left shift of {} by {} places cannot be represented in type {s}",
257 .{ lhs, rhs, data.lhs_type.getName() },257 .{ lhs, rhs, data.lhs_type.getName() },
258 );258 );
259 }259 }
...@@ -269,7 +269,7 @@ const OutOfBoundsData = extern struct {...@@ -269,7 +269,7 @@ const OutOfBoundsData = extern struct {
269fn outOfBounds(data: *const OutOfBoundsData, index_handle: ValueHandle) callconv(.C) noreturn {269fn outOfBounds(data: *const OutOfBoundsData, index_handle: ValueHandle) callconv(.C) noreturn {
270 const index: Value = .{ .handle = index_handle, .type_descriptor = data.index_type };270 const index: Value = .{ .handle = index_handle, .type_descriptor = data.index_type };
271 logMessage(271 logMessage(
272 "index {} out of bounds for type {s}\n",272 "index {} out of bounds for type {s}",
273 .{ index, data.array_type.getName() },273 .{ index, data.array_type.getName() },
274 );274 );
275}275}
...@@ -285,14 +285,14 @@ fn pointerOverflow(...@@ -285,14 +285,14 @@ fn pointerOverflow(
285) callconv(.C) noreturn {285) callconv(.C) noreturn {
286 if (base == 0) {286 if (base == 0) {
287 if (result == 0) {287 if (result == 0) {
288 logMessage("applying zero offset to null pointer\n", .{});288 logMessage("applying zero offset to null pointer", .{});
289 } else {289 } else {
290 logMessage("applying non-zero offset {} to null pointer\n", .{result});290 logMessage("applying non-zero offset {} to null pointer", .{result});
291 }291 }
292 } else {292 } else {
293 if (result == 0) {293 if (result == 0) {
294 logMessage(294 logMessage(
295 "applying non-zero offset to non-null pointer 0x{x} produced null pointer\n",295 "applying non-zero offset to non-null pointer 0x{x} produced null pointer",
296 .{base},296 .{base},
297 );297 );
298 } else {298 } else {
...@@ -335,9 +335,7 @@ fn simpleHandler(...@@ -335,9 +335,7 @@ fn simpleHandler(
335}335}
336336
337inline fn logMessage(comptime fmt: []const u8, args: anytype) noreturn {337inline fn logMessage(comptime fmt: []const u8, args: anytype) noreturn {
338 std.debug.print(fmt, args);338 std.debug.panicExtra(null, @returnAddress(), fmt, args);
339 std.debug.dumpCurrentStackTrace(@returnAddress());
340 std.posix.abort();
341}339}
342340
343fn exportHandler(341fn exportHandler(