In jedem C-Programm zeigt das Befehlszeilenargument argv[0]
auf den Namen, der zum Aufrufen des Programms verwendet wird. Gibt es Umstände, unter denen es auf eine leere Zeichenfolge ""
zeigt?
Ein Beispielcode-Snippet für einen solchen Fall wäre eine gute Referenz.
Es ist die Implementierung definiert. §5.1.2.2.1 gekürzt:
Wenn der Wert von
argc
größer als Null ist, werden die Array-Memberargv[0]
throughargv[argc-1]
inclusive soll Zeiger auf die angegebenen Strings enthalten Implementierung definierte Werte von der Host-Umgebung vor dem Programmstart. Das Absicht ist es, dem Programm Informationen zu liefern, die vor dem Programmstart ermittelt wurden von anderswo in der gehosteten Umgebung. [...]Wenn der Wert von
argc
größer als Null ist, wird der String vonargv[0]
angezeigt repräsentiert den Programmnamen;argv[0][0]
soll das Nullzeichen sein, wenn der Der Programmname ist in der Host-Umgebung nicht verfügbar. [...]
Wenn also argc
größer als Null ist, ist es ziemlich genau die Absicht , dass argv[0]
niemals eine leere Zeichenfolge ist, aber es könnte passieren. (Beachten Sie, dass mit argc
gleich n
, argv[0]
bis argv[n - 1]
niemals null sind und immer auf eine Zeichenkette zeigen. Die Zeichenkette selbst kann jedoch leer sein. Wenn n
gleich Null ist, ist argv[0]
null.)
In der Praxis müssen Sie natürlich nur sicherstellen, dass sich die Plattformen, auf die Sie sich ausrichten, nach Bedarf verhalten.
Ja.
Der C-Sprachstandard erlaubt explizit die Möglichkeit, dass argv[0]
ein Nullzeiger sein kann, oder , der auf eine leere Zeichenkette ( ""
) zeigen kann. N1256 5.1.2.2.1p2:
Der Wert von argc soll nicht negativ sein.
argv [argc] soll ein Nullzeiger sein.
[...]
Wenn der Wert von argc größer als null ist, wird auf die Zeichenfolge verwiesen mit argv [0] steht für den Programmnamen ; argv [0] [0] soll sein das Nullzeichen, wenn der Programmname nicht vom Host verfügbar ist Umgebung. Wenn der Wert von argc größer als eins ist, die Zeichenfolgen argv [1] zeigen durch argv [argc-1] die Programmparameter .
Auf Unix-ähnlichen Systemen werden Programme durch eine der Funktionen exec()
( execl()
, execlp()
usw.) aufgerufen, die es dem Aufrufer ermöglichen, genau anzugeben, welche Argumente an die% co_de übergeben werden % Funktion. (Es ist sogar möglich, ein Programm auf eine Weise aufzurufen, die die Anforderungen des C-Standards verletzt.)
Beachten Sie, dass der Standard besagt, dass main()
(unter der Annahme, dass er weder null noch leer ist) " für den Programmnamen" steht. Der Standard ist absichtlich vage bezüglich wie er den Programmnamen darstellt. Insbesondere muss kein Name angegeben werden, mit dem das Programm aufgerufen werden kann (da der Standard nicht einmal erfordert, dass Programme über den Namen aufgerufen werden können).
Andere Antworten haben den C-Standard zitiert und gezeigt, dass argv[0]
und NULL
sein können oder es kann die leere Zeichenfolge ( ""
) sein. Sie sollten Ihr Programm mit der Annahme schreiben, dass dies passieren kann, da Sie sonst ein (kleines) Sicherheitsrisiko erzeugen. Es ist einfach, Ihr Programm aufzurufen und argv
auf alles einzustellen, was ein Angreifer möchte. Betrachten Sie als Beweis die folgenden zwei Programme. Der erste, echoargv.c
gibt den Inhalt von argv
aus:
Der zweite, argv0
, ruft ein beliebiges anderes Programm auf und lässt den Benutzer das argv:
(Dies ist eine Posix-spezifische Version. Nicht standardisierte Umgebungen müssen möglicherweise geändert werden.)
So verwenden Sie sie:
%Vor% Die erste Ausführung von argv0
setzt echoargv
's argv[0]
auf NULL.
Der zweite Lauf macht es die leere Zeichenfolge.
Der dritte Lauf ist nur zum Spaß da: Beachten Sie, dass argv[0]
nicht benötigt wird
irgendetwas mit dem tatsächlichen Namen des Programms zu tun.
Wie kann dich das beißen? Wenn Sie z. B. blind den Namen Ihres Programms in einer Verwendungsnachricht ausdrucken:
%Vor%Besser:
%Vor%Wenn Sie dies nicht tun, kann ein Angreifer Ihr Programm nach Belieben segfault machen oder Ihr Programm kann dem Benutzer völlig falsche Dinge melden.