Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explicitly passing an empty string as a []const u8 value causes index out of bounds error during parsing #66

Closed
tranzystorekk opened this issue Oct 22, 2024 · 1 comment
Labels
bug Something isn't working

Comments

@tranzystorekk
Copy link

Minimal repro example:

const std = @import("std");
const builtin = @import("builtin");

const cova = @import("cova");

const CommandT = cova.Command.Base();
const ValueT = CommandT.ValueT;

const setup_cmd = CommandT{
    .name = "foo",
    .vals = &.{
        ValueT.ofType([]const u8, .{
            .name = "arg",
        }),
    },
};

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    const alloc = gpa.allocator();

    const stdout = std.io.getStdOut().writer();
    const stderr = std.io.getStdErr().writer();

    const cmd = try setup_cmd.init(alloc, .{});
    defer cmd.deinit();

    var args_iter = try cova.ArgIteratorGeneric.init(alloc);
    defer args_iter.deinit();

    cova.parseArgs(&args_iter, CommandT, cmd, stdout, .{}) catch |err| switch (err) {
        error.UsageHelpCalled => return,
        else => return err,
    };

    if (builtin.mode == .Debug) {
        try cova.utils.displayCmdInfo(CommandT, cmd, alloc, &stderr, false);
    }
}

Building this program with cova 0.10.1-beta and running it as prog "" causes the following error:

❯ zig-out/bin/cova-empty-string ""
debug(cova): Parsing Command 'foo'...
debug(cova): Initial Arg: zig-out/bin/cova-empty-string
debug(cova): Current Arg:
debug(cova): Attempting to Parse Commands...
debug(cova): No Commands Matched for Command 'foo'.
debug(cova): Attempting to Parse Options...
thread 20089 panic: index out of bounds: index 2, len 1
/home/devuser/.cache/zig/p/12202782cc66e88f0c15b9acea9d6d1d50dbe941d68b5297927243f6d0377dbb1123/src/cova.zig:419:41: 0x1094329 in parseArgsCtx__anon_5016 (cova-empty-string
)
                    if (!mem.eql(u8, arg[0..long_pf.len], long_pf)) break :checkLongOpt;
                                        ^
/home/devuser/.cache/zig/p/12202782cc66e88f0c15b9acea9d6d1d50dbe941d68b5297927243f6d0377dbb1123/src/cova.zig:229:21: 0x1099fc4 in parseArgs__anon_5014 (cova-empty-string)
    try parseArgsCtx(
                    ^
/tmp/cova-empty-string/src/main.zig:31:19: 0x10b60a1 in main (cova-empty-string)
    cova.parseArgs(&args_iter, CommandT, cmd, stdout, .{}) catch |err| switch (err) {
                  ^
/usr/lib/zig/std/start.zig:524:37: 0x1064eb5 in posixCallMainAndExit (cova-empty-string)
            const result = root.main() catch |err| {
                                    ^
/usr/lib/zig/std/start.zig:266:5: 0x10649d1 in _start (cova-empty-string)
    asm volatile (switch (native_arch) {
    ^
???:?:?: 0x1 in ??? (???)
Unwind information for `???:0x1` was not available, trace may be incomplete

zsh: IOT instruction  zig-out/bin/cova-empty-string ""
@00JCIV00
Copy link
Owner

Good find! That's a logic error in my Option parsing logic. I'll get it fixed when I have a second.

@00JCIV00 00JCIV00 added the bug Something isn't working label Oct 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants