Відповідно до стандарту
Отже, з вашої цитати:
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 переповнюватися". ("Докторе, боляче, коли я це роблю")