From da219d3c40dd2711cb1b144a8fd2f6ca4e86d159 Mon Sep 17 00:00:00 2001 From: Dave Gauer Date: Tue, 15 Jun 2021 10:12:57 -0400 Subject: added ub exploration to ex090 --- exercises/090_async7.zig | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'exercises') diff --git a/exercises/090_async7.zig b/exercises/090_async7.zig index 89113bd..0214f34 100644 --- a/exercises/090_async7.zig +++ b/exercises/090_async7.zig @@ -35,9 +35,53 @@ pub fn main() void { } fn getBeef(input: u32) u32 { - if (input > 0xDEAD) { + if (input == 0xDEAD) { suspend {} } return 0xBEEF; } +// +// Going Deeper Into... +// ...uNdeFiNEd beHAVi0r! +// +// We haven't discussed it yet, but runtime "safety" features +// require some extra instructions in your compiled program. +// Most of the time, you're going to want to keep these in. +// +// But in some programs, when data integrity is less important +// than raw speed (some games, for example), you can compile +// without these safety features. +// +// Instead of a safe panic when something goes wrong, your +// program will now exhibit Undefined Behavior (UB), which simply +// means that the Zig language does not (cannot) define what will +// happen. The best case is that it will crash, but in the worst +// case, it will continue to run with the wrong results and +// corrupt your data or expose you to security risks. +// +// This program is a great way to explore UB. Once you get it +// working, try calling the getBeef() function with the value +// 0xDEAD so that it will invoke the 'suspend' keyword: +// +// getBeef(0xDEAD) +// +// Now when you run the program, it will panic and give you a +// nice stack trace to help debug the problem. +// +// zig run exercises/090_async7.zig +// thread 328 panic: async function called... +// ... +// +// But see what happens when you turn off safety checks by using +// ReleaseFast mode: +// +// zig run -O ReleaseFast exercises/090_async7.zig +// beef? 0! +// +// This is the wrong result. On your computer, you may get a +// different answer or it might crash! What exactly will happen +// is UNDEFINED. Your computer is now like a wild animal, +// reacting to bits and bytes of raw memory with the base +// instincts of the CPU. It is both terrifying and exhilarating. +// -- cgit v1.2.3-ZIG