Bug in QBitArray

Alles rund um die Programmierung mit Qt
Antworten
tilo
Beiträge: 3
Registriert: 4. November 2009 22:32
Wohnort: Berlin

Bug in QBitArray

Beitrag von tilo » 5. November 2009 11:37

Hi,

mir ist ein Problem aufgefallen, dass nur eintritt, wenn folgende Bedingungen erfüllt sind:
1. wenn man ein QBitArray verkleinert auf ein nicht durch 8 teilbaren Wert, d.h. es sind überzählige Bits im letzten Byte
2. es mind. 1 dieser überzähligen Bits vorher gesetzt war
3. das QBitArray über ein QDataStream neu gelesen wird
tritt offensichtlich ein Lesefehler auf und man erhält ein QBitArray der Größe 0.
Der folgende Code verdeutlicht dies:

Code: Alles auswählen

    QBitArray ba_1(20, true), ba_2;
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream stream(&buffer);
    ba_1.resize(ba_1.size()-1);
    stream << ba_1;
    buffer.seek(0);
    stream >> ba_2;
    qDebug() << ba_2.size();
Die überzähligen Bits bleiben auch nach einer Zuweisung oder Neuerzeugung (ba_2 = ba_1 bzw. QBitArray ba_2(ba_1) ) erhalten. Dieses Problem lässt sich umgehen, indem man vor dem resize() (oder truncate() ) alle überzähligen Bits löscht, z.B. mit:
fill( false, newSize, oldSize)

Wie gesagt, Probleme treten erst nach dem Auslesen aus einem Stream auf (z.B. aus Datei lesen), sonst sind oben besagte Bits nicht relevant.
Ich hoffe, ich hab nix übersehen - vielen Dank für Hinweise im Vorraus

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 21:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala » 5. November 2009 13:16

Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...

AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE » 5. November 2009 13:18

rofl

tilo
Beiträge: 3
Registriert: 4. November 2009 22:32
Wohnort: Berlin

Beitrag von tilo » 5. November 2009 13:20

upsala hat geschrieben:Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...
???
das ist doch qtforum.de, oder?

Christian81
Beiträge: 7315
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 » 5. November 2009 14:04

tilo hat geschrieben:
upsala hat geschrieben:Dieses Forum ist in PHP programmiert und verwendet kein QBitArray...
???
das ist doch qtforum.de, oder?
Aber er war im Unterforum 'Das Forum' ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi » 5. November 2009 15:47

Das sieht tatsächlich nach einem Qt-Bug aus, und zwar in

Code: Alles auswählen

QDataStream &operator>>(QDataStream &in, QBitArray &ba)
Hier steht folgender Code:

Code: Alles auswählen

int paddingMask = ~((0x1 << (len & 0x7)) - 1);
if (paddingMask != ~0x0 && (ba.d.constData()[ba.d.size() - 1] & paddingMask)) {
        ba.clear();
        in.setStatus(QDataStream::ReadCorruptData);
        return in;
    }
In den if-Zweig geht er nur rein, wenn du in deinem Beispiel ba_1 mit true initialisierst.

Schick dein Beispiel doch mal an support@trolltech.com (kA, ob support@qt.nokia.com auch geht)

\Ralf

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 21:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala » 5. November 2009 19:25


tilo
Beiträge: 3
Registriert: 4. November 2009 22:32
Wohnort: Berlin

Beitrag von tilo » 5. November 2009 22:34

neuschi hat geschrieben:Das sieht tatsächlich nach einem Qt-Bug aus, und zwar in

Code: Alles auswählen

QDataStream &operator>>(QDataStream &in, QBitArray &ba)
Schick dein Beispiel doch mal an support@trolltech.com (kA, ob support@qt.nokia.com auch geht)

\Ralf
Danke für den Hinweis. Ich hab es einfach mal geschickt.
Tilo

Antworten