rust-lang/cargo · error

no argv[0]

Error message

no argv[0]

What it means

As the last resort in cargo_exe, from_argv (mod.rs:577-589) reads env::args_os().next() to get argv[0]. If that iterator yields no value at all (no program name), it bails 'no argv[0]'. This is extraordinarily rare since a process normally always has argv[0].

Source

Thrown at src/context/mod.rs:587

                    // Try fetching the path to `cargo` using `env::current_exe()`.
                    // The method varies per operating system and might fail; in particular,
                    // it depends on `/proc` being mounted on Linux, and some environments
                    // (like containers or chroots) may not have that available.
                    let exe = env::current_exe()?;
                    Ok(exe)
                }

                fn from_argv() -> CargoResult<PathBuf> {
                    // Grab `argv[0]` and attempt to resolve it to an absolute path.
                    // If `argv[0]` has one component, it must have come from a `PATH` lookup,
                    // so probe `PATH` in that case.
                    // Otherwise, it has multiple components and is either:
                    // - a relative path (e.g., `./cargo`, `target/debug/cargo`), or
                    // - an absolute path (e.g., `/usr/local/bin/cargo`).
                    let argv0 = env::args_os()
                        .map(PathBuf::from)
                        .next()
                        .ok_or_else(|| anyhow!("no argv[0]"))?;
                    paths::resolve_executable(&argv0)
                }

                // Determines whether `path` is a cargo binary.
                // See: https://github.com/rust-lang/cargo/issues/15099#issuecomment-2666737150
                fn is_cargo(path: &Path) -> bool {
                    path.file_stem() == Some(OsStr::new("cargo"))
                }

                let from_current_exe = from_current_exe();
                if from_current_exe.as_deref().is_ok_and(is_cargo) {
                    return from_current_exe;
                }

                let from_argv = from_argv();
                if from_argv.as_deref().is_ok_and(is_cargo) {
                    return from_argv;
                }

View on GitHub (pinned to 0e07a15537)

Solutions

  1. Launch the process with a proper argv[0] (the program name).
  2. Set `CARGO` env var so the argv fallback is never needed.
  3. Ensure /proc is mounted so current_exe() succeeds first.

Example fix

# before (execve with empty argv)
execve("/usr/bin/cargo", [], envp)   # no argv[0]
# after
execve("/usr/bin/cargo", ["cargo", "build"], envp)
Defensive patterns

Strategy: validation

Validate before calling

# Never exec a process with empty argv; always include argv[0]:
execve("/usr/bin/cargo", ["cargo", "build"], envp)

Prevention

When it happens

Trigger: The process was started with a zero-length argv (e.g. via execve with an empty argv array) AND current_exe() failed AND $CARGO is unset, so the argv[0] fallback is reached and finds nothing.

Common situations: Exotic launchers that exec with empty argv; corrupted/odd process spawning in sandbox or fuzz harness; OS where current_exe is unavailable (no /proc) combined with empty argv.

Related errors


AI-assisted analysis of rust-lang/cargo@0e07a15537 (2026-08-06). Data as JSON: /data/errors/ca75b6fdc2c06260.json. Report an issue: GitHub.