From aae24f7f9e78a7f67fcf4992722b0f79c0fb1364 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Tue, 18 Jun 2019 11:19:40 -0700 Subject: [PATCH] Return right category of error. Use INVALID_ARGUMENT when the input is incorrect. (#1248) * Return the right category of error. * Return right category of error --- .../core/framework/tensorprotoutils.cc | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/onnxruntime/core/framework/tensorprotoutils.cc b/onnxruntime/core/framework/tensorprotoutils.cc index 83f18161c2..02c72b1de1 100644 --- a/onnxruntime/core/framework/tensorprotoutils.cc +++ b/onnxruntime/core/framework/tensorprotoutils.cc @@ -55,10 +55,10 @@ static Status UnpackTensorWithRawData(const void* raw_data, size_t raw_data_leng { size_t expected_size_in_bytes; if (!onnxruntime::IAllocator::CalcMemSizeForArray(expected_size, sizeof(T), &expected_size_in_bytes)) { - return Status(onnxruntime::common::ONNXRUNTIME, onnxruntime::common::FAIL, "size overflow"); + return Status(onnxruntime::common::ONNXRUNTIME, onnxruntime::common::INVALID_ARGUMENT, "size overflow"); } if (raw_data_length != expected_size_in_bytes) - return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL, + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "UnpackTensor: the pre-allocated size does not match the raw data size, expected ", expected_size_in_bytes, ", got ", raw_data_length); if (IsLittleEndianOrder()) { @@ -80,33 +80,32 @@ static Status UnpackTensorWithRawData(const void* raw_data, size_t raw_data_leng } } // namespace - namespace onnxruntime { namespace utils { // This macro doesn't work for Float16/bool/string tensors -#define DEFINE_UNPACK_TENSOR(T, Type, field_name, field_size) \ - template <> \ - Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_data, size_t raw_data_len, \ - /*out*/ T* p_data, int64_t expected_size) { \ - if (nullptr == p_data) { \ - const size_t size = raw_data != nullptr ? raw_data_len : tensor.field_size(); \ - if (size == 0) return Status::OK(); \ - return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \ - } \ - if (nullptr == p_data || Type != tensor.data_type()) { \ - return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \ - } \ - if (raw_data != nullptr) { \ - return UnpackTensorWithRawData(raw_data, raw_data_len, expected_size, p_data); \ - } \ - if (tensor.field_size() != expected_size) \ - return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL, "corrupted protobuf data: tensor shape size(", expected_size, \ - ") does not match the data size(", tensor.field_size(), ") in proto"); \ - auto& data = tensor.field_name(); \ - for (auto data_iter = data.cbegin(); data_iter != data.cend(); ++data_iter) \ - *p_data++ = *reinterpret_cast(data_iter); \ - return Status::OK(); \ +#define DEFINE_UNPACK_TENSOR(T, Type, field_name, field_size) \ + template <> \ + Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_data, size_t raw_data_len, \ + /*out*/ T* p_data, int64_t expected_size) { \ + if (nullptr == p_data) { \ + const size_t size = raw_data != nullptr ? raw_data_len : tensor.field_size(); \ + if (size == 0) return Status::OK(); \ + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \ + } \ + if (nullptr == p_data || Type != tensor.data_type()) { \ + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \ + } \ + if (raw_data != nullptr) { \ + return UnpackTensorWithRawData(raw_data, raw_data_len, expected_size, p_data); \ + } \ + if (tensor.field_size() != expected_size) \ + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "corrupted protobuf data: tensor shape size(", expected_size, \ + ") does not match the data size(", tensor.field_size(), ") in proto"); \ + auto& data = tensor.field_name(); \ + for (auto data_iter = data.cbegin(); data_iter != data.cend(); ++data_iter) \ + *p_data++ = *reinterpret_cast(data_iter); \ + return Status::OK(); \ } // TODO: complex64 complex128 @@ -134,7 +133,7 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* /*raw } if (tensor.string_data_size() != expected_size) - return Status(common::ONNXRUNTIME, common::FAIL, + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "UnpackTensor: the pre-allocate size does not match the size in proto"); auto& string_data = tensor.string_data(); @@ -161,7 +160,7 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d } if (tensor.int32_data_size() != expected_size) - return Status(common::ONNXRUNTIME, common::FAIL, + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "UnpackTensor: the pre-allocate size does not match the size in proto"); for (int iter : tensor.int32_data()) { *p_data++ = static_cast(iter); @@ -186,14 +185,14 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d } if (tensor.int32_data_size() != expected_size) - return Status(common::ONNXRUNTIME, common::FAIL, + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "UnpackTensor: the pre-allocate size does not match the size in proto"); constexpr int max_value = std::numeric_limits::max(); for (int i = 0; i < static_cast(expected_size); i++) { int v = tensor.int32_data()[i]; if (v < 0 || v > max_value) { - return Status(common::ONNXRUNTIME, common::FAIL, "data overflow"); + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "data overflow"); } p_data[i] = MLFloat16(static_cast(v)); } @@ -220,14 +219,14 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d } if (tensor.int32_data_size() != expected_size) - return Status(common::ONNXRUNTIME, common::FAIL, + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "UnpackTensor: the pre-allocate size does not match the size in proto"); constexpr int max_value = std::numeric_limits::max(); for (int i = 0; i < static_cast(expected_size); i++) { int v = tensor.int32_data()[i]; if (v < 0 || v > max_value) { - return Status(common::ONNXRUNTIME, common::FAIL, "data overflow"); + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "data overflow"); } p_data[i] = BFloat16(static_cast(v)); } @@ -235,11 +234,11 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d return Status::OK(); } -#define CASE_PROTO_TRACE(X, Y) \ - case ONNX_NAMESPACE::TensorProto_DataType::TensorProto_DataType_##X: \ - if (!IAllocator::CalcMemSizeForArrayWithAlignment(size, sizeof(Y), out)) { \ - return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto"); \ - } \ +#define CASE_PROTO_TRACE(X, Y) \ + case ONNX_NAMESPACE::TensorProto_DataType::TensorProto_DataType_##X: \ + if (!IAllocator::CalcMemSizeForArrayWithAlignment(size, sizeof(Y), out)) { \ + return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto"); \ + } \ break; template @@ -248,10 +247,10 @@ common::Status GetSizeInBytesFromTensorProto(const ONNX_NAMESPACE::TensorProto& size_t size = 1; for (google::protobuf::int64 dim : dims) { if (dim < 0 || static_cast(dim) >= std::numeric_limits::max()) { - return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto"); + return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto"); } if (!IAllocator::CalcMemSizeForArray(size, static_cast(dim), &size)) { - return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto"); + return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto"); } } switch (tensor_proto.data_type()) { @@ -285,7 +284,6 @@ std::vector GetTensorShapeFromTensorShapeProto(const ONNX_NAMESPACE::Te return tensor_shape_vec; } - struct UnInitializeParam { void* preallocated; size_t preallocated_size; @@ -377,7 +375,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path, { if (tensor_proto.data_location() == TensorProto_DataLocation_EXTERNAL) { if (ele_type == ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING) - return Status(common::ONNXRUNTIME, common::FAIL, "string tensor can not have raw data"); + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "string tensor can not have raw data"); std::unique_ptr external_data_info; ORT_RETURN_IF_ERROR(ExternalDataInfo::Create(tensor_proto.external_data(), external_data_info)); @@ -393,12 +391,12 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path, { void* file_data; ORT_RETURN_IF_ERROR(env.ReadFileAsString(full_path.c_str(), external_data_info->GetOffset(), - file_data, raw_data_len, deleter_for_file_data.d)); + file_data, raw_data_len, deleter_for_file_data.d)); raw_data = file_data; } } else if (tensor_proto.has_raw_data()) { if (ele_type == ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING) - return Status(common::ONNXRUNTIME, common::FAIL, "string tensor can not have raw data"); + return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "string tensor can not have raw data"); raw_data = tensor_proto.raw_data().data(); raw_data_len = tensor_proto.raw_data().size(); } @@ -411,7 +409,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path, int64_t tensor_size = 1; { for (auto i : tensor_proto.dims()) { - if (i < 0) return Status(common::ONNXRUNTIME, common::FAIL, "tensor can't contain negative dims"); + if (i < 0) return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "tensor can't contain negative dims"); tensor_size *= i; } } @@ -426,7 +424,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path, } if (preallocated && preallocated_size < size_to_allocate) - return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL, + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "The buffer planner is not consistent with tensor buffer size, expected ", size_to_allocate, ", got ", preallocated_size); switch (tensor_proto.data_type()) {