Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[Ruby] Wrong data pointer in MemoryView of a sliced array

Aperta Adatta ai principianti
#52,021 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@gitedmond ci sta già lavorando.

Dal 7/10/2026.

  • #52286 di @gitedmond — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
74/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
cpp, ruby
Ambito
data

Direzione di ricerca

Parti da PrimitiveArrayGetter::fill in ext/arrow/memory-view.cpp, dove GetValuesSafe<uint8_t>(1) applica l'offset dell'array in byte invece che in unità di elementi. Riproduci il problema con lo snippet dell'issue (un Arrow::Int32Array tagliato e riletto tramite Fiddle::MemoryView), poi scala l'offset per la dimensione dell'elemento a larghezza fissa (come mostra lo snippet proposto nell'issue) in modo che data, item_size e byte_size siano coerenti. L'obiettivo è raggiunto quando gli slice di array primitivi multi-byte restituiscono i valori attesi; controlla la suite di test di ext/arrow per un test memory-view esistente da estendere.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Component: Ruby Type: bug
Describe the bug, including details regarding any error messages, version, and platform.

For a sliced primitive array, the data pointer of the exported
MemoryView is advanced by offset bytes instead of
offset × element size bytes, so values wider than one byte come
out wrong (no error is raised).

require "arrow"
require "fiddle"

a = Arrow::Int32Array.new([0, 1, 2, 3, 4, 5, 6, 7])
p Fiddle::MemoryView.new(a.slice(1, 3)).to_s.unpack("l*")
# => [16777216, 33554432, 50331648]   expected [1, 2, 3]
p Fiddle::MemoryView.new(a.slice(4, 3)).to_s.unpack("l*")
# => [1, 2, 3]                         expected [4, 5, 6]

The cause is GetValuesSafe<uint8_t>(1) in PrimitiveArrayGetter::fill
(ext/arrow/memory-view.cpp): it adds the offset in units of uint8_t.
The offset should be scaled by the element width.

A possible fix is to take the buffer start and scale the offset by the
element width:

const auto type =
  std::static_pointer_cast<const arrow::FixedWidthType>(array.type());
view_->item_size = type->bit_width() / 8;
const auto base = array_data->GetValuesSafe<uint8_t>(1, 0);
const auto data = base + array_data->offset * view_->item_size;
view_->data = const_cast<void *>(reinterpret_cast<const void *>(data));
view_->byte_size = view_->item_size * array.length();

red-arrow 25.0.1, Ruby 3.4.1, macOS (arm64).

Component(s)

Ruby

Lingua principale
C++
Stelle
17.2k
Fork
4.3k
Merge medio
4g 11h
PR unite (30g)
93

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/arrow

Tutte le issue di apache/arrow

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.