Kann argv [0] eine leere Zeichenfolge enthalten?

8

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.

    
Sangeeth Saravanaraj 29.12.2011, 08:19
quelle

4 Antworten

9

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-Member argv[0] through    argv[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 von argv[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.

    
GManNickG 29.12.2011, 08:32
quelle
6

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).

    
Keith Thompson 29.12.2011 08:33
quelle
5

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:

%Vor%

Der zweite, argv0 , ruft ein beliebiges anderes Programm auf und lässt den Benutzer das argv:

des anderen Programms angeben %Vor%

(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.

    
user25148 29.12.2011 09:11
quelle
1

argv [0] kann in C null sein, zum Beispiel, wenn Sie direkt eine Hauptfunktion aufrufen (mit einigen Tricks kann in C getan werden). Ich weiß nicht, ob C ++ direkten Hauptaufruf erlaubt.

    
BigMike 29.12.2011 08:25
quelle

Tags und Links