Commit eab51b7785

Ian Simonson <ian.simonson@protonmail.com>
2020-09-27 07:07:50
Make LinearFifo not crash when discarding from empty buffer
Previously if a LinearFifo was empty and discard was called an unsigned overflow would occur. However it is safe to perform this overflow as a bitwise & operation with 0xFFFFFFFFFFFFFF is a noop
1 parent ed357f9
Changed files (1)
lib
lib/std/fifo.zig
@@ -186,7 +186,9 @@ pub fn LinearFifo(
             } else {
                 var head = self.head + count;
                 if (powers_of_two) {
-                    head &= self.buf.len - 1;
+                    // Note it is safe to do a wrapping subtract as
+                    // bitwise & with all 1s is a noop
+                    head &= self.buf.len -% 1;
                 } else {
                     head %= self.buf.len;
                 }
@@ -376,6 +378,14 @@ pub fn LinearFifo(
     };
 }
 
+test "LinearFifo(u8, .Dynamic) discard(0) from empty buffer should not error on overflow" {
+    var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator);
+    defer fifo.deinit();
+
+    // If overflow is not explicitly allowed this will crash in debug / safe mode
+    fifo.discard(0);
+}
+
 test "LinearFifo(u8, .Dynamic)" {
     var fifo = LinearFifo(u8, .Dynamic).init(testing.allocator);
     defer fifo.deinit();