zu unserem Online-Shop | to our catalogue

Fehlermeldung in VS2008

..\..\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.

Code

s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);

Wir wollen demnach unseren Aufruf konvertieren

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
);

Lösung

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.

Im konkreten Fall (Anwendung)

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);
}

Erklärung

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.

powered by typo3 Impressum · Kontakt
TUX
Ich Valid XHTML 1.1
CSS ist valide!
Webserver powered by Debian
Development powered by Apache
Enlightened with PHP
Data grabbed from MySQL Database
Best viewed with Firefox
We love Free Software!
Tea compliant! Powered by hours of work and many cups of tasteful tea
Enhanced with 3d graphics