Skip to content

Incorrect output of b2nd_get_slice_cbuffer #701

@barakugav

Description

@barakugav

Describe the bug
Output of b2nd_get_slice_cbuffer is incorrect, values are from the array, but wrong indices.

To Reproduce
To reproduce the error, run this program:

#include <b2nd.h>

int main()
{
  blosc2_init();

  int32_t typesize = 8;
  int8_t ndim = 4;
  int64_t shape[4] = {2, 4, 2, 3};
  uint64_t data[48] = {0}; // all zeros
  data[0] = 5;             // expected the first element at [0,0,0,0] to be 5

  blosc2_cparams cparams = BLOSC2_CPARAMS_DEFAULTS;
  cparams.typesize = typesize;
  cparams.compcode = BLOSC_LZ4;
  cparams.filters[0] = BLOSC_DELTA;
  blosc2_storage b2_storage = BLOSC2_STORAGE_DEFAULTS;
  b2_storage.cparams = &cparams;
  int32_t chunkshape[4] = {2, 2, 1, 2};
  int32_t blockshape[4] = {2, 1, 1, 2};
  b2nd_context_t *ctx = b2nd_create_ctx(&b2_storage, ndim, shape, chunkshape, blockshape, NULL, 0, NULL, 0);
  b2nd_array_t *array;
  BLOSC_ERROR(b2nd_from_cbuffer(ctx, &array, data, sizeof(data)));

  // Access [0, 1, 0, 0]       [0:1, 1:2, 0:1, 0:1]
  const int64_t slice1_start[] = {0, 1, 0, 0};
  const int64_t slice1_stop[] = {1, 2, 1, 1};
  uint64_t slice1_data[] = {0};
  const int64_t slice1_data_shape[] = {1, 1, 1, 1};
  BLOSC_ERROR(b2nd_get_slice_cbuffer(array, slice1_start, slice1_stop, slice1_data, slice1_data_shape, sizeof(slice1_data)));
  printf("Reading arr[0,1,0,0], expected 0 actual %d (looks like arr[0,0,0,0])\n", slice1_data[0]);

  BLOSC_ERROR(b2nd_free(array));
  BLOSC_ERROR(b2nd_free_ctx(ctx));

  blosc2_destroy();
}

Output:

Reading arr[0,1,0,0], expected 0 actual 5 (looks like arr[0,0,0,0])

Expected behavior
In the above example, we create an array of uint64 of shape [2, 4, 2, 3] with all zeros except the element at arr[0,0,0,0] which we initialize to 5.
When using b2nd_get_slice_cbuffer with a slice of [0:1, 1:2, 0:1, 0:1], trying to access a single element at index [0, 1, 0, 0] we expect to read 0, but we read 5.

System information:

  • OS: Macos
  • Compiler: clang
  • Version: 2.21.3

Additional context
The issue is also reproducible with BLOSC_LZ4HC but not with BLOSC_BLOSCLZ.
The issue is not reproducible when removing the delta filter.

Thanks for the support ❤️

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions