Also hier glaube ich, dass ich ein kleines Pufferüberlaufproblem habe, das ich fand, wenn ich den Code einer anderen Person prüfe. Es erschien mir sofort als falsch und potentiell gefährlich, aber zugegebenermaßen konnte ich die tatsächlichen Folgen dieses "Fehlers", wenn überhaupt, nicht erklären.Konsequenzen dieses Pufferüberlaufs?
Ich hatte eine Test-App geschrieben, um den Fehler zu demonstrieren, fand aber (zu meiner Bestürzung), dass es unabhängig vom Überlauf korrekt zu laufen scheint. Ich möchte glauben, dass dies nur zufällig ist, aber wollte ein Feedback, um festzustellen, ob mein Denken falsch war, oder ob es wirklich ein Problem gibt, das in meiner Test-App einfach nicht seinen Kopf zeigt.
Das Problem Code (Ich denke, es ist jedenfalls):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
Nun stand der Grund, dies für mich und ich möchte es Flag als ein möglicher Pufferüberlauf aufgrund der ersten strlen
ist. Aufgrund der Zeigerarithmetik führt die "falsche" Platzierung der + 1
dazu, dass strlen
26
anstelle von 27
zurückgibt (die Länge von "seine Zeichenfolge ist 27 Zeichen lang"). sprintf
, glaube ich, dann druckt 27 Char in den Puffer und hat einen Pufferüberlauf verursacht.
Ist das eine korrekte Einschätzung?
Ich schrieb eine Test-App, um dies für die Person zu demonstrieren, deren Code ich betrachtete, und stellte fest, dass die Zeichenfolge auch im Debugger korrekt gedruckt wird. Ich habe auch versucht, andere Variablen auf den Stack und Heap vor und nach diesem Code zu setzen, um zu sehen, ob ich benachbarte Speicherbereiche beeinflussen könnte, aber immer noch korrekte Ausgabe erhielt. Mir ist klar, dass mein neu zugewiesener Heap-Speicher möglicherweise nicht angrenzend ist, was den Mangel an nützlichem Überlauf erklären würde, aber ich wollte nur wirklich mit anderen Meinungen bestätigen, wenn dies tatsächlich ein Problem ist.
Da dies eine ziemlich einfache "Frage" ist, wäre es nett, wenn Sie Ihre Antwort mit einer Art Referenz auch unterstützen könnten. Während ich Ihre Eingabe wertschätze und begrüße, werde ich nicht "Ja, es ist" als endgültige Antwort akzeptieren. Vielen Dank im Voraus.
Update: Viele gute Antworten mit vielen besseren Einblick. Leider kann ich sie nicht alle akzeptieren. Danke, dass Sie Ihr Wissen geteilt haben und dass Sie meine "zweite Meinung" haben. Ich schätze die Hilfe.
Sie werden möglicherweise nicht mit dem obigen Code aufgrund von Padding/Alignment gebissen. Könnten Sie Ihre Experimente mit einer Zeichenfolge wiederholen, die z. B. 64 Zeichen lang ist, so dass die Zuweisung 65 Zeichen lang sein müsste? Und ordnen Sie zwei solche Zeichenfolgen vor dem 'Sprintf' zu und füllen Sie sie in verschiedenen Ordnungen. –
Das ist ziemlich böser Code, um eine rohe Zeichenkette zu nehmen und +1 hinzuzufügen! Ich würde den Code-Review nur wegen dieser Tatsache durchgehen. –
Und deshalb verwenden wir Entwickler so viele gut getestete Bibliotheken wie wir können ... weil wir so dumme Fehler machen! :-) @Johnson Ich bin mir ziemlich sicher, dass der Entwickler 1 zur Länge hinzufügen wollte, nicht die Saite selbst, daher der Bug. – corsiKa