Fix null ptr dereference in cpu implementation of operations
Operations fixed:
* MEAN
* ARGMIN/ARGMAX
* STRIDED_SLICE
The operations would crash when provided with inputs that resulted in an
empty output shape.
The change fixes the bug by making the operations output a tensor of
size [1] in this case.
Also, update the documentation to clarify this behaviour and move
squeeze operation test to appropriate spec directory.
Bug: 155508675
Bug: 155660285
Bug: 155508675
Bug: 155238914
Test: NNTest_static
Change-Id: Ia865c26021dd4d781659957049dd567beeaeae99
Merged-In: Ia865c26021dd4d781659957049dd567beeaeae99
(cherry picked from commit 7c72e8ff43536dc3d37817654cfa1313e5c36f93)
diff --git a/common/OperationsUtils.cpp b/common/OperationsUtils.cpp
index e503147..e8dd3e2 100644
--- a/common/OperationsUtils.cpp
+++ b/common/OperationsUtils.cpp
@@ -658,6 +658,10 @@
outDims[idx - numSkipAxis] = getSizeOfDimension(input, idx);
}
}
+ // Handle the case when all dimensions are removed
+ if (outDims.empty()) {
+ outDims.push_back(1);
+ }
output->dimensions = outDims;
}
@@ -675,11 +679,15 @@
// Copy the input dimensions, omitting the axis dimension.
output->dimensions.clear();
- output->dimensions.reserve(getNumberOfDimensions(input) - 1);
- output->dimensions.insert(output->dimensions.end(), input.dimensions.begin(),
- input.dimensions.begin() + axis);
- output->dimensions.insert(output->dimensions.end(), input.dimensions.begin() + axis + 1,
- input.dimensions.end());
+ if (getNumberOfDimensions(input) > 1) {
+ output->dimensions.reserve(getNumberOfDimensions(input) - 1);
+ output->dimensions.insert(output->dimensions.end(), input.dimensions.begin(),
+ input.dimensions.begin() + axis);
+ output->dimensions.insert(output->dimensions.end(), input.dimensions.begin() + axis + 1,
+ input.dimensions.end());
+ } else {
+ output->dimensions.push_back(1);
+ }
return true;
}