diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-09 14:10:42 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-09 14:10:42 +0000 |
commit | c0cf401a93bacbf35f0056f0662efa22a3d32c76 (patch) | |
tree | 95f7bcb96c2d8d4b2130151436de5e4f96a48941 /searchlib | |
parent | 0f845e25cb7f0f4c91002a03b4c4c679cbb833e0 (diff) |
Avoid refering an empty vector.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/expression/rawresultnode.h | 5 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/expression/resultnodes.cpp | 26 |
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; } |