Frage

fand ich zwei Arten von Befehlszeilenargumenten in eine Zeichengruppe übergeben:

int main (int argc, char **argv)
{
  const char *s1 = argv[0];
  char s2[256];
  strcpy(s2, argv[0]);

  printf("s1: %s\ns2: %s\n\n", s1, s2);
}

Zusammengestellt mit dem IBM XLC-Compiler auf einem AIX-System Returns

  

[MyPrompt]> ./a.out

     

s1: ./a.out

     

s2: ./a.out

Welche Implementierung (S1 oder S2) ist richtig? s1 ist schön, weil argv [0] beliebig lang sein kann. s2 erfordert, dass die Länge von argv [0] <256 Zeichen.

Ich verstehe nicht, wie / warum s1 funktionieren soll. I denken die rechte Seite von s1 bei der Kompilierung erforderlich sein sollte, aber ich denken es zur Laufzeit erzeugt wird.

War es hilfreich?

Lösung

Der Grund s1 funktioniert, weil die Art der argv [0] ist ein Zeiger. Sie zuweisen einfach die Adresse (nicht der Ist-Wert), der sicher ist. Sie sind nicht jede Art von Zuteilung oder Gussdurchgeführt wird.

Ich ziehe normalerweise die erste Option, da Sie nur von den Argumentvariablen lesen sollten.

Andere Tipps

Wenn Sie nicht wollen, die Zeichenfolge ändern, dann wird s1 arbeiten.

Wenn Sie die Zeichenfolge ändern möchten, dann können Sie eine Kopie davon machen. Sie sollten die sichereren strnlen () und strncpy (), obwohl, wenn Ihr System unterstützt wird.

  

Ich denke, die rechte Seite von s1   sollte bei der Kompilierung erforderlich sein,   aber ich denke, es erzeugt bei   Laufzeit.

Nein, es ist jedes Mal die Anweisung angetroffen wird erforderlich. Zum Beispiel:

void f() {
   int x = 1;
   ...
}

Die ganze Zahl x wird jedes Mal, wenn die Funktion aufgerufen wird, nicht bei der Kompilierung auf 1 initialisiert werden.

s2 hat die herrliche Eigenschaft zu einem Pufferüberlauf anfällig zu sein.

Ich habe gesehen, wie Menschen verändern den Wert von argv [0]. In einigen Fällen (bei einigen OSes) Ändern argv [0] wird das Programm in ps auftauchen machen, wie alles, was Sie geändert haben es.

Wenn Sie nur das Argument verweisen, ohne Änderungen daran vornehmen und dann die s1 ist richtig.
Wenn Sie das Argument in irgendeiner Weise verändern müssen, dann müssen Sie eine Kopie davon machen, wie in dem s2 Beispiel, aber in dem s2 Beispiel müssen Sie explizit zu überprüfen, sehen, ob die Länge länger als der Puffer Sie kopieren es. Zum Beispiel, wenn Sie ein Argument wie filename.jpg als Eingabe nehmen und Speicher aus filename.gif als die Ausgabe dann müssen Sie eine Kopie dieses Arguments, da Sie die Erweiterung von .jpg werden Umstellung auf .gif

ich mit s1 gehen würde, vor allem für argv [n], wobei n> 0 Dinge wie s2 Sie sich für klassische Pufferüberlaufangriff öffnen. Grundsätzlich kann ein Benutzer ein Argument formatieren, die über 256 Zeichen lang ist und überschrieben werden Informationen auf dem Stapel, so dass sie keinen Code ausführen können, die sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top