Відповідно до стандарту
Отже, з вашої цитати:
argv[argc] має бути нульовим покажчиком
Отже, argcне може переповнюватися, оскільки тоді вищезазначене твердження не було б істинним.
На практиці
На практиці загальний розмір аргументів, переданих програмі, обмежений.
У моїй системі Linux / x64:
$ getconf ARG_MAX
2097152
Отже, загальний розмір аргументу становить близько 2 мегабайт і argcне може переповнюватись. Я вважаю, що ця межа вимірює поєднання загальної суми даних argvта середовища. Якщо ви перевищите це обмеження під час спроби запустити команду, exec()помилка не відбудеться E2BIG. Від man 2 execve:
E2BIG Загальна кількість байтів у середовищі (envp) та аргумент
список (argv) завеликий.
Я вважаю, що ліміт ~ 2 мегабайти в моїй системі є відносно щедрим порівняно з іншими системами. Моя система OS X повідомляє про обмеження ~ 260 КБ.
Але що, якби вони ARG_MAXбули справді великими?
Гаразд, припустимо, ви перебуваєте у старій / дивній системі, так intце 16 біт, а ARG_MAX значно перевищує 2 15 , що інакше цілком розумно. Тепер, припустимо, ви використовуєте execve()понад 2 15 аргументів. Реалізація має два варіанти.
Це може дозволити argcпереповнення ... в основному, викидаючи ваші дані, гарантуючи, що програма, яку ви запускаєте, виконується якось несподівано і, можливо, помилково, і порушує стандарт C. Найгірше - помилка мовчить, тож ви ніколи не дізнаєтесь.
Або він може просто повернутися EOVERFLOWз execve(), повідомляючи вам, що просто не може запустити зображення з такою кількістю параметрів. Зараз стандарти POSIX / SUS нічого не згадують про цей результат помилки ... але, я підозрюю, це просто тому, що стандартні автори ніколи не очікували, що ARG_MAXвони будуть більшими за INT_MAX.
Варіант №2 - єдиний розумний варіант. Якщо ваша система яким - то чином вибирає варіант # 1, то вона порушена , і ви повинні подати звіт про помилку.
Як варіант, ви можете спробувати запустити стару програму, скомпільовану для 16-розрядної системи, але ви запускаєте її через якийсь емулятор або рівень сумісності. Я б очікувати , що емулятор або сумісність шару буде видано повідомлення про помилку , якщо ви намагалися передати більше 2 15 параметрів програми.
Standard says that argv[argc] must be a null pointer but this will be false if argc overflow- Я читаю це як "Не дозволяйте argc переповнюватися". ("Докторе, боляче, коли я це роблю")