From: "Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date: 2022-12-20T12:10:13+00:00
Subject: [ruby-core:111346] [Ruby master Feature#19245] Strict mode for Array#pack that doesn't silently truncate numbers that are too large for the given directive

Issue #19245 has been updated by Eregon (Benoit Daloze).


FWIW, #15460 was another discussion about "implicit modulo".
I'm of the opinion it's better to error there and I think this behavior is rarely if ever wanted.

FFI::Pointer does raise for out-of-bounds integers, and that feels very similar to `pack`:
```
> FFI::MemoryPointer.new(16).write_int(2**32)
(irb):11:in `write_int32': integer 4294967296 too big to convert to `int' (RangeError)
```
Which seems like the right thing to do, losing data should never be silent IMHO.

----------------------------------------
Feature #19245: Strict mode for Array#pack that doesn't silently truncate numbers that are too large for the given directive
https://bugs.ruby-lang.org/issues/19245#change-100720

* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
----------------------------------------
```ruby
>> [256].pack("C").unpack1("C")
=> 0
>> [257].pack("C").unpack1("C")
=> 1
```

This is specified:

```ruby
  it "encodes the least significant 32 bits of a negative number" do
    [ [[-0x0000_0021], "\xdf\xff\xff\xff"],
      [[-0x0000_4321], "\xdf\xbc\xff\xff"],
      [[-0x0065_4321], "\xdf\xbc\x9a\xff"],
      [[-0x7865_4321], "\xdf\xbc\x9a\x87"]
    ].should be_computed_by(:pack, pack_format())
  end
```

But not documented in `Array#pack`.

I think that in many case this may lead to silent bugs.

### Possible solutions

We could have a strict version of `pack`, either `pack(template, strict: true)` or `pack!(template)`.

Or alternatively if we think this is never a desired behavior, we could change `pack` to first warn on truncation and later raise.





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/