Frage

Ich beendete vor kurzem ein Studium in C. Deshalb Erfahrung fehlt mir, natürlich.

Einige Universitäten neigen dazu, ihre Studenten sichere Programmierung zu lehren, oder zumindest einige Elemente . Es gibt sogar ein Video ( genommen von hier ).

in C zu sein, das Kopieren Strings erfordert - soweit ich weiß - strcpy oder string.h Funktionen. Wie verwenden Sie es sicher im täglichen Programmierung? Haben Sie einige Funktionen, die Zuordnung behandeln Pufferüberlauf zu verhindern? Es gibt die CERT sichere Codierung Standard für C . Es Beispiele und kompatible Lösungen anbieten:

int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[128];
  strcpy(prog_name, argv[0]);
  /* ... */
}

Und ihre Alternative ist:

int main(int argc, char *argv[]) {
  /* ... */
  char *prog_name = (char *)malloc(strlen(argv[0])+1);
  if (prog_name != NULL) {
    strcpy(prog_name, argv[0]);
  }
  else {
    /* Couldn't get the memory - recover */
  }
  /* ... */
}

Genommen von hier 2. Beispiel .

Aber soweit ich es das ist nur eine größere Herausforderung, mehr Code, mehr Arbeit. Warum ändert sich niemand die Bibliothek selbst? Oder zumindest, warum nicht bietet niemand eine sichere Alternative Bibliothek oder Funktionen, die diese in der richtigen Art und Weise handhaben?

Danke für das Lesen, Wishi

War es hilfreich?

Lösung

Die Posix-Funktion für diesen (auf fast jedem System) ist strdup(). strcpy() wird verwendet, wenn Sie keine neuen Speicher zuweisen wollen und haben bereits einen Puffer Sie verwenden möchten, aber dann besser bekannt, wie groß dieser Puffer ist und wenn die Zeichenfolge passt es. Wenn Sie nicht wissen, ob der String passt, gibt es strncpy(), die gerade kopiert eine bestimmte Anzahl von Zeichen. So können Sie die kopierte Menge auf Ihre Puffer Größe begrenzen.

Und außerdem, dass, gibt es viele Stachel Bibliotheken, die String-Größen auf unterschiedliche Weise zu verwalten.

Und da Sie es getaggt C ++. Es ist std::string, der für Sie alle Speicherverwaltung funktioniert und was Sie nicht diese Probleme geben

Andere Tipps

die l (strlcpy, strlcat) Funktionen von OpenBSD ist in der Regel besser als die n Funktionen, sie sind schneller und einfacher zu bedienen sicher, aber sie sind nicht der Standard entsprechend. Allerdings sind BSD-sie lizenziert, so dass Sie eine bekannte gute Umsetzung in jedem Programm enthalten können, so dass Sie sowohl Cross-Plattform und sicher sein können.

Für Windows, wenn Sie nicht über Portabilität kümmern, können Sie mit * _s Funktionen.

Verwenden Sie strncpy :

#define BUFSIZE 127
int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[BUFSIZE + 1];
  strncpy(prog_name, argv[0], BUFSIZE);
  progname[BUFSIZE]= '\0';
  /* ... */
}

Es gibt *n* Versionen für die meisten str* Funktionen.

Wenn ich es richtig, Ihre eigentliche Frage verstehen, warum die API-Funktionen nicht sicherer gemacht werden.

Ein Grund Grund ist, dass C-Bibliothek ist Vermächtnis (zu spät, um es jetzt zu ändern).

Der Hauptgrund dafür ist jedoch, dass die Bibliothek ausgelegt ist minimalistisch zu sein, so dass es das Nötigste tut und es liegt in der Verantwortung des Anwenders, um sicherzustellen, dass es korrekt aufgerufen wird. Wenn es keine übermäßigen Kontrollen tat, dann würde ein Preis bezahlt wird jedes Mal, sie genannt wird, auch wenn der Benutzer aus anderen Gründen versichern kann, ist das kein Problem auftreten wird. Das ist sehr, sehr häufig in vielen APIs.

Davon abgesehen, gibt es genügend Bibliotheken, die sicherere Alternativen bieten, sind sie einfach nicht Teil der Standardbibliothek. Auch viele Menschen, die höhere Ebene Sachen Arbeit tun mit C ++, die Standard-Klassenbibliotheken für viele dieser Dinge hat.

Eigentlich hat Microsoft sichere Alternativen zu den CRT-Funktionen zur Verfügung stellen. Jeder, den ich kenne hasst sie aber und deaktiviert die Warnung, dass Sie nicht die alten Funktionen verwenden sollten. Wenn Sie etwas sicher wollen, vielleicht sollten Sie C ++ verwenden. Und dann entweder STL-Strings oder so etwas wie Qt.

Na ja, oder Sie gehen auf Plattformen wie .NET oder Java, die in der Regel nicht von diesen Problemen leidet (Ihre Anwendung abstürzen, aber keine Möglichkeit, Code in Ihre Anwendung durch einen Pufferüberlauf zu injizieren).

Edit: Mit Data Execution Prevention / aktiviert NX (Standard für Vista und .NET), sollte dies kein Problem für traditionelle Plattformen wie gut.

int main
(
    int argc, 
    char *argV[]
) 
{
   char prog_name[128];
   if (strlen(argV[0]) < sizeof(prog_name))
   {
       strcpy(prog_name, argV[0]);
   }
   else
   {
       printf("%s is too large for the internal buffer\n", argV[0]);
   }

   return 0;
}

Vielleicht möchten Sie nützliche Lektüre Antworten finden href="https://stackoverflow.com/questions/486383/safer-alternatives-to-the-c-standard-library#487864"> diese Frage

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