среда, 17 июня 2009 г.

Убить ClozureCL

Оказывает это просто (по крайней мере, версию 1.3), такой вот код:
(asdf:operate 'asdf:load-op :lift)

(defpackage :clozure.lift.test
(:use :cl :lift)
(:export :test))

(in-package #:clozure.lift.test)

(deftestsuite clozure-lift-test () ())

(addtest (clozure-lift-test)
test1
(ensure-same 6000
(length (let ((str ""))
(dotimes (i 1000)
(setf str
(concatenate 'string
str
"Привет")))
(length str)))))

(defun test ()
(run-tests :suite 'clozure-lift-test :report-pathname nil))
Приводит к
An unhandled error condition has been signalled: value #<BOGUS object @ #x14BF07EE> is not of the expected type SEQUENCE.
Теперь контрольный выстрел:
(clozure.lift.test:test)
В итоге, ошибка сегментирования и скоропостижный конец...

2 комментария:

  1. А какая версия CCL? Какая система?
    У меня повторить ошибку не получается:
    Start: CLOZURE-LIFT-TESTAn unhandled error condition has been signalled: value 6000 is not of the expected type SEQUENCE.

    #<Results for CLOZURE-LIFT-TEST 1 Test, 1 Error>

    ОтветитьУдалить
  2. x86 (32-bit) (но на AMD64), Gentoo Linux, ClozureCL-1.3
    Это дома. На работе софт примерно тот же самый, но железо intel-овское. Там этот код проходит нормально, но чудеса уже в других местах наблюдаются.

    В общем, можно выделить два фактора "смерти" (которые проявляются не вполне очевидным образом): русский текст и работа с FFI. Ну и как катализатор - lift, нормально работающий код начинает под управление lift вытворять чудеса вредительства, кажется что-то на уровне работы с hashtable. В общем, наблюдается поведение характерно для С-шных программ, делающих что-то плохое с памятью и начинающих валиться в самых разнообразных местах.

    ОтветитьУдалить