[Development] What am I not seeing in the QByteArray::capacity test failure?

Olivier Goffart olivier at woboq.com
Wed Apr 23 09:01:39 CEST 2014


On Tuesday 22 April 2014 17:45:08 Thiago Macieira wrote:
>   FAIL!  : tst_QByteArray::reserve() 'qba.constData() != data' returned
> FALSE. tst_qbytearray.cpp(1871) : failure location
> 
> http://testresults.qt-project.org/ci/QtBase_stable_Integration/build_03694/w
> in32-msvc2010_Windows_7/log.txt.gz

I had a quick look.  You'll tell me if my hypothesis are correct.

> Code around the location is:
> 
>   1858      qba.resize(capacity);
> [...]
>   1863      QCOMPARE(qba.capacity(), capacity);
> [...]
>   1866      copy = qba;

copy was still holding the original data.  But there, it is assigned to 
detached version of itself, therefore the original data get freed.

>   1867      qba.reserve(capacity * 2);

Indeed we detach, but depending on the allocator, the memory of the original 
data might be re-used.  (quite likely if the allocator uses a LIFO free list)


>   1868      QCOMPARE(qba.size(), capacity);
>   1869      QCOMPARE(qba.capacity(), capacity * 2);
>   1870      QCOMPARE(copy.capacity(), capacity);
>   1871      QVERIFY(qba.constData() != data);

data here is a dangling pointer,  and qba.constData() just happen to re-use 
this memory.

-- 
Olivier 

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org



More information about the Development mailing list