On Fri, Jul 19, 2024 at 02:04:43PM -0400, Boyuan Yang wrote:
> X-Debbugs-CC: kniel...@knielsen-hq.org dic...@his.com
> 
> 在 2024-07-03星期三的 18:46 -0400,Thomas Dickey写道:
> > On Wed, Jul 03, 2024 at 05:07:10PM -0400, Thomas Dickey wrote:
> > > On Wed, Jul 03, 2024 at 11:03:09AM -0400, Boyuan Yang wrote:
> > > > X-Debbugs-CC: t...@invisible-island.net
> > > > 
> > > > 在 2024-07-03星期三的 16:28 +0200,Kristian Nielsen写道:
> > > > > Package: mawk
> > > > > Version: 1.3.4.20240622-1
> > > > > Severity: normal
> > > > > 
> > > > > Dear Maintainer,
> > > > > 
> > > > > Running mawk produces wrong output from rand() on i386:
> > > > > 
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   0.158578
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   -0.276944
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   -0.387807
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   0.470306
> > > > > 
> > > > > The result of rand() should never be negative; and it should be
> > > > > deterministic after calling srand().
> > > > > 
> > > > > This occurs on i386 (tested in sbuild --arch=i386 as part of 
> > > > > debugging a
> > > > > reproducible build problem of package openscad).
> > > > > 
> > > > > The expected output is the same value between 0 and 1, for example:
> > > > > 
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   0.559536
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   0.559536
> > > > >   $ echo | mawk 'BEGIN {srand(10);} {print rand()};'
> > > > >   0.559536
> > > > > 
> > > > > The longer story, for completeness: I am the maintainer for openscad, 
> > > > > and I
> > > > > see openscad sometimes failing to build reproducibly on (only) i386 
> > > > > during
> > > > > the past year. The root cause seems to be a test script that calls 
> > > > > awk and
> > > > > behaves unexpectedly due to getting a negative number out of rand().
> > > > > 
> > > > > The problem does not seem to occur on amd64 or arm64. Openscad 
> > > > > doesn't build
> > > > > on armhf, so not sure if the problem in mawk is specific to i386 or 
> > > > > may be
> > > > > specific to 32-bit for example.
> > > > 
> > > > Ack. Reproducible on Debian Sid (mawk/1.3.4.20240622), not reproducible 
> > > > on Debian 12
> > > > Bookworm (mawk/1.3.4.20200120). Likely a regression since 2020.
> > > 
> > > odd - I can reproduce the problem, but what I'm seeing is older.
> > > I'll investigate further.
> > 
> > what I see is a problem with the configurable feature to use the system
> > srand/rand functions.  Apparently the relatively new configure check 
> > (and availability) for arc4random_stir/arc4random is not being scaled
> > properly.
> > 
> > The other bug that I see is that if the system rand/srand is used,
> > then srand has no effect in the script.  That is a drawback to the
> > new/improved(?) arc4random functions: their developers chose to not support 
> > an
> > equivalent to srand.
> > 
> > This bug can be resolved by adding --enable-builtin-srand to the configure
> > options.  The issue with repeatability has come up before - see
> > 
> >     https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=63843
> > 
> > but the scaling is actually a bug.  The configure script's choice of
> > random functions is a little awkward to work around other than by
> > setting the configure option (actually a small patch to the configure script
> > would work, by changing this line:
> > 
> >     for cf_func in arc4random_stir/arc4random srandom/random 
> > srand48/lrand48 srand/rand
> > to
> >     for cf_func in srandom/random srand48/lrand48 srand/rand
> > 
> > but I seem to recall that doesn't mesh with dpkg-buildpackage (ymmv).
> 
> 
> I must be having difficulty understanding the analysis above.
> From what I read, there could be two issues:
> 
> 
> (1) the default, external, POSIX-compliant(?) implementation of srand()
> call (from libc?) has different behavior than the mawk-internally-implemented
> one, or whatever mawk expects. Switching to the internal one helps solve the
> randomness/reproducibility issue.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html

does say "The arithmetic functions, except for int, shall be based on the ISO C
standard", however, implementations of awk do not necessarily match the C
srand/rand functions.

gawk and original-awk use srandom/random

mawk (what we're discussing) would use those if arc4random wasn't found.
Older platforms might use srand48/lrand48 or even srand/rand.

> 
> -> However, I don't understand why this is only an issue on i386, while
> other platforms (amd64, ...) seem not affected by this problem.
> 
> 
> (2) The scaling bug of srand() return value should never be negative.
> It is a different bug. Thomas proposed a patch to ditch the selection
> from arc4random.

In the next update, I'll have that as a change to the configure script.
I mentioned workarounds/patches in case you get there first.

(I have started working on more time-consuming bugs)
 
> -> Still, I don't understand why this is only an issue on i386, while
> other platforms (amd64, ...) seem not affected by this problem.

prototype says

       uint32_t arc4random(void);

That's because of sign-extension from unsigned numbers in the range 0 to
0xffffffff (and 64-bit machines wouldn't sign-extend that).
 
> -> I noticed the existence of arc4random(3) and srandom(3) but obviously
> don't have a good understanding to them yet.
> 
> -> It looks like if we enabled --enable-builtin-srand, both problem (1)
> and (2) will be gone. Is that the case?

yes - but it's not as good as the srandom/random pair.
 
> I would appreciate it if anyone could give a hint on some more insights,
> or what could be done on the Debian side (isn't other distros also
> affected by the bug?). I don't mind carrying a patch on aclocal.m4
> if absolutely needed.

that's the simplest (and closest) to accomplish the goal of dropping
arc2random from mawk.

-- 
Thomas E. Dickey <dic...@invisible-island.net>
https://invisible-island.net

Attachment: signature.asc
Description: PGP signature

Reply via email to