Wie kann fopen_s sicherer sein als fopen?
Arbeite ich auf legacy code für Windows
Plattform. Wenn ich den code kompilieren in VS2013
gibt es folgende Warnung:
error C4996: '
fopen
': Diese Funktion oder variable möglicherweise nicht sicher ist. Erwägen Sie die Verwendungfopen_s
statt. Zum deaktivieren von veralteten, verwenden Sie _CRT_SECURE_NO_WARNINGS. Siehe online-Hilfe für details."
Und es wird auch samiliar Warnung für sprintf
. Ich verstehe sprintf_s
ist sicherer als sprintf, weil der buffer-overflow.
Aber wie kann fopen_s sicherer als fopen
gibt es keine Möglichkeit von buffer-overflow, weil fopen
nicht akzeptieren, ein Puffer. Kann jemand geben einen Fall fopen
ist unsicher, und fopen_s
sicher ist?
InformationsquelleAutor der Frage ZijingWu | 2013-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
s
stand nicht für "sicher" in diesem Fall, es steht für "security enhanced". Fürfopen_s
ist, werden die Parameter auf Gültigkeit überprüft, bevor Sie versuchen, die Datei zu öffnen.Mit
fopen
übergeben Sie einen NULL-Zeiger für den Dateinamen und das alles wird wahrscheinlich auseinanderfallen.fopen_s
nicht haben, dass problem (a).Beachten Sie, dass diese bounds-checking interfaces wie
fopen_s
sind ein optional Teil der ISO-Norm, in Anhang K (Stand C11, sowieso). Implementierungen sind nicht erforderlich zu versorgen und, um ehrlich zu sein,fopen
und viele andere so genannte unsichere Funktionen sind perfekt sicher, wenn Sie wissen, was Sie tun als coder.Es ist interessant zu beachten, dass
fopen_s
auffangen wird NULL-Zeiger aber nicht Ungültiger Zeiger, also, warum es die Sicherheit verbessert, anstatt sicher - man kann immer noch dazu führen, einige Schäden, wenn Sie übergeben Sie eine ungültige, aber nicht NULL-Zeiger.Andere "sichere" Funktionen, die Sie zwingen, sich zu stellen Ziel-buffer-Größen sind auch sicher nur so lange, wie Sie passieren die richtige Größe. Pass etwas zu groß und sind alle Wetten ab.
(a) Von
C11 K.3.5.2.1 The fopen_s function
:Kontrast, der mit
C11 7.20.5.3 The fopen function
die besagt, dass der Dateiname und der Modus müssen beide auf einen string, aber nicht angeben, was passiert, wenn Sie einen NULL-Zeiger (die meisten Implementierungen würde wahrscheinlich zu einem Absturz mit einem null-Zeiger-Dereferenzierung).InformationsquelleAutor der Antwort paxdiablo