In seiner CodeSOD-Kolumne erzählt Remy Porter von einer Fehlersuche der Entwicklerin Greta, die mit einer alten Pascal-Entwicklungsumgebung arbeitet. Ihr Programm meldete ständig, Dateien existierten nicht, obwohl sie eindeutig vorhanden waren. Die Spur führte in die Standardbibliothek von Borlands Delphi- und Kylix-Laufzeitumgebung, ursprünglich mit Copyright-Vermerk 1995 bis 2001.
Die Funktion FileExists prüft die Existenz einer Datei nicht direkt. Sie ruft stattdessen FileAge auf, das über die Windows-API-Funktion FindFirstFile die Datei sucht und anschließend mit FileTimeToDosDateTime den letzten Schreibzeitpunkt in ein DOS-Datums- und Zeitformat umwandelt. Gelingt die Umwandlung, liefert FileAge den kodierten Zeitstempel zurück. Schlägt irgendein Schritt fehl, gibt FileAge -1 zurück, und FileExists wertet -1 dann als Zeichen, dass die Datei fehlt.
Der eigentliche Fehler: FileTimeToDosDateTime liefert einen booleschen Erfolgswert und setzt bei Misserfolg einen Windows-Fehlercode, doch der Delphi-Bibliothekscode prüft weder das eine noch das andere. Ein Prozess auf Gretas System schrieb Dateien, ohne einen letzten Schreibzeitpunkt zu setzen. Ohne gültigen Zeitstempel scheiterte die Konvertierung lautlos, FileAge lieferte -1, und FileExists schloss fälschlich, die Datei existiere nicht, obwohl sie längst auf der Platte lag.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.