haskell / aeson

A fast Haskell JSON library
Other
1.26k stars 321 forks source link

aeson-2.1.2.1 test suite fails on 32bit/i686 #1060

Open sternenseemann opened 1 year ago

sternenseemann commented 1 year ago

The offending tests seem to be:

Full log

Using Nix/nixpkgs, i686-linux, GHC 9.4.6

iliastsi commented 1 year ago

We are seeing this in Debian as well, the error is:

  i_number_huge_exp.json
      decode:                                      FAIL
        Test output was different from 'tests/JSONTestSuite/results/i_number_huge_exp.txt'. Output of ["diff","-u","tests/JSONTestSuite/results/i_number_huge_exp.txt","/tmp/i_number_huge_exp3240953-4.actual"]:
        --- tests/JSONTestSuite/results/i_number_huge_exp.txt   2001-09-09 01:46:40.000000000 +0000
        +++ /tmp/i_number_huge_exp3240953-4.actual  2023-10-21 06:05:02.580198038 +0000
        @@ -1 +1 @@
        -Right (Array [Number 4.0e-30000000995])
        +Right (Array [Number 4.0e64770077])

        Use -p '$0=="tests.JSONTestSuite.i_number_huge_exp.json.decode"' to rerun this test only.
      decode via tokens:                           FAIL
        Test output was different from 'tests/JSONTestSuite/results/i_number_huge_exp.txt'. Output of ["diff","-u","tests/JSONTestSuite/results/i_number_huge_exp.txt","/tmp/i_number_huge_exp3240953-5.actual"]:
        --- tests/JSONTestSuite/results/i_number_huge_exp.txt   2001-09-09 01:46:40.000000000 +0000
        +++ /tmp/i_number_huge_exp3240953-5.actual  2023-10-21 06:05:02.588198009 +0000
        @@ -1 +1 @@
        -Right (Array [Number 4.0e-30000000995])
        +Right (Array [Number 4.0e64770077])

        Use -p '/i_number_huge_exp.json.decode via tokens/' to rerun this test only.
      tokens bs:                                   FAIL (0.01s)
        Test output was different from 'tests/JSONTestSuite/results/i_number_huge_exp.tok'. Output of ["diff","-u","tests/JSONTestSuite/results/i_number_huge_exp.tok","/tmp/i_number_huge_exp3240953-6.actual"]:
        --- tests/JSONTestSuite/results/i_number_huge_exp.tok   2001-09-09 01:46:40.000000000 +0000
        +++ /tmp/i_number_huge_exp3240953-6.actual  2023-10-21 06:05:02.596197979 +0000
        @@ -1,4 +1,4 @@
         TkArrayOpen
         TkItem
        -TkNumber NumScientific 4.0e-30000000995
        +TkNumber NumScientific 4.0e64770077
         TkArrayEnd

        Use -p '/i_number_huge_exp.json.tokens bs/' to rerun this test only.
      tokens lbs:                                  FAIL
        Test output was different from 'tests/JSONTestSuite/results/i_number_huge_exp.tok'. Output of ["diff","-u","tests/JSONTestSuite/results/i_number_huge_exp.tok","/tmp/i_number_huge_exp3240953-7.actual"]:
        --- tests/JSONTestSuite/results/i_number_huge_exp.tok   2001-09-09 01:46:40.000000000 +0000
        +++ /tmp/i_number_huge_exp3240953-7.actual  2023-10-21 06:05:02.604197950 +0000
        @@ -1,4 +1,4 @@
         TkArrayOpen
         TkItem
        -TkNumber NumScientific 4.0e-30000000995
        +TkNumber NumScientific 4.0e64770077
         TkArrayEnd

        Use -p '/i_number_huge_exp.json.tokens lbs/' to rerun this test only.

I bisected this and found the commit that introduced this regression is f089cdbf5dc (CC @phadej ). I believe this commit is wrong because the cached results are only valid for 64-bit systems and not for 32-bit ones. In Debian, I have reverted this commit in Debian for now.

phadej commented 1 year ago

The real issue here is that on both systems the exponent in numbers may overflow (and on 32bit system JSONTestSuite happened to have tests where it does), but the parse is still successful. So that is clearly wrong.

There are two options: