summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-12-09 14:10:42 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-12-09 14:10:42 +0000
commitc0cf401a93bacbf35f0056f0662efa22a3d32c76 (patch)
tree95f7bcb96c2d8d4b2130151436de5e4f96a48941 /searchlib
parent0f845e25cb7f0f4c91002a03b4c4c679cbb833e0 (diff)
Avoid refering an empty vector.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/expression/rawresultnode.h5
-rw-r--r--searchlib/src/vespa/searchlib/expression/resultnodes.cpp26
2 files changed, 23 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/expression/rawresultnode.h b/searchlib/src/vespa/searchlib/expression/rawresultnode.h
index 7e4071abf81..e6712144831 100644
--- a/searchlib/src/vespa/searchlib/expression/rawresultnode.h
+++ b/searchlib/src/vespa/searchlib/expression/rawresultnode.h
@@ -3,8 +3,7 @@
#include "singleresultnode.h"
-namespace search {
-namespace expression {
+namespace search::expression {
class RawResultNode : public SingleResultNode
{
@@ -50,5 +49,3 @@ private:
};
}
-}
-
diff --git a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
index bc0ea85575d..8250c73fc92 100644
--- a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
+++ b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
@@ -213,7 +213,10 @@ RawResultNode::min(const ResultNode & b)
char buf[32];
ConstBufferRef s(b.getString(BufferRef(buf, sizeof(buf))));
- if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) > 0) {
+ size_t min_sz = std::min(s.size(), _value.size());
+ if (min_sz == 0) {
+ setBuffer("", 0);
+ } else if (memcmp(_value.data(), s.data(), std::min(s.size(), _value.size())) > 0) {
setBuffer(s.data(), s.size());
}
}
@@ -224,7 +227,13 @@ RawResultNode::max(const ResultNode & b)
char buf[32];
ConstBufferRef s(b.getString(BufferRef(buf, sizeof(buf))));
- if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) < 0) {
+ size_t min_sz = std::min(s.size(), _value.size());
+ if (min_sz == 0) {
+ if (s.size() > _value.size()) {
+ setBuffer(s.data(), s.size());
+ }
+
+ } else if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) < 0) {
setBuffer(s.data(), s.size());
}
}
@@ -329,6 +338,11 @@ size_t hashBuf(const void *s, size_t sz)
return result;
}
+template <typename T>
+int cmpNum(T a, T b) {
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
}
size_t StringResultNode::hash() const { return hashBuf(_value.c_str(), _value.size()); }
@@ -382,9 +396,13 @@ int RawResultNode::onCmp(const Identifiable & b) const
return -1;
} else {
const RawResultNode & rb( static_cast<const RawResultNode &>(b) );
- int result = memcmp(&_value[0], &rb._value[0], std::min(_value.size(), rb._value.size()));
+ size_t min_sz = std::min(_value.size(), rb._value.size());
+ if (min_sz == 0) {
+ return cmpNum(_value.size(), rb._value.size());
+ }
+ int result = memcmp(_value.data(), rb._value.data(), min_sz);
if (result == 0) {
- result = _value.size() < rb._value.size() ? -1 : _value.size() > rb._value.size() ? 1 : 0;
+ return cmpNum(_value.size(), rb._value.size());
}
return result;
}