Будет ли argc когда-либо передан менее 1 - PullRequest
1 голос
/ 01 ноября 2019

Я разрабатываю собственную версию getopt () в сборке и пытаюсь обернуть мою голову вокруг этого фрагмента , в частности строки 476

    if (argc < 1)
       return -1;

Как обычное соглашение о вызовахбыло бы что-то вроде этого;

    int c = getopt( argc, argv, "vm:drx:");

и предполагая, что программист ничего не делал с argc до этого, единственная причина, по которой я могу думать, это то, что это какой-то вариант Linux, возможно, не POSIX-совместимыйне будет передавать argv [0] путь и имя приложения. Следовательно, argc может быть нулем. Есть ли какое-либо доверие к этой гипотезе?

Из 12 раз, когда эта переменная используется в этой процедуре, она только когда-либо утверждается или копируется, никогда не модифицируется и вообще не упоминается на двух уровнях процедуры до этого.

1 Ответ

3 голосов
/ 01 ноября 2019

Рассмотрим это:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
        execve("./testargc", NULL, NULL);
}

И эта программа:

#include <stdio.h>

int main (int argc, char* argv[])
{
        printf("%d\n", argc);
}

Первый выполняет второй без аргументов. Путь не передается, и в результате argc равен 0.

...