Ответ 1
В соответствии со стандартом
Итак, из вашей цитаты:
argv[argc]
требуется, чтобы он был нулевым указателем
Следовательно, argc
не может переполняться, потому что указанное выше утверждение не будет истинным.
На практике
На практике общий размер аргументов, переданных программе, ограничен.
В моей системе Linux/x64:
$ getconf ARG_MAX 2097152
Следовательно, общий размер аргумента составляет около 2 мегабайт, а argc
не может переполняться. Я считаю, что этот предел измеряет комбинацию общих данных в argv
и окружающей среде. Если вы превысите этот предел при попытке выполнить команду, exec()
завершится с ошибкой E2BIG
. Из man 2 execve
:
E2BIG The total number of bytes in the environment (envp) and argument list (argv) is too large.
Я считаю, что ограничение в 2 мегабайта на моей системе относительно велико по сравнению с другими системами. Моя система OS X сообщает о пределе ~ 260 КБ.
Но что, если ARG_MAX
были действительно большими?
Хорошо, предположим, что вы находитесь в старой/странной системе, поэтому int
- 16 бит, а ARG_MAX - более 2 15 что в противном случае вполне разумно. Предположим, вы вызываете execve()
с более чем двумя аргументами 15. Реализация имеет два варианта.
-
Это может позволить переполнению
argc
... в основном, отбрасывая ваши данные, гарантируя, что выполняемая вами программа выполняется в некоторых неожиданных и, вероятно, ошибочно, и нарушает стандарт C. Хуже всего, ошибка затихает, поэтому вы никогда не узнаете. -
Или он может просто вернуть
EOVERFLOW
изexecve()
, сообщив вам, что он просто не может запустить изображение с таким количеством параметров. Теперь стандарты POSIX/SUS ничего не упоминают об этом результате ошибки... но я подозреваю, что это просто потому, что стандартные авторы никогда не ожидали, чтоARG_MAX
будет больше, чемINT_MAX
.
Вариант № 2 является единственным разумным вариантом. Если ваша система каким-то образом выбирает вариант №1, то она сломана, и вы должны подать отчет об ошибке.
В качестве альтернативы вы можете попробовать запустить старую программу, скомпилированную для 16-разрядной системы, но вы запускаете ее через какой-то эмулятор или уровень совместимости. Я ожидал, что эмулятор или уровень совместимости выдаст сообщение об ошибке, если вы попытаетесь передать в программу более 2 параметров 15.