diff options
author | HÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com> | 2022-06-22 16:34:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-22 16:34:06 +0200 |
commit | c947ce8f8161cc75525cab18a7522dc1483c3a26 (patch) | |
tree | d6fefe08529e4b2aaef101dbb01772a0de087dc3 | |
parent | 1535883c7a43c6ed90b1d971b9c0d76177df1728 (diff) | |
parent | e67bfd93f1cff7eedcc64dfc7b62cc771dd7bcd9 (diff) |
Merge pull request #23200 from vespa-engine/havardpe/fix-more-stuff
fix more undefined behavior
8 files changed, 35 insertions, 25 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp b/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp index 918a7ceff1e..2c758ee712f 100644 --- a/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/fileconfigmanager.cpp @@ -159,7 +159,9 @@ ConfigFile::deserialize(nbostream &stream) stream >> sz; _content.resize(sz); assert(stream.size() >= sz); - memcpy(_content.data(), stream.peek(), sz); + if (sz > 0) { + memcpy(_content.data(), stream.peek(), sz); + } stream.adjustReadPos(sz); return stream; } diff --git a/searchlib/src/tests/attribute/enumeratedsave/enumeratedsave_test.cpp b/searchlib/src/tests/attribute/enumeratedsave/enumeratedsave_test.cpp index 92c3da40fe9..90127e9ae7b 100644 --- a/searchlib/src/tests/attribute/enumeratedsave/enumeratedsave_test.cpp +++ b/searchlib/src/tests/attribute/enumeratedsave/enumeratedsave_test.cpp @@ -21,6 +21,7 @@ #include <vespa/vespalib/data/databuffer.h> #include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/util/compress.h> +#include <vespa/vespalib/util/memory.h> #include <vespa/vespalib/stllike/asciistream.h> #include <limits> #include <cmath> @@ -184,8 +185,8 @@ MemAttr::bufEqual(const Buffer &lhs, const Buffer &rhs) const return true; if (!EXPECT_TRUE(lhs->getDataLen() == rhs->getDataLen())) return false; - if (!EXPECT_TRUE(memcmp(lhs->getData(), rhs->getData(), - lhs->getDataLen()) == 0)) + if (!EXPECT_TRUE(vespalib::memcmp_safe(lhs->getData(), rhs->getData(), + lhs->getDataLen()) == 0)) return false; return true; } @@ -480,7 +481,7 @@ EnumeratedSaveTest::getSearch(const V &vec, const T &term, bool prefix) buildTermQuery(query, vec.getName(), ss.str(), prefix); return (static_cast<const AttributeVector &>(vec)). - getSearch(vespalib::stringref(&query[0], query.size()), + getSearch(vespalib::stringref(query.data(), query.size()), SearchContextParams()); } diff --git a/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp b/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp index c17627a5026..d8426ce1a45 100644 --- a/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp +++ b/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp @@ -20,8 +20,8 @@ PostingListSearchContext(const IEnumStoreDictionary& dictionary, const ISearchContext &baseSearchCtx) : _dictionary(dictionary), _frozenDictionary(_dictionary.get_has_btree_dictionary() ? _dictionary.get_posting_dictionary().getFrozenView() : FrozenDictionary()), - _lowerDictItr(BTreeNode::Ref(), _frozenDictionary.getAllocator()), - _upperDictItr(BTreeNode::Ref(), _frozenDictionary.getAllocator()), + _lowerDictItr(_dictionary.get_has_btree_dictionary() ? DictionaryConstIterator(BTreeNode::Ref(), _frozenDictionary.getAllocator()) : DictionaryConstIterator()), + _upperDictItr(_dictionary.get_has_btree_dictionary() ? DictionaryConstIterator(BTreeNode::Ref(), _frozenDictionary.getAllocator()) : DictionaryConstIterator()), _uniqueValues(0u), _docIdLimit(docIdLimit), _dictSize(_frozenDictionary.size()), diff --git a/searchlib/src/vespa/searchlib/common/geo_location_parser.cpp b/searchlib/src/vespa/searchlib/common/geo_location_parser.cpp index 8794169b4a6..d829e1b93e4 100644 --- a/searchlib/src/vespa/searchlib/common/geo_location_parser.cpp +++ b/searchlib/src/vespa/searchlib/common/geo_location_parser.cpp @@ -15,7 +15,7 @@ LOG_SETUP(".searchlib.common.geo_location_parser"); namespace { int getInt(const char * &p) { - int val; + uint32_t val; bool isminus; val = 0; isminus = false; diff --git a/searchlib/src/vespa/searchlib/common/sortresults.cpp b/searchlib/src/vespa/searchlib/common/sortresults.cpp index f1756712d2c..59a47dd3312 100644 --- a/searchlib/src/vespa/searchlib/common/sortresults.cpp +++ b/searchlib/src/vespa/searchlib/common/sortresults.cpp @@ -209,9 +209,9 @@ FastS_SortSpec::realloc(uint32_t n, size_t & variableWidth, uint32_t & available variableWidth *= 2; available += variableWidth * n; dataSize += variableWidth * n; - uint32_t byteUsed = mySortData - &_binarySortData[0]; + uint32_t byteUsed = mySortData - _binarySortData.data(); _binarySortData.resize(dataSize); - return &_binarySortData[0] + byteUsed; + return _binarySortData.data() + byteUsed; } void @@ -237,7 +237,7 @@ FastS_SortSpec::initSortData(const RankedHit *hits, uint32_t n) uint32_t dataSize = (fixedWidth + variableWidth) * n; uint32_t available = dataSize; _binarySortData.resize(dataSize); - uint8_t *mySortData = &_binarySortData[0]; + uint8_t *mySortData = _binarySortData.data(); _sortDataArray.resize(n); @@ -342,7 +342,7 @@ void FastS_SortSpec::copySortData(uint32_t offset, uint32_t n, uint32_t *idx, char *buf) { - const uint8_t * sortData = &_binarySortData[0]; + const uint8_t * sortData = _binarySortData.data(); uint32_t totalLen = 0; for (uint32_t i = offset; i < (offset + n); ++i, ++idx) { const uint8_t * src = sortData + _sortDataArray[i]._idx; @@ -378,7 +378,7 @@ inline int FastS_SortSpec::Compare(const FastS_SortSpec *self, const SortData &a, const SortData &b) { - const uint8_t * ref = &(self->_binarySortData[0]); + const uint8_t * ref = self->_binarySortData.data(); uint32_t len = a._len < b._len ? a._len : b._len; int retval = memcmp(ref + a._idx, ref + b._idx, len); @@ -448,10 +448,10 @@ void FastS_SortSpec::sortResults(RankedHit a[], uint32_t n, uint32_t topn) { initSortData(a, n); - SortData * sortData = &_sortDataArray[0]; + SortData * sortData = _sortDataArray.data(); { Array<uint32_t> radixScratchPad(n, Alloc::alloc(0, MMAP_LIMIT)); - search::radix_sort(SortDataRadix(&_binarySortData[0]), StdSortDataCompare(&_binarySortData[0]), SortDataEof(), 1, sortData, n, &radixScratchPad[0], 0, 96, topn); + search::radix_sort(SortDataRadix(_binarySortData.data()), StdSortDataCompare(_binarySortData.data()), SortDataEof(), 1, sortData, n, radixScratchPad.data(), 0, 96, topn); } for (uint32_t i(0), m(_sortDataArray.size()); i < m; ++i) { a[i]._rankValue = _sortDataArray[i]._rankValue; diff --git a/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.cpp b/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.cpp index d240e5a7c6c..d1bb464fc37 100644 --- a/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.cpp +++ b/searchlib/src/vespa/searchlib/test/imported_attribute_fixture.cpp @@ -10,10 +10,7 @@ namespace search { namespace { struct MockReadGuard : public IDocumentMetaStoreContext::IReadGuard { - virtual const search::IDocumentMetaStore &get() const override { - search::IDocumentMetaStore *nullStore = nullptr; - return static_cast<search::IDocumentMetaStore &>(*nullStore); - } + virtual const search::IDocumentMetaStore &get() const override { abort(); } }; } diff --git a/vdslib/src/tests/distribution/distributiontest.cpp b/vdslib/src/tests/distribution/distributiontest.cpp index 4e050affec6..dee620738c6 100644 --- a/vdslib/src/tests/distribution/distributiontest.cpp +++ b/vdslib/src/tests/distribution/distributiontest.cpp @@ -369,7 +369,7 @@ TEST(DistributionTest, testHighSplitBit) for (uint32_t bits = 33; bits < 36; ++bits) { uint64_t base = 0x23456789; - base |= (1 << bits); + base |= (1L << bits); document::BucketId bid1 = document::BucketId(bits, base); document::BucketId bid2 = document::BucketId(bits, base); diff --git a/vespalib/src/vespa/vespalib/stllike/asciistream.cpp b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp index 6b673363d2d..caacec196bd 100644 --- a/vespalib/src/vespa/vespalib/stllike/asciistream.cpp +++ b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp @@ -429,22 +429,32 @@ printInt(unsigned long long r, char * tmp, uint8_t i) return i; } +unsigned long long normalize(long long v, bool &negative) { + if (v < 0) { + negative = true; + if (v == std::numeric_limits<long long>::min()) { + // according to UBSAN: + // negation of -9223372036854775808 cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself + return v; + } + return -v; + } + return v; +} + } asciistream & -asciistream::operator << (long long v) +asciistream::operator << (long long v_in) { char tmp[72]; uint8_t i(sizeof(tmp)); bool negative(false); - if (v == 0) { + if (v_in == 0) { tmp[--i] = '0'; } else { - if (v < 0) { - v = -v; - negative = true; - } + unsigned long long v = normalize(v_in, negative); switch (_base) { case 2: i = printInt<2>(v, tmp, i); break; |