web-dev-qa-db-fra.com

localtime vs localtime_s et arguments d'entrée appropriés

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

Cela renvoie: avertissement C4996: "heure locale": cette fonction ou variable peut être dangereuse. Envisagez plutôt d'utiliser localtime_s.

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

Lorsque je modifie l'heure locale en heure locale, j'obtiens: erreur C2660: 'heure locale': la fonction ne prend pas 1 argument

Voici ce que je pense qui se passe dans le premier bloc de code:

  • créez une variable time_t vide.
  • créer un pointeur vers timeinfo qui est défini dans ctime
  • écrire le rawtime dans une référence de rawtime
  • convertir le temps brut en quelque chose de significatif pour les piétons

    1. Ai-je raison?
    2. De quel deuxième paramètre d'entrée localtime_s a-t-il besoin?
    3. Quel est le pire qui puisse arriver si j'ignore tout le problème de la sécurité de l'heure locale.
48
ProGirlXOXO

localtime renvoie un pointeur sur un struct tm alloué statiquement.

Avec localtime_s, vous passez un pointeur vers une structure tm, et localtime_s Écrit ses données de résultat dans cela, donc votre code changerait de:

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

à quelque chose comme:

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

De cette façon, il écrit dans votre tampon au lieu d'avoir son propre tampon.

57
Jerry Coffin

localtime_s est juste une implémentation Microsoft du functon localtime, vous pouvez continuer à utiliser locatime en toute sécurité car il est conforme à C++ ISO et uniquement Microsoft l'a marqué comme "obsolète". La fonction localtime elle-même n'est pas du tout obsolète dans le monde C++.

Le localtime_sréférence indique que ces paramètres doivent lui être transmis:

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

Comme Lightness Races in Orbit l'a souligné, localtime n'est pas thread-safe ainsi que plusieurs autres fonctions temporelles. Je voulais en savoir plus sur le sujet et j'ai trouvé n article de blog pertinent avec une explication détaillée à ce sujet.

La citation ci-dessous explique pourquoi localtimen'est pas thread-safe:

[...] localtime renvoie un pointeur vers un tampon statique (std :: tm *). Un autre thread peut appeler la fonction et le tampon statique peut être écrasé avant que le premier thread ait fini de lire le contenu de la structure std :: tm *.

6
ForceMagic