Ticket #66 (closed defect: fixed)

Opened 20 months ago

Last modified 19 months ago

replace on simple-strings

Reported by: heller Owned by: somebody
Priority: minor Milestone:
Component: Core Version: 2012-12
Keywords: Cc:

Description

This code

(deftype index () `(integer 0 #.array-total-size-limit))

(defun %move-string (from start end to index)
  (declare (type simple-string from to) (type index start end index))
  (replace to from :start1 index :start2 start :end2 end))

(let ((x (make-string 35893164)))
  (%move-string x 4 4 x 35893164)
  nil)

when executed with (load (compile-file "test.lisp")) produces this error:

Type-error in kernel::object-not-type-error-handler:
   -499451136 is not of type (mod 536870911)
   [Condition of type type-error]

I don't see the bug in my code, so it seems to be a bug in CMUCL. lisp-implementation-version returns "snapshot-2012-12 (20D Unicode)"

Change History

Changed 19 months ago by rtoy

It's a bug in the DEFTRANSFORM for REPLACE. It uses BIT-BASH-COPY to copy things around and BIT-BASH-COPY uses bit indices. Characters are 16 bits (for unicode builds) so the size (35893164) times 16 overflows a fixnum.

Thanks for the report.

Changed 19 months ago by rtoy

  • status changed from new to closed
  • resolution set to fixed

Oops. This was fixed in commit cdf11377fbdb369d3a3810dd9bd01a8a73007255

There are still issues with very long strings; this needs to be solved in a different way.

Note: See TracTickets for help on using tickets.