Use four-iterator std::equal for bssl::Span::operator== At one point we targetted C++11 and had to use the unsafe three-iterator std::equal. Then we had to write the loop by hand because the pragma to suppress an MSVC warning did not work: https://boringssl-review.googlesource.com/c/boringssl/+/18384 We now target C++14, so just use the four-iterator version. libc++ will then be able to specialize it into a memcmp call. Also replace a three-iterator std::equal in pki/input.cc. Change-Id: I0a7d6a2330594e383c5c884632de9a21a137054c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/65647 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Adam Langley <agl@google.com> Auto-Submit: David Benjamin <davidben@google.com> Commit-Queue: Adam Langley <agl@google.com>
diff --git a/include/openssl/span.h b/include/openssl/span.h index aa8f801..044ada1 100644 --- a/include/openssl/span.h +++ b/include/openssl/span.h
@@ -40,20 +40,7 @@ "Span<T> must be derived from SpanBase<const T>"); friend bool operator==(Span<T> lhs, Span<T> rhs) { - // MSVC issues warning C4996 because std::equal is unsafe. The pragma to - // suppress the warning mysteriously has no effect, hence this - // implementation. See - // https://msdn.microsoft.com/en-us/library/aa985974.aspx. - if (lhs.size() != rhs.size()) { - return false; - } - for (T *l = lhs.begin(), *r = rhs.begin(); l != lhs.end() && r != rhs.end(); - ++l, ++r) { - if (*l != *r) { - return false; - } - } - return true; + return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); } friend bool operator!=(Span<T> lhs, Span<T> rhs) { return !(lhs == rhs); }
diff --git a/pki/input.cc b/pki/input.cc index a0d8af6..12ee450 100644 --- a/pki/input.cc +++ b/pki/input.cc
@@ -23,9 +23,7 @@ bssl::Span<const uint8_t> Input::AsSpan() const { return data_; } bool operator==(const Input &lhs, const Input &rhs) { - return lhs.Length() == rhs.Length() && - std::equal(lhs.UnsafeData(), lhs.UnsafeData() + lhs.Length(), - rhs.UnsafeData()); + return lhs.AsSpan() == rhs.AsSpan(); } bool operator!=(const Input &lhs, const Input &rhs) { return !(lhs == rhs); }