2009-04-12 23 views
6

¿Cómo puedo suprimir la siguiente advertencia del enlazador gcc:reprimir: el uso de `mktemp' es peligroso

advertencia: el uso de 'mktemp' es peligroso, un mejor uso 'mkstemp'

Sé que es mejor usar mkstemp() pero por alguna razón tengo que usar la función mktemp().

+0

Uso mkstemp de mktemp. –

+3

¿Cuál es la razón por la que tiene que usar mktemp? –

Respuesta

8

Supongo que necesita la ruta porque la pasa a una biblioteca que solo acepta nombres de ruta como argumento y no como descriptores de archivos o FILE punteros. Si es así, puede crear un directorio temporal con mkdtemp y colocar su archivo allí, entonces el nombre real no tiene importancia porque la ruta ya es única debido al directorio.

+7

Puede absolutamente TODAVÍA usar mkstemp: int fd = mkstemp (plantilla); Después de esta llamada, la plantilla se reemplazará por el nombre del archivo real. Tendrás el descriptor de archivo y la ruta del archivo. –

+0

@Jason Coco podrías considerar hacer una respuesta, para que se pueda subir ;-) – lothar

+0

@Jason Coco, ah ok, eso suena razonable :). Estoy de acuerdo con Lothar para hacer una respuesta. – quinmars

4

Si usted tiene utilizar mktemp entonces no es algo que puede hacer para suprimir ese breve advertencia de la eliminación de la sección que utiliza mktemp de libc.so.6.

¿Por qué usted tiene para usar mktemp?

0

Si se vincula estáticamente el tiempo de ejecución, a continuación, la otra opción es escribir su propia versión de mktemp en un archivo objeto. El vinculador debería preferir su versión en lugar de la versión en tiempo de ejecución.

Editar: Gracias a Jason Coco por señalar un gran malentendido que tuve en mktemp y sus familiares. Este es un poco más fácil de resolver ahora. Desde el enlazador preferirá una versión de un archivo de objeto, sólo tiene que escribir mktemp en términos de mkstemp.

Las únicas dificultades son la limpieza de los descriptores de archivo que mkstemp volverá a usted y hacer que todo hilo de seguridad. Puede usar una matriz estática de descriptores y una función registrada de atexit para la limpieza, si puede limitar el número de archivos temporales que necesita. Si no, solo usa una lista vinculada en su lugar.

+1

@D: Es un error para proporcionar una cadena constante a mkstemp o mktemp porque la llamada biblioteca intentará alterar la cadena y obtendrá un error de bus. –

4

Dos cosas:

  • mktemp no es una función estándar
  • la advertencia es una especial implementado en el enlazador como .gnu.warning.mktemp sección

uso de un sistema operativo API nativa si realmente necesita para escribir en el disco. O mkstemp() según lo sugerido.

+0

mktemp() es (o era) una función estándar. Por ejemplo en POSIX.1-2001. Pero no lo uses de todos modos. –

0

Uso mkstemp:

int fd = mkstemp(template); 

Después de esta llamada, template será reemplazado con el nombre de archivo real. Tendrás el descriptor de archivo y la ruta del archivo.

Cuestiones relacionadas