QByteArray: more GCC 12 -Werror=array-bound whack-a-mole

This one came up on a tsan build, but not on an asan/ubsan one!?!:

    qbytearray.cpp: In member function ‘QByteArray QByteArray::toBase64(Base64Options) const’:
    qbytearray.cpp:3884:42: error: array subscript 1 is outside array bounds of ‘const char [1]’ [-Werror=array-bounds]
     3884 |             chunk |= int(uchar(data()[i++])) << 8;
          |                                ~~~~~~~~~~^
    qbytearray.cpp:37:24: note: at offset 1 into object ‘QByteArray::_empty’ of size 1
       37 | Q_CONSTINIT const char QByteArray::_empty = '\0';
          |                        ^~~~~~~~~~
    cc1plus: all warnings being treated as errors

Fix, as so often, by caching the size().

The code in 5.15 is different, but similar, so picking all the way.

Pick-to: 6.4 6.3 6.2 5.15
Task-number: QTBUG-103923
Change-Id: Iac30e964c8d7d367620d16db65ceeaade33ee6b4
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Marc Mutz 2022-06-10 16:57:52 +02:00
parent 246f17d470
commit de005e7976

View File

@ -3870,19 +3870,21 @@ QByteArray QByteArray::toBase64(Base64Options options) const
const char padchar = '=';
qsizetype padlen = 0;
QByteArray tmp((size() + 2) / 3 * 4, Qt::Uninitialized);
const qsizetype sz = size();
QByteArray tmp((sz + 2) / 3 * 4, Qt::Uninitialized);
qsizetype i = 0;
char *out = tmp.data();
while (i < size()) {
while (i < sz) {
// encode 3 bytes at a time
int chunk = 0;
chunk |= int(uchar(data()[i++])) << 16;
if (i == size()) {
if (i == sz) {
padlen = 2;
} else {
chunk |= int(uchar(data()[i++])) << 8;
if (i == size())
if (i == sz)
padlen = 1;
else
chunk |= int(uchar(data()[i++]));