diff --git a/README.chromium b/README.chromium index 896b752c6b663..42e79ae3542f6 100644 --- a/README.chromium +++ b/README.chromium @@ -17,3 +17,4 @@ files.diff - the files deleted from the original library. dependencies.diff - removes all the dependencies on Abseil and other libraries replacing them with Chrome's analogues. compilation.diff - fixes compilation/static analyzers in Chrome. fix_nulls.diff - makes the presubmit happy by replacing NULL with nullptr. +Use-absil-statusor.diff - removes existing status/statusor library's version, and uses absl::status and absl::statusor as source of truth. diff --git a/src/BUILD.gn b/src/BUILD.gn index d39f1d1a7a7f1..2f12f7a4c78c3 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -42,17 +42,16 @@ component("ec_commutative_cipher") { "crypto/openssl.inc", "util/canonical_errors.cc", "util/canonical_errors.h", - "util/status.cc", "util/status.h", "util/status.inc", "util/status_macros.h", - "util/statusor.cc", "util/statusor.h", ] deps = [ "//base", "//third_party/boringssl", ] + public_deps = [ "//third_party/abseil-cpp:absl" ] configs += [ "//build/config/compiler:no_chromium_code", diff --git a/src/crypto/ec_commutative_cipher.cc b/src/crypto/ec_commutative_cipher.cc index 0075ae01170a3..8b1cbe7d1b139 100644 --- a/src/crypto/ec_commutative_cipher.cc +++ b/src/crypto/ec_commutative_cipher.cc @@ -77,8 +77,7 @@ StatusOr ECCommutativeCipher::Encrypt( if (!status_or_point.ok()) { return status_or_point.status(); } - ASSIGN_OR_RETURN(ECPoint encrypted_point, - Encrypt(status_or_point.ValueOrDie())); + ASSIGN_OR_RETURN(ECPoint encrypted_point, Encrypt(status_or_point.value())); return encrypted_point.ToBytesCompressed(); } diff --git a/src/crypto/ec_group.cc b/src/crypto/ec_group.cc index c4a4770b309fc..2ad8e6bb63095 100644 --- a/src/crypto/ec_group.cc +++ b/src/crypto/ec_group.cc @@ -141,7 +141,7 @@ Status ECGroup::CheckPrivateKey(const BigNum& priv_key) const { return InvalidArgumentError( "The given key is out of bounds, needs to be in [1, order) instead."); } - return OkStatus(); + return absl::OkStatus(); } StatusOr ECGroup::GetPointByHashingToCurveInternal( diff --git a/src/util/status.cc b/src/util/status.cc deleted file mode 100644 index 263d5afe46ac9..0000000000000 --- a/src/util/status.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "third_party/private-join-and-compute/src/util/status.h" - -#include -#include - -namespace private_join_and_compute { - -Status::Status() : code_(private_join_and_compute::StatusCode::kOk), message_("") {} - -Status::Status(private_join_and_compute::StatusCode error, std::string error_message) - : code_(error), message_(std::move(error_message)) { - if (code_ == private_join_and_compute::StatusCode::kOk) { - message_.clear(); - } -} - -Status::Status(const Status& other) - : code_(other.code_), message_(other.message_) {} - -Status& Status::operator=(const Status& other) { - code_ = other.code_; - message_ = other.message_; - return *this; -} - -std::string Status::ToString() const { - if (code_ == private_join_and_compute::StatusCode::kOk) { - return "OK"; - } - std::ostringstream stringStream; - stringStream << code_ << ": " << message_; - return stringStream.str(); -} - -Status Annotate(const Status& s, const std::string& msg) { - if (s.ok() || msg.empty()) return s; - - std::string new_msg; - - if (s.message().empty()) { - new_msg = msg; - } else { - new_msg = s.message() + "; " + msg; - } - return Status(s.code(), new_msg); -} - -extern std::ostream& operator<<(std::ostream& os, const Status& other) { - os << other.ToString(); - return os; -} - -} // namespace private_join_and_compute diff --git a/src/util/status.h b/src/util/status.h index 944af0bcdb272..983ac3b28ce71 100644 --- a/src/util/status.h +++ b/src/util/status.h @@ -18,84 +18,11 @@ #include -namespace private_join_and_compute { -enum StatusCode { - kOk = 0, - kCancelled = 1, - kUnknown = 2, - kInvalidArgument = 3, - kDeadlineExceeded = 4, - kNotFound = 5, - kAlreadyExists = 6, - kPermissionDenied = 7, - kResourceExhausted = 8, - kFailedPrecondition = 9, - kAborted = 10, - kOutOfRange = 11, - kUnimplemented = 12, - kInternal = 13, - kUnavailable = 14, - kDataLoss = 15, - kUnauthenticated = 16, - kDoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ = 20 -}; - -// A Status is a combination of an error code and a string message (for non-OK -// error codes). -class Status { - public: - // Creates an OK status - Status(); - - // Make a Status from the specified error and message. - Status(private_join_and_compute::StatusCode error, std::string error_message); - - Status(const Status& other); - Status& operator=(const Status& other); - - // Some pre-defined Status objects - static Status OK() { - return Status(); - } - static Status UNKNOWN() { - return Status(private_join_and_compute::StatusCode::kUnknown, ""); - } - - // Accessors - bool ok() const { return code_ == private_join_and_compute::StatusCode::kOk; } - int error_code() const { return code_; } - private_join_and_compute::StatusCode code() const { return code_; } - const std::string& message() const { return message_; } - - bool operator==(const Status& x) const; - bool operator!=(const Status& x) const; - - // NoOp - void IgnoreError() const {} +#include "third_party/abseil-cpp/absl/status/status.h" - std::string ToString() const; - - private: - private_join_and_compute::StatusCode code_; - std::string message_; -}; - -inline bool Status::operator==(const Status& other) const { - return (this->code_ == other.code_) && (this->message_ == other.message_); -} - -inline bool Status::operator!=(const Status& other) const { - return !(*this == other); -} - -// Returns a Status that is identical to 's' except that the error_message() -// has been augmented by adding 'msg' to the end of the original error -// message. -Status Annotate(const Status& s, const std::string& msg); - -extern std::ostream& operator<<(std::ostream& os, const Status& other); - -inline Status OkStatus() { return Status(); } +namespace private_join_and_compute { +using Status = absl::Status; +using StatusCode = absl::StatusCode; } // namespace private_join_and_compute diff --git a/src/util/status_macros.h b/src/util/status_macros.h index 7c0f1628aa2bb..33063549552e4 100644 --- a/src/util/status_macros.h +++ b/src/util/status_macros.h @@ -35,7 +35,7 @@ if (!statusor.ok()) [[unlikely]] { \ return std::move(statusor).status(); \ } \ - lhs = std::move(statusor).ValueOrDie() + lhs = std::move(statusor).value() // Internal helper for concatenating macro values. #define PRIVACY_BLINDERS_STATUS_MACROS_IMPL_CONCAT_INNER_(x, y) x##y diff --git a/src/util/statusor.cc b/src/util/statusor.cc deleted file mode 100644 index 08eb1f04d6470..0000000000000 --- a/src/util/statusor.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "third_party/private-join-and-compute/src/util/statusor.h" - -#include "third_party/private-join-and-compute/src/chromium_patch.h" -#include "third_party/private-join-and-compute/src/util/status.h" - -namespace private_join_and_compute { -namespace internal { - -static const char* kInvalidStatusCtorArgMessage = - "Status::OK is not a valid constructor argument to StatusOr"; -static const char* kNullObjectCtorArgMessage = - "nullptr is not a valid constructor argument to StatusOr"; - -Status StatusOrHelper::HandleInvalidStatusCtorArg() { - LOG(DFATAL) << kInvalidStatusCtorArgMessage; - // In optimized builds, we will fall back to private_join_and_compute::StatusCode::kInternal. - return Status(::private_join_and_compute::StatusCode::kInternal, - kInvalidStatusCtorArgMessage); -} - -Status StatusOrHelper::HandleNullObjectCtorArg() { - LOG(DFATAL) << kNullObjectCtorArgMessage; - // In optimized builds, we will fall back to - // ::private_join_and_compute::StatusCode::kInternal. - return Status(::private_join_and_compute::StatusCode::kInternal, kNullObjectCtorArgMessage); -} - -void StatusOrHelper::Crash(const Status& status) { - LOG(FATAL) << "Attempting to fetch value instead of handling error " - << status; -} - -} // namespace internal -} // namespace private_join_and_compute diff --git a/src/util/statusor.h b/src/util/statusor.h index 7951d3d31a3c6..6f351f60cb3f9 100644 --- a/src/util/statusor.h +++ b/src/util/statusor.h @@ -13,250 +13,15 @@ * limitations under the License. */ -// StatusOr is the union (w/o using Union) of a Status object and a T object. -// StatusOr models the concept of an object that is either a usable value, or an -// error Status explaining why such a value is not present. To this end, -// StatusOr does not allow its Status value to be Status::OK. Furthermore, -// the value of a StatusOr must not be null. This is enforced by a debug -// check in most cases, but even when it is not, clients must not set the value -// to null. -// -// The primary use-case for StatusOr is as the return value of a function -// which may fail. -// -// Example client usage for a StatusOr, where T is not a pointer: -// -// StatusOr result = DoBigCalculationThatCouldFail(); -// if (result.ok()) { -// float answer = result.ValueOrDie(); -// printf("Big calculation yielded: %f", answer); -// } else { -// LOG(ERROR) << result.status(); -// } -// -// Example client usage for a StatusOr: -// -// StatusOr result = FooFactory::MakeNewFoo(arg); -// if (result.ok()) { -// std::unique_ptr foo(result.ValueOrDie()); -// foo->DoSomethingCool(); -// } else { -// LOG(ERROR) << result.status(); -// } -// -// Example client usage for a StatusOr>: -// -// StatusOr> result = FooFactory::MakeNewFoo(arg); -// if (result.ok()) { -// std::unique_ptr foo = std::move(result.ValueOrDie()); -// foo->DoSomethingCool(); -// } else { -// LOG(ERROR) << result.status(); -// } -// -// Example factory implementation returning StatusOr: -// -// StatusOr FooFactory::MakeNewFoo(int arg) { -// if (arg <= 0) { -// return Status(::private_join_and_compute::StatusCode::kInvalidArgument, -// "Arg must be positive"); -// } else { -// return new Foo(arg); -// } -// } -// - #ifndef UTIL_STATUSOR_H_ #define UTIL_STATUSOR_H_ -#include -#include -#include - -#include "third_party/private-join-and-compute/base/private_join_and_compute_export.h" -#include "third_party/private-join-and-compute/src/util/status.h" // IWYU pragma: export // for Status +#include "third_party/abseil-cpp/absl/status/statusor.h" namespace private_join_and_compute { - template - class StatusOr { - public: - // Construct a new StatusOr with Status::UNKNOWN status - StatusOr(); - - // Construct a new StatusOr with the given non-ok status. After calling - // this constructor, calls to ValueOrDie() will CHECK-fail. - // - // NOTE: Not explicit - we want to use StatusOr as a return - // value, so it is convenient and sensible to be able to do 'return - // Status()' when the return type is StatusOr. - // - // REQUIRES: status != Status::OK. This requirement is DCHECKed. - // In optimized builds, passing Status::OK here will have the effect - // of passing PosixErrorSpace::EINVAL as a fallback. - StatusOr(const Status& status); // NOLINT - no explicit - - // Construct a new StatusOr with the given value. If T is a plain pointer, - // value must not be nullptr. After calling this constructor, calls to - // ValueOrDie() will succeed, and calls to status() will return OK. - // - // NOTE: Not explicit - we want to use StatusOr as a return type - // so it is convenient and sensible to be able to do 'return T()' - // when the return type is StatusOr. - // - // REQUIRES: if T is a plain pointer, value != nullptr. This requirement is - // DCHECKed. In optimized builds, passing a nullptr pointer here will have - // the effect of passing ::private_join_and_compute::StatusCode::kInternal as a fallback. - StatusOr(const T& value); // NOLINT - no explicit - - // Copy constructor. - StatusOr(const StatusOr& other); - - // Assignment operator. - StatusOr& operator=(const StatusOr& other); - - // Move constructor and move-assignment operator. - StatusOr(StatusOr&& other) = default; - StatusOr& operator=(StatusOr&& other) = default; - - // Rvalue-reference overloads of the other constructors and assignment - // operators, to support move-only types and avoid unnecessary copying. - StatusOr(T&& value); // NOLINT - no explicit - - // Returns a reference to our status. If this contains a T, then - // returns Status::OK. - const Status& status() const; - - // Returns this->status().ok() - bool ok() const; - - // Returns a reference to our current value, or CHECK-fails if !this->ok(). - const T& ValueOrDie() const&; - T& ValueOrDie() &; - const T&& ValueOrDie() const&&; - T&& ValueOrDie() &&; - - // Ignores any errors. This method does nothing except potentially suppress - // complaints from any tools that are checking that errors are not dropped on - // the floor. - void IgnoreError() const {} - - private: - // absl::variant variant_; - Status status_; - std::unique_ptr value_; -}; - -//////////////////////////////////////////////////////////////////////////////// -// Implementation details for StatusOr - -namespace internal { - -class PRIVATE_COMPUTE_EXPORT StatusOrHelper { - public: - // Move type-agnostic error handling to the .cc. - static Status HandleInvalidStatusCtorArg(); - static Status HandleNullObjectCtorArg(); - static void Crash(const Status& status); - - // Customized behavior for StatusOr vs. StatusOr - template - struct Specialize; -}; - -template -struct StatusOrHelper::Specialize { - // For non-pointer T, a reference can never be nullptr. - static inline bool IsValueNull(const T& t) { return false; } -}; - -template -struct StatusOrHelper::Specialize { - static inline bool IsValueNull(const T* t) { return t == nullptr; } -}; - -} // namespace internal - -template -inline StatusOr::StatusOr() : status_(Status::UNKNOWN()), value_(nullptr) {} - -template -inline StatusOr::StatusOr(const Status& status) - : status_(status), value_(nullptr) { - if (status.ok()) { - status_ = internal::StatusOrHelper::HandleInvalidStatusCtorArg(); - } -} - -template -inline StatusOr::StatusOr(const T& value) - : status_(Status::OK()), value_(new T(value)) { - if (internal::StatusOrHelper::Specialize::IsValueNull(*value_)) { - status_ = internal::StatusOrHelper::HandleNullObjectCtorArg(); - } -} - -template -inline StatusOr::StatusOr(const StatusOr& other) - : status_(other.status_), value_(new T(*other.value_)) {} - -template -inline StatusOr& StatusOr::operator=(const StatusOr& other) { - status_ = other.status_; - value_.reset(new T(*other.value_)); - return *this; -} - - -template -inline StatusOr::StatusOr(T&& value) - : status_(Status::OK()), value_(new T(std::forward(value))) { - if (internal::StatusOrHelper::Specialize::IsValueNull(*value_)) { - status_ = internal::StatusOrHelper::HandleNullObjectCtorArg(); - } -} - -template -inline const Status& StatusOr::status() const { - return status_; -} - -template -inline bool StatusOr::ok() const { - return status_.ok(); -} - -template -inline const T& StatusOr::ValueOrDie() const& { - if (value_ == nullptr) { - internal::StatusOrHelper::Crash(status()); - } - return *value_; -} - -template -inline T& StatusOr::ValueOrDie() & { - if (value_ == nullptr) { - internal::StatusOrHelper::Crash(status()); - } - return *value_; -} - -template -inline const T&& StatusOr::ValueOrDie() const&& { - if (value_ == nullptr) { - internal::StatusOrHelper::Crash(status()); - } - return std::move(*value_); -} - template -inline T&& StatusOr::ValueOrDie() && { - if (value_ == nullptr) { - internal::StatusOrHelper::Crash(status()); - } - return std::move(*value_); -} +using StatusOr = absl::StatusOr; } // namespace private_join_and_compute