stdlib-js / stdlib-js/stdlib

@stdlib/array/fixed-endian-factory allows misaligned byte offsets and fractional lengths

Aperta Adatta ai principianti
#15,193 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
JavaScript
Stelle
6k
Fork
1.3k
Merge medio
1g 3h
PR unite (30g)
611

Descrizione

### Description

I noticed that `@stdlib/array/fixed-endian-factory` accepts `ArrayBuffer` byte offsets that are not aligned to the element size.

For example, `Float32` values use 4 bytes per element, but the constructor currently accepts a `byteOffset` of `2`.

That can lead to fractional array lengths, which seems incorrect and also differs from native `TypedArray` behavior.

### Reproduction

```js
const Float32ArrayFE = require( '@stdlib/array/fixed-endian-float32' );

const buf = new ArrayBuffer( 16 );
const arr = new Float32ArrayFE( 'little-endian', buf, 2 );

console.log( arr.length );
console.log( arr.byteLength );
console.log( arr.byteOffset );
```

Output:

```text
3.5
14
2
```

The native equivalent:

```js
new Float32Array( new ArrayBuffer( 16 ), 2 );
```

throws a `RangeError` because the offset is not aligned to the 4-byte element size.

I also noticed a similar case when the offset itself is aligned, but the remaining number of bytes is not divisible by the element size:

```js
const Float32ArrayFE = require( '@stdlib/array/fixed-endian-float32' );

const arr = new Float32ArrayFE(
'little-endian',
new ArrayBuffer( 10 ),
4
);

console.log( arr.length );
```

This returns:

```text
1.5
```

while native `Float32Array` rejects the equivalent construction.

### Expected behavior

I would expect the constructor to reject byte offsets that are not aligned to `BYTES_PER_ELEMENT`.

And when no explicit length is provided, the remaining buffer size should also be divisible by `BYTES_PER_ELEMENT`.

That would prevent cases where the array ends up with a fractional `length`.

The relevant code seems to be in:

```text
lib/node_modules/@stdlib/array/fixed-endian-factory/lib/main.js
```

Would matching native `TypedArray` alignment behavior be the expected behavior here?

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Read lib/node_modules/@stdlib/array/fixed-endian-factory/lib/main.js and reproduce the two Float32 examples from the issue. Compare the constructor behavior with native TypedArray alignment rules; done means invalid offsets and non-divisible remaining byte sizes are rejected instead of producing fractional lengths.

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

Valutazione

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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.