tm_year time_t how ejemplo c++ localtime

c++ - time_t - localtime vs localtime_s y argumentos de entrada apropiados



time_t c++ (3)

Como Lightness Races in Orbit señaló, el tiempo localtime no es seguro para subprocesos, así como otras funciones de tiempo. Quería saber más sobre el tema y encontré una publicación de blog relevante con una explicación profunda sobre eso.

La siguiente cita explica por qué localtime no es seguro para subprocesos:

[...] localtime devuelve un puntero a un búfer estático (std :: tm *). Otro hilo puede llamar a la función y el búfer estático podría sobrescribirse antes de que el primer hilo haya terminado de leer el contenido de la estructura std :: tm *.

time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime );

Esto devuelve: advertencia C4996: ''localtime'': Esta función o variable puede ser insegura. Considere usar localtime_s en su lugar.

time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime_s ( &rawtime );

Cuando cambio localtime a localtime_s obtengo: error C2660: ''localtime_s'': la función no toma 1 argumentos

Esto es lo que creo que está sucediendo en el primer bloque de código:

  • crea una variable time_t vacía.
  • crear un puntero a timeinfo que se define en ctime
  • escriba la hora cruda en una referencia en tiempo real
  • convierta la hora cruda en algo significativo para los peatones

    1. ¿Estoy en lo cierto?
    2. ¿Qué segundo parámetro de entrada necesita localtime_s?
    3. ¿Qué es lo peor que podría pasar si simplemente ignoro todo el problema de seguridad en el tiempo local?

localtime_s es solo una implementación de microsoft de la función localtime, puedes seguir usando locatime segura porque es compatible con C ++ ISO y ony microsoft lo marcó como "obsoleto". La función localtime en sí misma no está desaprobada en absoluto en el mundo C ++.

La reference localtime_s indica que estos parámetros se deben pasar a él:

_tm Pointer to the time structure to be filled in. time Pointer to the stored time.


localtime devuelve un puntero a una struct tm estáticamente asignada.

Con localtime_s, pasa un puntero a una struct tm, y localtime_s escribe sus datos de resultado en eso, por lo que su código cambiará de:

struct tm *timeinfo; timeinfo = localtime(&rawtime);

a algo como:

struct tm timeinfo; localtime_s(&timeinfo, &rawtime);

De esta forma, escribe en el búfer en lugar de tener un búfer propio.