Fehler in der Implementierung von stat bei Borland/Embarcadero



  • Hallo,

    ich habe einen kleinen Fehler in der Implementierung von stat der o.g. Compiler gefunden. Folgendes Beispiel:

    #include <stdio.h>
    #include <time.h>
    
    #include <sys/stat.h>
    
    #ifdef _Windows
    #define FILENAME "\\\\JUDITH\\gak\\paint.cwf"
    #else
    #define FILENAME "/home/gak/paint.cwf"
    #endif
    
    int main( void )
    {
    	struct stat statBuf;
    
    	stat( FILENAME, &statBuf );
    
    	printf( "UTC: Modified: %s\n", asctime( gmtime( &statBuf.st_mtime ) ) );
    	printf( "UTC: Created : %s\n", asctime( gmtime( &statBuf.st_ctime ) ) );
    
    	printf( "Loc: Modified: %s\n", asctime( localtime( &statBuf.st_mtime ) ) );
    	printf( "Loc: Created : %s\n", asctime( localtime( &statBuf.st_ctime ) ) );
    
    	return 0;
    }
    

    liefert eine um eine Stunde versetzte Zeit, wenn aktuell keine Sommereit gilt aber die Datei während Sommerzeit bearbeitet wurde, und wahrscheinlich auch umgekehrt.

    Der Grund liegt in der Funktion _posixtime, die man im Modul STATCVT.C der Laufzeitbibliothek findet:

    static time_t _posixtime(FILETIME *ft)
    {
    	SYSTEMTIME st;
    	FILETIME loc;
    
    	/* Convert the Win32 UTC based filetime to local time. */
    	if (FileTimeToLocalFileTime (ft, &loc) != TRUE)
    		return 0;
    
    	/* Convert the filetime format into a systemtime format. */
    	if (FileTimeToSystemTime(&loc, &st) != TRUE)
    		return 0;
    
    	/* Return the number of seconds since 1-1-1970 in UTC. */
    	return (_totalsec(st.wYear-1900, st.wMonth-1, st.wDay-1,
    					  st.wHour, st.wMinute, st.wSecond));
    }
    

    Das Problem ist. FileTimeToLocalTime berücksichtigt die AKTUELLE Zeitzone incl. Sommerzeit während _totalsec auch bewertet, ob zum angegebenen Zeitstempel Sommerzeit war oder nicht.

    Meine letzte Version, die ich getestet habe, ist C++ Builder 2010, der Fehler steckt aber auch schon BC++ 5.0.2. Mag das jemand auch mit 'ner aktuelleren C++ Builder-version testen? Könnte es sein, daß hier auch ein Fehler in der Windows API-Funktion liegt? Ich habe es mit Windows 7 getestet.

    Wer das Beispiel ausprobieren will, muß natürlich den Pfad in den Zeilen 7 und 9 ändern. Der Fehler tritt im übrigen auch dann auf, wenn die Datei auf einem lokalen NTFS Laufwerk liegt, ich habe hier nur deshalb ein Netzlaufwerk benutzt, um die Ausgabe mit meinem Linuxserver vergleichen zu können. Der Test sollte natürlich VOR der Sommerzeitumstellung in zwei Wochen erfolgen.

    mfg Martin

    P.S.: Der Fehler taucht auch bei Windows 2000 und Windows XP auf.
    P.P.S: Mit Visual Studio ist es das gleiche Trauerspiel. 😞



  • Das erinnert mich stark an das hier:

    http://support.microsoft.com/kb/129574/en-us



  • Sommerzeit schrieb:

    Das erinnert mich stark an das hier:

    http://support.microsoft.com/kb/129574/en-us

    Hängt wahrscheinlich beides eng beieinand. Kleinweich schreibt halt in diesem Artikel ziemlich viel Stuss. Anstatt zu schreiben, das sei so by Design, hätten sie schreiben sollen, daß ihre Implementierung von FileTimeToLocalFileTime schrott ist.

    mfg Martin


Log in to reply