Hi.
I have recently noticed something.
here is my code snippet:
pub var writer: std.Io.File.Writer = undefined;
pub var reader: std.Io.File.Reader = undefined;
pub var allocator: std.mem.Allocator = undefined;
pub fn main(init: std.process.Init) !void {
const io = init.io;
const args = init.minimal.args;
if (args.vector.len == 0) {
std.debug.print("yay!", .{});
}
allocator = init.gpa;
const writerbuffer: []u8 = try allocator.alloc(u8, 4096);
defer allocator.free(writerbuffer);
const readerbuffer: []u8 = try allocator.alloc(u8, 1);
defer allocator.free(readerbuffer);
writer = std.Io.File.stdout().writer(io, writerbuffer);
try writer.file.writeStreamingAll(io, "Hello world!\n");
reader = std.Io.File.stdin().reader(io, readerbuffer);
const w = writer.interface;
var r = reader.interface;
r.takeByte();
...
If I compile and run this I get a segfault:
Hello world!
Segmentation fault at address 0x1289f71
???:?:?: 0x1289f71 in ??? (./zig-out/bin/stevi)
Unwind error at address `./zig-out/bin/stevi:0x1289f71` (unwind info unavailable), remaining frames may be incorrect
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/File.zig:475:27: 0x10390f7 in readStreaming (std.zig)
return (try io.operate(.{ .file_read_streaming = .{
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/File/Reader.zig:283:35: 0x1038bfb in readVecStreaming (std.zig)
const n = r.file.readStreaming(io, dest) catch |err| switch (err) {
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/File/Reader.zig:236:65: 0x10376a0 in readVec (std.zig)
.streaming, .streaming_simple => return readVecStreaming(r, data),
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/Reader.zig:1124:56: 0x1031fdd in fillUnbuffered (std.zig)
while (r.end < r.seek + n) _ = try r.vtable.readVec(r, &bufs);
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/Reader.zig:1110:26: 0x1031d28 in fill (std.zig)
return fillUnbuffered(r, n);
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/Reader.zig:1150:13: 0x107ec30 in peekByte (std.zig)
try fill(r, 1);
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/Io/Reader.zig:1158:32: 0x107e99f in takeByte (std.zig)
const result = try peekByte(r);
^
/home/simon/programming/stevi/main.zig:41:23: 0x11d25e7 in main (main.zig)
_ = try r.takeByte();
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/start.zig:737:30: 0x11d32be in callMain (std.zig)
return wrapMain(root.main(.{
^
/home/simon/Downloads/zig-x86_64-linux-0.16.0/lib/std/start.zig:190:5: 0x11d20e1 in _start (std.zig)
asm volatile (switch (native_arch) {
^
But if I don’t use var r = reader.interface; and just run reader.interface.takeByte() directly, it doesn’t cause a segfault.
Any clue?