Hi, im trying to learn zig it’s my first system programing language. Im starting with a dumb cat program. however i think i found a bug when i do -Doptimize=ReleaseFast
.
This is my code:
const std = @import("std");
const process = std.process;
const stdout = std.io.getStdOut().writer();
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const ally = gpa.allocator();
const args = try process.argsAlloc(ally);
defer process.argsFree(ally, args);
if (args.len == 1) {
std.debug.print("Not file provided\n", .{});
process.exit(1);
}
var status: u8 = 0;
for (args[1..]) |arg| {
var splits = std.mem.splitBackwardsAny(u8, arg, "/");
const title = splits.first();
const file = std.fs.cwd().openFile(arg, .{}) catch |err| {
std.debug.print("{s}: Failed to open file - {any}\n", .{ title, err });
status = 1;
continue;
};
defer file.close();
try stdout.print("{s}:\n", .{title});
var buffered_file = std.io.bufferedReader(file.reader());
while (true) {
var buffer: [128]u8 = undefined;
const number_of_read_bytes = buffered_file.read(&buffer) catch |err| {
std.debug.print("{s}: Failed to read file - {any}\n", .{ title, err });
status = 1;
break;
};
if (number_of_read_bytes == 0) {
break;
}
try stdout.print("{s}", .{buffer});
}
}
process.exit(status);
}
And this is the build file:
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "zig-cat",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const exe_unit_tests = b.addTest(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_exe_unit_tests.step);
}
When i build with -Doptimize=ReleaseFast
and try to cat a file.
for example:
Lorem, ipsum dolor sit amet consectetur adipisicing elit.
Rem earum nostrum quisquam asperiores omnis id officia odit? Laboriosam,
perferendis voluptatum porro necessitatibus mollitia,
liquid eum ex expedita iste dolores minima?
This is what the program print out in -Doptimize=ReleaseFast
.
test.txt:
Lorem, ipsum dolor sit amet consectetur adipisicing elit.
Rem earum nostrum quisquam asperiores omnis id officia odit? Laboriosam,
perferendis voluptatum porro necessitatibus mollitia,
liquid eum ex expedita iste dolores minima?
id officia odit? Laboriosa%
While in debug mode and safe mode it print like the original file.
I think the buffer
variable does not drop when the scope ends. idk if it’s a bug on my end or in zig.