Commit a468929519

David Rubin <daviru007@icloud.com>
2024-12-26 12:59:27
ubsan: resolve the last of the TODOs
1 parent 50b9556
Changed files (1)
lib/ubsan.zig
@@ -213,25 +213,34 @@ fn alignmentAssumptionHandler(
     alignment: ValueHandle,
     maybe_offset: ?ValueHandle,
 ) callconv(.c) noreturn {
-    _ = pointer;
-    // TODO: add the hint here?
-    // const real_pointer = @intFromPtr(pointer) - @intFromPtr(maybe_offset);
-    // const lsb = @ctz(real_pointer);
-    // const actual_alignment = @as(u64, 1) << @intCast(lsb);
-    // const mask = @intFromPtr(alignment) - 1;
-    // const misalignment_offset = real_pointer & mask;
-    // _ = actual_alignment;
-    // _ = misalignment_offset;
+    const real_pointer = @intFromPtr(pointer) - @intFromPtr(maybe_offset);
+    const lsb = @ctz(real_pointer);
+    const actual_alignment = @as(u64, 1) << @intCast(lsb);
+    const mask = @intFromPtr(alignment) - 1;
+    const misalignment_offset = real_pointer & mask;
 
     if (maybe_offset) |offset| {
         logMessage(
-            "assumption of {} byte alignment (with offset of {} byte) for pointer of type {s} failed",
-            .{ alignment.getValue(data), @intFromPtr(offset), data.type_descriptor.getName() },
+            "assumption of {} byte alignment (with offset of {} byte) for pointer of type {s} failed\n" ++
+                "offset address is {} aligned, misalignment offset is {} bytes",
+            .{
+                alignment.getValue(data),
+                @intFromPtr(offset),
+                data.type_descriptor.getName(),
+                actual_alignment,
+                misalignment_offset,
+            },
         );
     } else {
         logMessage(
-            "assumption of {} byte alignment for pointer of type {s} failed",
-            .{ alignment.getValue(data), data.type_descriptor.getName() },
+            "assumption of {} byte alignment for pointer of type {s} failed\n" ++
+                "address is {} aligned, misalignment offset is {} bytes",
+            .{
+                alignment.getValue(data),
+                data.type_descriptor.getName(),
+                actual_alignment,
+                misalignment_offset,
+            },
         );
     }
 }
@@ -309,7 +318,26 @@ fn pointerOverflow(
                 .{base},
             );
         } else {
-            @panic("TODO");
+            const signed_base: isize = @bitCast(base);
+            const signed_result: isize = @bitCast(result);
+            if ((signed_base >= 0) == (signed_result >= 0)) {
+                if (base > result) {
+                    logMessage(
+                        "addition of unsigned offset to 0x{x} overflowed to 0x{x}",
+                        .{ base, result },
+                    );
+                } else {
+                    logMessage(
+                        "subtraction of unsigned offset to 0x{x} overflowed to 0x{x}",
+                        .{ base, result },
+                    );
+                }
+            } else {
+                logMessage(
+                    "pointer index expression with base 0x{x} overflowed to 0x{x}",
+                    .{ base, result },
+                );
+            }
         }
     }
 }