Чтение из QDataStream в QVector: приложение падает с сигналом SIGABRT

Сбой с этим сообщением:

Низший остановился, потому что получил сигнал от операционной системы.

Название сигнала: SIGABRT

Значение сигнала : Прервано

происходит в этой строке кода:

// data is QByteArray ...
QByteArray pos0  = data.mid( index, length );
/*
 * Get float from byte-array
 */
QDataStream streamPos0(pos0);
QVector<float> floatPos0;
streamPos0 >> floatPos0; // Crash happens exactly at this line

Я не мог понять, почему происходит сбой. Интересно, может ли кто-нибудь подсказать...


ОБНОВИТЬ

Я прошел код и зафиксировал локальные значения, когда код находится точно на линии сбоя:

data    "fý¾¾PY\001À\216\224\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾@Q\001Àî}\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾ì\007`¿\010 \035ÁµÏ4½\020\233µ½±½~¿z\n~¾\017?`¿´F\035ÁØÙ\000½Ó±µ½\003Ý~¿z\n~¾"... (846288)   QByteArray
index   0   int
length  12  quint64
pos0    "fý¾¾PY\001À\216\224\033Á"  QByteArray
streamPos0  @0x7fffffff7bb0 QDataStream
        byteorder   QDataStream::BigEndian (0x0000) QDataStream::ByteOrder
        d   (null)  QScopedPointer<QDataStreamPrivate>
        dev @0x12f0d60  QIODevice
        noswap  false   bool
        owndev  true    bool
        q_status    QDataStream::Ok (0x0000)    QDataStream::Status
        ver 17  int
floatPos0   <0 items>

Точное место сбоя находится в этой строке файла qdatastream.h:

template <typename Container>
QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
{
    StreamStateSaver stateSaver(&s);

    c.clear();
    quint32 n;
    s >> n;
    c.reserve(n); // crash happens exactly here
    for (quint32 i = 0; i < n; ++i) {
        typename Container::value_type t;
        s >> t;
        if (s.status() != QDataStream::Ok) {
            c.clear();
            break;
        }
        c.append(t);
    }

    return s;
}

Я пробовал присвоить размер моему QVector<float> floatPos0 методами .reserve() и .resize(), но это не помогло.


Я использую Qt 5.9.4


person user3405291    schedule 25.08.2018    source источник
comment
Когда я пробую этот код, он не падает. Могу я попросить вас предоставить более подробную информацию, например, фактическое содержание data, а также index и length.   -  person scopchanov    schedule 25.08.2018
comment
@scopchanov Верно. Конечно я буду. У меня сейчас нет доступа к компьютеру. Я опубликую подробности как можно скорее. Спасибо ☺   -  person user3405291    schedule 25.08.2018
comment
Я с нетерпением жду этого. Хорошего дня!   -  person scopchanov    schedule 25.08.2018
comment
@scopchanov Я обновил сообщение, добавив больше деталей отладки. Спасибо :)   -  person user3405291    schedule 26.08.2018


Ответы (1)


Я избежал сбоя SIGABRT, изменив процедуру преобразования массива байтов в float числа. Я заменил метод QDataStream, который был менее подробным, но выдавал сигнал SIGABRT, следующим методом. Теперь код работает нормально:

// Extracting chunks of float out of byte-array
QByteArray pos0x = data.mid( index                      , sizeof(float) );
QByteArray pos0y = data.mid( index + 1 * sizeof(float)  , sizeof(float) );
QByteArray pos0z = data.mid( index + 2 * sizeof(float)  , sizeof(float) );

// Converting to float
float floatPos0x;
if ( pos0x.size() >= sizeof(floatPos0x) ) {
    floatPos0x = *reinterpret_cast<const float *>( pos0x.data() );
}
float floatPos0y;
if ( pos0y.size() >= sizeof(floatPos0y) ) {
    floatPos0y = *reinterpret_cast<const float *>( pos0y.data() );
}
float floatPos0z;
if ( pos0z.size() >= sizeof(floatPos0z) ) {
    floatPos0z = *reinterpret_cast<const float *>( pos0z.data() );
}

Это сообщение полезно.

person user3405291    schedule 26.08.2018