2010-07-09 2 views
5

In der C-Programmierung auf „Reset“, wenn ich versuche erstes Mal Katze auszuführen, muß ichdas erste Byte auf 0 oder Verwendung Memset Sets gesamte Puffer

TCHAR file_name[1024]; 
// Use memset or set the first byte to 0? 
file_name[0] = 0; 
_tcscat(file_name, TEMP_DIRECTORY_PATH); 
_tcscat(file_name, file); 

ich die meisten Programmierer verwenden Memset sehen. Aber für mich setze ich das erste Byte auf 0, damit _tcscat weiß, wo ich anfangen soll.

Ich bin nicht sicher, ob es einen Mangel/eine Falle dafür gibt, anstatt memset zu verwenden?

Danke.

Antwort

3

Sie können setzen nur das erste Zeichen auf 0

jedoch eine noch einfachere Art und Weise sein, würde

TCHAR file_name[1024]; 
_tcsncpy(file_name, TEMP_DIRECTORY_PATH, 1024); 
_tcscat(file_name, file); 
1

Keine wirklich, außer dass die Einstellung alles Nullen Bugs später verhindern kann, d. H. Wenn Sie aus irgendeinem Grund keine hinzufügen. Es ist einfacher, die gesamte Zeichenfolge mit Nullen zu füllen und zu wissen, dass Sie sich keine Gedanken darüber machen müssen, ob Sie später manuell einen Null-Terminator hinzufügen, solange Sie den Puffer nicht überlaufen lassen.

+0

Ich stimme nicht zu. Es ist wahrscheinlicher, Fehler in der Logik zu verstecken, die plötzlich auftauchen wird, wenn jemand, der den Code beibehält, später entscheidet: "Hey, lass uns all diese nutzlosen Speicher entfernen!" –

1

Die Einstellung des gesamten Puffers auf NUL-Zeichen ist eine "Verteidigung in der Tiefe". Eine solche Verteidigung deckt einen Fehler ab, der anderswo im Quellcode gemacht wurde, vielleicht von einem anderen Programmierer. In diesem Fall würde der Fehler, gegen den geschützt wird, darin bestehen, eine Zeichenfolge zu kopieren, die zwar in den Puffer passt, aber das NUL-Beendigungsbyte nicht kopiert. Der Puffer, der bereits null ist, würde die abschließenden NULs für diese fehlerhafte Zeichenfolge-Kopie zur Verfügung stellen. Programmierer unterscheiden sich in der Weisheit von "Defense in Depth", weil eine solche Kodierung Programmierfehler maskieren kann, die dann im Quellcode eitern - und erst lange nach ihrer Einführung behoben werden.

Meiner Meinung nach ist das Einstellen des Puffers auf alle NUL-Zeichen wie dieses als "Verteidigung in der Tiefe" eine riesige Verschwendung. Es wäre sinnvoller, nur NUL das letzte Byte zu haben. Dann würden Fehler auftreten, aber die Strings würden schließlich beendet werden. Sobald man diesen Gedankengang durchläuft, würde die "Verteidigung in der Tiefe" mehr Sinn ergeben, wenn der Puffer zwei Maschinenwörter länger gemacht hätte, und diese Wörter wurden auf Null gesetzt, und möglicherweise könnte ein kanarischer Wert eine Überschreitung des Wertes anzeigen Puffer und ....

Oder Sie könnten einfach Puffer nicht überlaufen, und schreiben Sie Ihr Programm so, dass es so schnell wie möglich abstürzt, wenn Sie dies tun. Das mache ich gerne.

+0

+1 für nette Analyse der Vor- und Nachteile der verschiedenen Optionen. –

4

Ich bin nicht einverstanden mit den meisten der Antworten, die darauf hindeuten, dass die gesamte Einstellung Puffer bis 0 kann hilfreich sein. Wenn Sie nullterminierte Strings in den Puffer kopieren/verketten, müssen Sie das Ganze nicht löschen - es scheint mir eine Verschwendung zu sein (obwohl es sicherlich eine Verschwendung ist, über die es sich nicht zu kümmern lohnt).

Sie könnten den Ansatz, dass Artelius suggested und verwenden eine strcpy() Variante die anfängliche Zeichenfolge in den Puffer zu bekommen, aber ich denke, die Symmetrie des Ansatzes strcat() `Verdienst als gut (obwohl ich denke, dass gerade Einstellung das erste Zeichen zu 0 ist genug).

Nebenbei, wenn der Puffer 'sensible' Daten (Passwort-Informationen oder etwas) enthalten könnte - das könnte Grund sein, die ganze Sache zu klären. Aber wenn das der Fall ist, werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/library/ms972826 aus bestimmten Gründen, warum memset() möglicherweise nicht ganz genug ist.

+0

Wirklich? Ich denke, es ist ziemlich dumm, den Puffer auf Nullen zu setzen, aber ich denke, dass nicht in meiner Antwort. –

+0

Und was auch immer Sie tun." Nullen Sie sicher Speicher, speichern Sie es nicht in den Microsoft geschützten Speicher ... Das Ding ist CALEA kompatibel, offensichtlich. Wählen Sie Ihre Seite, nehme ich an. –

+0

Wenn Sie Symmetrie wollen, könnten Sie 'strcpy (s," "); 'um den String zu" initialisieren "und trotzdem' strcat' für alle korrekten Schreibvorgänge zu verwenden. –