diff --git a/cpp/src/arrow/tensor.cc b/cpp/src/arrow/tensor.cc index 8cdf7f82d264..49b7a0b28ecf 100644 --- a/cpp/src/arrow/tensor.cc +++ b/cpp/src/arrow/tensor.cc @@ -216,6 +216,7 @@ Status ValidateTensorParameters(const std::shared_ptr& type, std::vector tmp_strides; RETURN_NOT_OK(ComputeRowMajorStrides(checked_cast(*type), shape, &tmp_strides)); + RETURN_NOT_OK(CheckTensorStridesValidity(data, shape, tmp_strides, type)); } if (dim_names.size() > shape.size()) { return Status::Invalid("too many dim_names are supplied"); diff --git a/cpp/src/arrow/tensor_test.cc b/cpp/src/arrow/tensor_test.cc index 05dcf38e1e61..2a2f564e7910 100644 --- a/cpp/src/arrow/tensor_test.cc +++ b/cpp/src/arrow/tensor_test.cc @@ -268,6 +268,9 @@ TEST(TestTensor, MakeFailureCases) { ASSERT_RAISES(Invalid, Tensor::Make(float64(), data, shape, {sizeof(double) * 12, sizeof(double)})); + // row-major (implicit strides) shape larger than the backing buffer + ASSERT_RAISES(Invalid, Tensor::Make(float64(), data, {3, 100})); + // too many dim_names are supplied ASSERT_RAISES(Invalid, Tensor::Make(float64(), data, shape, {}, {"foo", "bar", "baz"})); }