2010-11-14 4 views
1
#include <ctime> 
#include <iostream> 
#include <cstring> 
int main() 
{ 

struct tm tm ; 
//memset(&tm, 0, sizeof(struct tm)); 
strptime("1 Jan 2000 13:00:00", "%d %b %Y %H:%M:%S", &tm); 
time_t t =mktime(&tm); 
std::cout << ctime(&t); 
return 0; 
} 

g ++ -Wuninitialized -O2 test.cpp ne prévient pas que tm n'a pas été initialisé. Valgrind le fait jusqu'à ce que la ligne memset soit ajoutée. les pages Man pour strptime sous Linux disent qu'il devrait être initialisé et je voyais des dates aléatoires sur un programme plus compliqué jusqu'à ce que je l'initialise. Existe-t-il des indicateurs GCC qui produiront un avertissement dans ces circonstances?GCC -Wininitialized pas d'avertissement sur les structures non initialisées

+1

Quelle version de GCC? –

+0

gcc version 4.4.5 (Debian 4.4.5-6) – Sard

Répondre

2

GCC ne peut pas regarder dans le code déjà compilé des fonctions strptime, mktime et ctime au moment de la compilation. Vous venez de passer l'adresse de la structure, à partir du point de l'appel, sans rien lire. D'autre part, Valgrind exécute votre programme et suit toute la mémoire et vérifie s'il y a une lecture avant l'écriture d'un bloc de mémoire particulier et peut ainsi vous le dire.

Si ces fonctions sont définies en ligne dans l'en-tête, vous pourriez avoir une chance que le compilateur puisse les aligner et remonter l'adresse du pointeur vers la structure non initialisée. Je n'ai pas testé la qualité de GCC à ce sujet, cependant (ou d'ailleurs, les compilateurs en général).

Questions connexes