vermaseren / form

The FORM project for symbolic manipulation of very big expressions
GNU General Public License v3.0
982 stars 118 forks source link

Integer overflows in corner cases of moebius_ #430

Closed tueda closed 1 year ago

tueda commented 1 year ago

On 64-bit machines, the following code does not work (unless you have plenty of memory space ~ O(10EB)?):

L F = moebius_(2^31-1);
P;
.end
FORM 4.3.0 (Dec 12 2022, v4.3.0-7-ga580a7c) 64-bits  Run: Thu Dec 15 11:36:21 2022
    L F = moebius_(2^31-1);
    P;
    .end
test.frm Line 4 ==> No memory while allocating  Moebius
Program terminating at test.frm Line 2 -->
  0.00 sec out of 0.00 sec
tueda commented 1 year ago

28e15eaf0856a0a012795298d6a4b570e764a8b1 passes the following corner case test:

*--#[ moebius_3 :
* corner cases, see #430
#do i=1,9
  L F`i' = moebius_(2^15-`i');
#enddo
#do i=1,9
  L G`i' = moebius_(2^31-`i');
#enddo
P;
.end
assert succeeded?
if wordsize >= 2
  assert result("F1") =~ expr("-1")
  assert result("F2") =~ expr("1")
  assert result("F3") =~ expr("1")
  assert result("F4") =~ expr("0")
  assert result("F5") =~ expr("-1")
  assert result("F6") =~ expr("1")
  assert result("F7") =~ expr("0")
  assert result("F8") =~ expr("0")
  assert result("F9") =~ expr("-1")
end
if wordsize >= 4
  assert result("G1") =~ expr("-1")
  assert result("G2") =~ expr("0")
  assert result("G3") =~ expr("-1")
  assert result("G4") =~ expr("0")
  assert result("G5") =~ expr("1")
  assert result("G6") =~ expr("-1")
  assert result("G7") =~ expr("1")
  assert result("G8") =~ expr("0")
  assert result("G9") =~ expr("-1")
end
*--#] moebius_3 :

though I haven't put this test into the repository because it easily leads to a timeout.

Maybe check.rb needs some way to extend the default timeout for specific tests.

dave1667 commented 1 year ago

nexus@nexus:~/Projects/form-master$ form test_430.frm FORM 4.3 (Dec 28 2022) 64-bits Run: Thu Dec 29 08:07:43 2022 *--#[ moebius_3 :

Time = 0.00 sec Generated terms = 1 F1 Terms in output = 1 Bytes used = 20

Time = 0.00 sec Generated terms = 1 F2 Terms in output = 1 Bytes used = 20

Time = 0.00 sec Generated terms = 1 F3 Terms in output = 1 Bytes used = 20

Time = 0.00 sec Generated terms = 0 F4 Terms in output = 0 Bytes used = 4

Time = 0.00 sec Generated terms = 1 F5 Terms in output = 1 Bytes used = 20

Time = 0.00 sec Generated terms = 1 F6 Terms in output = 1 Bytes used = 20

Time = 0.00 sec Generated terms = 0 F7 Terms in output = 0 Bytes used = 4

Time = 0.00 sec Generated terms = 0 F8 Terms in output = 0 Bytes used = 4

Time = 0.00 sec Generated terms = 1 F9 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 1 G1 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 0 G2 Terms in output = 0 Bytes used = 4

Time = 1.29 sec Generated terms = 1 G3 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 0 G4 Terms in output = 0 Bytes used = 4

Time = 1.29 sec Generated terms = 1 G5 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 1 G6 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 1 G7 Terms in output = 1 Bytes used = 20

Time = 1.29 sec Generated terms = 0 G8 Terms in output = 0 Bytes used = 4

Time = 1.29 sec Generated terms = 1 G9 Terms in output = 1 Bytes used = 20

F1 =