After trying to load the dataset, I didn’t get a bad allocation. Instead I got a crash due to a lookup in scalar array using a negative index.
Code where the error occur is the following:
The crash occur when executing the line inScalars->GetComponent(idS++,0); with idS = -2147482744
It turns out that the idS ivar is of type int, and the value overflow … it should be changed to vtkIdType along with all intermediate variables.
The following snippet allows to reproduce the incorrect index value:
int extent_0 = 0;
int extent_1 = 1207;
int extent_2 = 0;
int extent_3 = 1250;
int extent_4 = 0;
int idY = 47;
int idZ = 1421;
int idS_test = ((extent_1 - extent_0 + 1)*
((extent_3 - extent_2 + 1)*(idZ - extent_4) +
(idY - extent_2)));
std::cout << "idS_test " << idS_test << std::endl;
idY = 48;
idS_test = ((extent_1 - extent_0 + 1)*
((extent_3 - extent_2 + 1)*(idZ - extent_4) +
(idY - extent_2)));
std::cout << "idS_test " << idS_test << std::endl;
associated output is:
idS_test 2147483344
idS_test -2147482744
Proposed path forward
To move forward,
We need to change the type of all intermediate variable to vtkIdType. The following work as expected:
vtkIdType extent_0 = 0;
vtkIdType extent_1 = 1207;
vtkIdType extent_2 = 0;
vtkIdType extent_3 = 1250;
vtkIdType extent_4 = 0;
vtkIdType idY = 47;
vtkIdType idZ = 1421;
vtkIdType idS_test = ((extent_1 - extent_0 + 1)*
((extent_3 - extent_2 + 1)*(idZ - extent_4) +
(idY - extent_2)));
std::cout << "idS_test " << idS_test << std::endl;
idY = 48;
idS_test = ((extent_1 - extent_0 + 1)*
((extent_3 - extent_2 + 1)*(idZ - extent_4) +
(idY - extent_2)));
std::cout << "idS_test " << idS_test << std::endl;
Output
idS_test 2147483344
idS_test 2147484552