From b45d2968e51cd22650b019f668056333337513e9 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 5 Dec 2020 19:16:36 +0100 Subject: [PATCH] Add some test cases for the previous commits --- test/runtime_safety.zig | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/test/runtime_safety.zig b/test/runtime_safety.zig index f4bcfa6f9f..2ab728b580 100644 --- a/test/runtime_safety.zig +++ b/test/runtime_safety.zig @@ -1,6 +1,85 @@ const tests = @import("tests.zig"); pub fn addCases(cases: *tests.CompareOutputContext) void { + { + const check_panic_msg = + \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { + \\ if (std.mem.eql(u8, message, "reached unreachable code")) { + \\ std.process.exit(126); // good + \\ } + \\ std.process.exit(0); // test failed + \\} + ; + + cases.addRuntimeSafety("switch on corrupted enum value", + \\const std = @import("std"); + ++ check_panic_msg ++ + \\const E = enum(u32) { + \\ X = 1, + \\}; + \\pub fn main() void { + \\ var e: E = undefined; + \\ @memset(@ptrCast([*]u8, &e), 0x55, @sizeOf(E)); + \\ switch (e) { + \\ .X => @breakpoint(), + \\ } + \\} + ); + + cases.addRuntimeSafety("switch on corrupted union value", + \\const std = @import("std"); + ++ check_panic_msg ++ + \\const U = union(enum(u32)) { + \\ X: u8, + \\}; + \\pub fn main() void { + \\ var u: U = undefined; + \\ @memset(@ptrCast([*]u8, &u), 0x55, @sizeOf(U)); + \\ switch (u) { + \\ .X => @breakpoint(), + \\ } + \\} + ); + } + + { + const check_panic_msg = + \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn { + \\ if (std.mem.eql(u8, message, "invalid enum value")) { + \\ std.process.exit(126); // good + \\ } + \\ std.process.exit(0); // test failed + \\} + ; + + cases.addRuntimeSafety("@tagName on corrupted enum value", + \\const std = @import("std"); + ++ check_panic_msg ++ + \\const E = enum(u32) { + \\ X = 1, + \\}; + \\pub fn main() void { + \\ var e: E = undefined; + \\ @memset(@ptrCast([*]u8, &e), 0x55, @sizeOf(E)); + \\ var n = @tagName(e); + \\} + ); + + cases.addRuntimeSafety("@tagName on corrupted union value", + \\const std = @import("std"); + ++ check_panic_msg ++ + \\const U = union(enum(u32)) { + \\ X: u8, + \\}; + \\pub fn main() void { + \\ var u: U = undefined; + \\ @memset(@ptrCast([*]u8, &u), 0x55, @sizeOf(U)); + \\ var t: @TagType(U) = u; + \\ var n = @tagName(t); + \\} + ); + } + { const check_panic_msg = \\pub fn panic(message: []const u8, stack_trace: ?*@import("builtin").StackTrace) noreturn {