..\..\libraries\zlib\gzio.c(181) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
Dazu suchen wir zunächst das Makro F_OPEN.
#ifndef F_OPEN
# define F_OPEN(name, mode) fopen((name), (mode))
#endif
fopen hat die Aufrufsyntax:
FILE *fopen(
const char *filename,
const char *mode
);
Nun definieren uns ein neues Makro F_OPEN_S
#ifndef F_OPEN_S
# define F_OPEN_S(fileobj, name, mode) fopen_s((fileobj), (name), (mode))
#endif
fopen_s hat die Aufrufsyntax:
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
Nun können wir unser neues Makro verwenden.
Anstelle:
F_OPEN(path, fmode)
Schreibe:
F_OPEN_S(&s->file, path, fmode);
Ganz so einfach ist es allerdings nicht, da wir die Zuweisung nicht mehr über den trinären Bedingungsoperator ? in einer Zeile schreiben können.
Aus:
s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
Wird:
if (fd<0)
{
errno_t err;
F_OPEN_S(&s->file, path, fmode);
if (err!=0)
{
s->FILE = NULL;
}
}
else
{
s->file = (FILE*)fdopen(fd, fmode);
}
Im konkreten Fall ging es um das Öffnen einer Datei und der Zuweisung des resultierenden Objektes an einen Dateiobjekt-Zeiger. Dabei musste berücksichtigt werden, dass Fehler beim Öffnen, genauso im ursprünglichen Programmverlauf berücksichtigt werden mussten, wie dies bisher der Fall war.
Es handelt sich also um eine Äquivalenzumformung eines C++-Codestückes, wie wir sie in allen unseren Projekten zur Verbesserung und Effizienzsteigerung bei der Konsolidierung und semantischen Überprüfung von Quelltexten forcieren.
Manchmal sind die Dinge leichter, als sie in der Lösung schlussendlich aussehen. Die Erkenntnis zu diesem Problem-Fix dauerte bei Wiedereinstieg in die C++Problematik nach längerem Programmieren in PHP ca. 15 Minuten.
Das Problem des Programmierers hierbei: Programmiert man eine Zeit lang nur in einer Sprache (z. B. PHP), so beginnt man die Konstrukte einer anderen Sprache (z. B. C++) allmählich wieder zu vergessen. Nach einer kurzen Wiedereinarbeitungszeit ist man allerdings schnell im Stande sich im Code wieder zurecht zu finden.