python-2.5, gcc-4.2.0, rpm-4.4.6 i -fwrapv

Marcin 'Qrczak' Kowalczyk qrczak w knm.org.pl
Nie, 15 Paź 2006, 16:21:01 CEST


Jest dziwna sprawa. Przy wersjach z HEAD tego co w subject Python
wykłada się na testach:

test_builtin
test test_builtin failed -- Traceback (most recent call last):
  File "/home/users/qrczak/rpm/BUILD/Python-2.5/Lib/test/test_builtin.py", line
999, in test_long
    self.assertEqual(long(ss), long(vv))
AssertionError: 100000000000000000000L != 93386650000961830912L
[...]
test_array
make: *** [test] Segmentation fault

Od jakiegoś czasu w rpmrc w CFLAGS jest -fwrapv. Doszedłem do tego,
że jeśli longobject.c jest kompilowany z -fwrapv, to działa źle:

$ LD_LIBRARY_PATH=. ./python -c 'print 10L**20'
93386650000961830912

natomiast jeśli tylko usunąć -fwrapv, to działa dobrze.

Na zdrowy rozum powinno być dokładnie odwrotnie. Python zakłada,
że arytmetyka całkowita ze znakiem się zawija. Jego deweloperzy już
wiedzą, że to gwałci reguły C, ale poprawienie tego odłożyli na później.
Tymczasem -fwrapv wyłącza optymalizacje zakładające, że nie będzie
przepełnień, czyli powinno pozwolić skompilować błędny kod, a nie
mu zaszkodzić.

Ktoś umie to wytłumaczyć?

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak w knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/


Więcej informacji o liście dyskusyjnej pld-devel-pl