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
- ¿Estoy en lo cierto?
- ¿Qué segundo parámetro de entrada necesita localtime_s?
- ¿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.