Nach dem Standard
Also, aus Ihrem Zitat:
argv[argc]
muss ein Nullzeiger sein
Daher argc
kann nicht überlaufen, weil dann die obige Aussage würde nicht wahr sein.
In der Praxis
In der Praxis ist die Gesamtgröße der an ein Programm übergebenen Argumente begrenzt.
Auf meinem Linux / x64-System:
$ getconf ARG_MAX
2097152
Daher beträgt die Gesamtargumentgröße etwa 2 Megabyte und argc
kann nicht überlaufen. Ich glaube, diese Grenze misst eine Kombination der Gesamtdaten in argv
und der Umgebung. Wenn Sie diese Grenze überschreiten, wenn Sie versuchen, einen Befehl auszuführen, exec()
schlägt dies fehl E2BIG
. Von man 2 execve
:
E2BIG Die Gesamtzahl der Bytes in der Umgebung (envp) und im Argument
list (argv) ist zu groß.
Ich glaube, dass die ~ 2-Megabyte-Grenze auf meinem System im Vergleich zu anderen Systemen relativ großzügig ist. Mein OS X-System meldet ein Limit von ~ 260 KB.
Aber was wäre, wenn ARG_MAX
sie wirklich groß wären ?
Okay, nehmen wir an, Sie befinden sich auf einem alten / seltsamen System, also int
16 Bit, und ARG_MAX liegt weit über 2 15 , was ansonsten durchaus vernünftig ist. Angenommen, Sie rufen execve()
mit mehr als 2 bis 15 Argumenten auf. Die Implementierung hat zwei Möglichkeiten.
Es kann argc
zu einem Überlauf kommen ... im Grunde genommen können Sie Ihre Daten wegwerfen, sicherstellen, dass das von Ihnen ausgeführte Programm auf unerwartete und wahrscheinlich fehlerhafte Weise ausgeführt wird, und gegen den C-Standard verstoßen. Am schlimmsten ist, dass der Fehler still ist, sodass Sie es möglicherweise nie erfahren.
Oder es kann einfach Rückkehr EOVERFLOW
aus execve()
, die Sie darüber informiert , dass es einfach nicht , ein Bild mit , dass viele Parameter ausführen. Nun, die POSIX / SUS-Standards erwähnen nichts über dieses Fehlerergebnis ... aber ich vermute, das liegt einfach daran, dass die Standardschreiber nie erwartet haben ARG_MAX
, größer als zu sein INT_MAX
.
Option 2 ist die einzig vernünftige Option. Wenn Ihr System irgendwie Option 1 wählt, ist diese defekt und Sie sollten einen Fehlerbericht einreichen.
Alternativ könnten Sie versuchen, ein altes Programm auszuführen, das für ein 16-Bit-System kompiliert wurde, aber Sie führen es über eine Art Emulator oder Kompatibilitätsschicht aus. Ich würde erwarten, dass der Emulator oder die Kompatibilitätsschicht eine Fehlermeldung ausgibt, wenn Sie versuchen, mehr als 2 15 Parameter an ein Programm zu übergeben.
Standard says that argv[argc] must be a null pointer but this will be false if argc overflow
- Ich habe dies als "Lass Argc nicht überlaufen" gelesen. ("Doktor, es tut weh, wenn ich das tue")