summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-06-08 11:26:06 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-06-09 08:56:12 +0000
commitcac6bdac016326f7808ac1a0a58269ffb23a058b (patch)
treef1b9d92bac0c2b11e29ba300d01efc5aab2d0c7d /vespalib
parent46ef33bd14f2c12ccdeac9b7c588f12b7cfa9c8c (diff)
fix undefined behavior in unit tests
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/data/databuffer.cpp18
-rw-r--r--vespalib/src/vespa/vespalib/objects/nbostream.cpp12
-rw-r--r--vespalib/src/vespa/vespalib/objects/nbostream.h4
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) {