2009-04-12 10 views
6

Wie kann ich folgende Warnung von gcc Linker unterdrücken:Suppress Warnung: die Verwendung von `mktemp‘ ist gefährlich

Warnung: Die Verwendung von 'mktemp' gefährlich ist, eine bessere Nutzung 'mkstemp'

Ich weiß, dass es besser ist, mkstemp() zu verwenden, aber aus irgendeinem Grund muss ich mktemp() Funktion verwenden.

+0

Verwenden Sie mkstemp anstelle von mktemp. –

+3

Was ist der Grund, dass Sie mktemp verwenden müssen? –

Antwort

8

Ich denke, Sie brauchen den Pfad, weil Sie es an eine Bibliothek übergeben, die nur Pfadnamen als Argument und nicht Dateideskriptoren oder FILE Zeiger akzeptiert. Wenn dies der Fall ist, können Sie mit mkdtemp ein temporäres Verzeichnis erstellen und Ihre Datei dort ablegen. Der tatsächliche Name ist dann unwichtig, da der Pfad aufgrund des Verzeichnisses bereits eindeutig ist.

+7

Sie können absolut immer noch mkstemp: int fd = mkstemp (template); Nach diesem Aufruf wird die Vorlage durch den tatsächlichen Dateinamen ersetzt. Sie haben den Dateideskriptor und den Pfad der Datei. –

+0

@Jason Coco du könntest dir überlegen, ob du eine Antwort machst, damit sie upgedatet werden kann ;-) – lothar

+0

@Jason Coco, ah ok, das hört sich vernünftig an :). Ich stimme zu, dass Lothar eine Antwort daraus macht. – quinmars

4

Wenn Sie haben mktemp dann zu verwenden, ist es nicht alles, was Sie den Abschnitt zu unterdrücken, tun, dass die Warnung kurz zu entfernen, die mktemp von libc.so.6 verwendet.

Warum haben Sie zu verwenden mktemp?

0

Wenn Sie die Laufzeit statisch verknüpfen, besteht die andere Möglichkeit darin, Ihre eigene Version mktemp in eine Objektdatei zu schreiben. Der Linker sollte Ihre Version gegenüber der Runtime-Version bevorzugen.

Bearbeiten: Danke an Jason Coco für das Hinweis auf ein großes Missverständnis, das ich in mktemp und seine Verwandten hatte. Dieser ist jetzt etwas einfacher zu lösen. Da der Linker eine Version in einer Objektdatei bevorzugen wird, müssen Sie nur mktemp in Bezug auf mkstemp schreiben.

Die einzigen Schwierigkeiten sind die Bereinigung der Dateideskriptoren, die mkstemp zu Ihnen zurückkehrt und alles Thread sicher macht. Sie können ein statisches Array von Deskriptoren und eine atexit -registrierte Funktion zur Bereinigung verwenden, wenn Sie festlegen können, wie viele temporäre Dateien Sie benötigen. Wenn nicht, verwende stattdessen eine verkettete Liste.

+1

@D: Es ist ein Fehler, eine konstante Zeichenfolge für mkstemp oder mktemp anzugeben, da der Bibliotheksaufruf versucht, die Zeichenfolge zu ändern, und Sie einen Busfehler erhalten. –

4

Zwei Dinge:

  • mktemp ist keine Standardfunktion
  • die Warnung ist ein ganz besonderes in den Linker als .gnu.warning.mktemp Abschnitt implementiert

Verwenden Sie eine native OS-API, wenn Sie wirklich brauchen um auf die Festplatte zu schreiben. Oder mkstemp() wie vorgeschlagen.

+0

mktemp() ist (oder war) eine Standardfunktion. Zum Beispiel in POSIX.1-2001. Aber benutze es trotzdem nicht. –

0

Verwendung mkstemp:

int fd = mkstemp(template); 

Nach diesem Aufruf template wird mit dem tatsächlichen Dateinamen ersetzt werden. Sie haben den Dateideskriptor und den Pfad der Datei.

Verwandte Themen