diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2022-06-08 11:26:06 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2022-06-09 08:56:12 +0000 |
commit | cac6bdac016326f7808ac1a0a58269ffb23a058b (patch) | |
tree | f1b9d92bac0c2b11e29ba300d01efc5aab2d0c7d /vespalib | |
parent | 46ef33bd14f2c12ccdeac9b7c588f12b7cfa9c8c (diff) |
fix undefined behavior in unit tests
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/vespa/vespalib/data/databuffer.cpp | 18 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/objects/nbostream.cpp | 12 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/objects/nbostream.h | 4 |
3 files changed, 26 insertions, 8 deletions
diff --git a/vespalib/src/vespa/vespalib/data/databuffer.cpp b/vespalib/src/vespa/vespalib/data/databuffer.cpp index 8640a369267..313fbe58fab 100644 --- a/vespalib/src/vespa/vespalib/data/databuffer.cpp +++ b/vespalib/src/vespa/vespalib/data/databuffer.cpp @@ -77,7 +77,9 @@ DataBuffer::shrink(size_t newsize) if (newsize != 0) { newbuf = static_cast<char *>(newBuf.get()); newdata = newbuf + padbefore(_alignment, newbuf); - memcpy(newdata, _datapt, getDataLen()); + if (getDataLen() > 0) { + memcpy(newdata, _datapt, getDataLen()); + } } _buffer.swap(newBuf); _bufstart = newbuf; @@ -101,7 +103,9 @@ DataBuffer::pack(size_t needbytes) Alloc newBuf(_buffer.create(bufsize)); char *newbuf = static_cast<char *>(newBuf.get()); char *newdata = newbuf + padbefore(_alignment, newbuf); - memcpy(newdata, _datapt, dataLen); + if (dataLen > 0) { + memcpy(newdata, _datapt, dataLen); + } _bufstart = newbuf; _datapt = newdata; _freept = newdata + dataLen; @@ -109,7 +113,9 @@ DataBuffer::pack(size_t needbytes) _buffer.swap(newBuf); } else { char *datapt = _bufstart + padbefore(_alignment, _bufstart); - memmove(datapt, _datapt, dataLen); + if (dataLen > 0) { + memmove(datapt, _datapt, dataLen); + } _datapt = datapt; _freept = _datapt + dataLen; } @@ -119,8 +125,12 @@ DataBuffer::pack(size_t needbytes) bool DataBuffer::equals(DataBuffer *other) { - if (getDataLen() != other->getDataLen()) + if (getDataLen() != other->getDataLen()) { return false; + } + if (getDataLen() == 0) { + return true; + } return memcmp(getData(), other->getData(), getDataLen()) == 0; } diff --git a/vespalib/src/vespa/vespalib/objects/nbostream.cpp b/vespalib/src/vespa/vespalib/objects/nbostream.cpp index c4af25efcac..a369bd21c56 100644 --- a/vespalib/src/vespa/vespalib/objects/nbostream.cpp +++ b/vespalib/src/vespa/vespalib/objects/nbostream.cpp @@ -60,7 +60,9 @@ nbostream::nbostream(const nbostream & rhs) : { extend(rhs.size()); _wp = rhs.size(); - memcpy(_wbuf.data(), &rhs._rbuf[rhs._rp], _wp); + if (_wp > 0) { + memcpy(_wbuf.data(), &rhs._rbuf[rhs._rp], _wp); + } } nbostream::nbostream(nbostream && rhs) noexcept @@ -76,7 +78,9 @@ nbostream::nbostream(nbostream && rhs) noexcept rhs._rbuf = ConstBufferRef(); if (!_longLivedBuffer && (_wbuf.capacity() == 0)) { _wbuf.resize(roundUp2inN(_rbuf.size())); - memcpy(_wbuf.data(), &_rbuf[_rp], size()); + if (size() > 0) { + memcpy(_wbuf.data(), &_rbuf[_rp], size()); + } _wp = size(); _rp = 0; _rbuf = ConstBufferRef(_wbuf.data(), _wbuf.capacity()); @@ -120,7 +124,9 @@ void nbostream::reserve(size_t sz) void nbostream::compact() { - memmove(_wbuf.data(), &_rbuf[_rp], left()); + if (left() > 0) { + memmove(_wbuf.data(), &_rbuf[_rp], left()); + } _wp = left(); _rp = 0; } diff --git a/vespalib/src/vespa/vespalib/objects/nbostream.h b/vespalib/src/vespa/vespalib/objects/nbostream.h index e7bed8d59ff..12d4fac04cc 100644 --- a/vespalib/src/vespa/vespalib/objects/nbostream.h +++ b/vespalib/src/vespa/vespalib/objects/nbostream.h @@ -159,7 +159,9 @@ public: if (__builtin_expect(space() < sz, false)) { extend(sz); } - memcpy(&_wbuf[_wp], v, sz); + if (sz > 0) { + memcpy(&_wbuf[_wp], v, sz); + } _wp += sz; } void read(void *v, size_t sz) { |