Finish integration of hide-chunks / continuous write
Da die Problembeschreibung bisher (glaube ich) nur als E-Mail existiert erstelle ich mal noch ein Ticket und zitiere besagte E-Mail:
Der Hase liegt in diesem Fall in r2050 begraben. Die Änderungen, die durch die ‘hide-chunks’ Branch eingeführt wurden enthalten einen Fehler in
sion_fread
. Diese ruft nun, statt_sion_file_read
, die Funktion_sion_read_multi_chunk
._sion_read_multi_chunk
zählt das Feldcurrentpos
des_sion_filedesc
Typen hoch (sion_internal.c:1308). Da die Funktion_sion_file_read
dies nicht tut, enthältsion_fread
entsprechende Anweisungen (sion_common.c:642). Diese sind in ‘hide-chunks’ nicht entfernt worden,currentpos
wird also nun beim Lesen doppelt hochgezählt._sion_update_fileposition
hilft in diesem Fall auch nicht, da das C++ Interface den File Pointer nicht herausreicht (sion_internal.c:1002).In
test_cxxwr__1.cpp
werden insgesamt 16 Byte geschrieben, zwei 4 Byteint
und ein 8 Bytedouble
. Wenn diese anschließend wieder eingelesen werden entwickelt sichcurrentpos
wie folgt: N (Startwert) -> N + 8 -> N + 16. Nach dem Einlesen des zweiten Integers stehtcurrentpos
auf dem Ende der Datei. Beim Einlesen des Double Werts schlägtsion_feof
an, und es wird tatsächlich nichts eingelesen (sion_common.c:630). An dieser Stelle sollte das C++ Interface vermutlich Alarm schlagen, tut es aber nicht.Dass der Test in Kays Testumgebung gut geht liegt daran, dass sein Compiler
double_data
die selbe Stelle im Stack zuweist wiez
und der Speicher nicht initialisiert wird. Der Compiler auf der Workstation gibt den beiden Variablen unterschiedliche Stellen im Stack, dieser wird durchsion_fread
nicht überschrieben (besser gesagt initialisiert) und der Test schlägt Fehl, da der Speicher nicht zufällig den Wert 2 enthält.Erstaunlich ist, dass nur dieser Test fehlschlägt. Es sieht so aus, als würden andere Tests:
- nicht
sion_fread
verwenden oder- nicht mehrere
sion_fread
hintereinander verwenden oder- beim letzten
sion_fread
noch nicht hinter dem Ende der Datei zu stehen oder- die gelesenen Daten nicht mit in die Ausgabe packen und den Rückgabewert von
sion_fread
nicht zu prüfen oder- in r2050 fälschlich mit angepasst worden zu sein.