pitrou commented on a change in pull request #9395:
URL: https://github.com/apache/arrow/pull/9395#discussion_r577692502
##########
File path: cpp/src/arrow/tensor.cc
##########
@@ -127,14 +162,29 @@ Status CheckTensorStridesValidity(const
std::shared_ptr<Buffer>& data,
return Status::OK();
}
- std::vector<int64_t> last_index(shape);
- const int64_t n = static_cast<int64_t>(shape.size());
- for (int64_t i = 0; i < n; ++i) {
- --last_index[i];
+ // Check the largest offset can be computed without overflow
+ const size_t ndim = shape.size();
+ int64_t largest_offset = 0;
+ for (size_t i = 0; i < ndim; ++i) {
+ if (shape[i] == 0) continue;
+ if (strides[i] < 0) {
+ // TODO(mrkn): Support negative strides for sharing views
+ return Status::Invalid("negative strides not supported");
+ }
+
+ int64_t dim_offset;
+ if (!internal::MultiplyWithOverflow(shape[i] - 1, strides[i],
&dim_offset)) {
+ if (!internal::AddWithOverflow(largest_offset, dim_offset,
&largest_offset)) {
+ continue;
+ }
+ }
+
+ return Status::Invalid(
+ "offsets computed from shape and strides would not fit in 64-bit
integer");
}
- int64_t last_offset = Tensor::CalculateValueOffset(strides, last_index);
+
const int byte_width = internal::GetByteWidth(*type);
- if (last_offset + byte_width > data->size()) {
+ if (largest_offset + byte_width > data->size()) {
Review comment:
To avoid addition overflow, this should be `largest_offset >
data->size() - byte_width`.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]