3 Stimmen

Wie gehe ich mit argv-Zeichenfeldzuweisungen um?

Ich habe zwei Möglichkeiten gefunden, um Befehlszeilenargumente in ein Zeichenarray zu übertragen:

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);
}

Kompiliert mit dem IBM xlc-Compiler auf einem AIX-System Rückgabe

[MeinPrompt]> ./a.out

s1: ./a.out

s2: ./a.out

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

Ich verstehe nicht, wie/warum s1 funktionieren sollte. I denken die rechte Seite von s1 sollte zur Kompilierzeit erforderlich sein, aber ich denken sie wird zur Laufzeit generiert.

0voto

Dan Hook Punkte 6155

Ich würde mich für s1 entscheiden, insbesondere für argv[n] mit n > 0. Dinge wie s2 öffnen Sie für klassische Pufferüberlauf-Angriffe. Grundsätzlich kann ein Benutzer ein Argument mit einer Länge von mehr als 256 Zeichen formatieren und Informationen auf dem Stack überschreiben, so dass er jeden beliebigen Code ausführen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X