Skip to content

Instantly share code, notes, and snippets.

@miyamuko
Created May 30, 2011 06:37
Show Gist options
  • Save miyamuko/998522 to your computer and use it in GitHub Desktop.
Save miyamuko/998522 to your computer and use it in GitHub Desktop.
si:make-chunk の src-chunk が nil で offset を指定した場合、chunk をいじろうとした時点で #xyzzy がクラッシュする
;; 以下のコードで si:unpack-string の時点で xyzzy がクラッシュする。
;;
;; - offset を指定しない場合や nil の場合はクラッシュしない
;; - offset の値は何でもいい
;;
;; offset を指定された場合に chunk が nil の場合は、si:make-chunk の時点でエラーにするように
;; 引数をチェックするとかかな。
(let ((chunk nil)
(offset 100))
(si:unpack-string
(si:make-chunk nil 256 chunk offset)
0 256))
@southly
Copy link

southly commented Jun 14, 2011

SOURCEがnilでOFFSETが数値の場合、si:make-chunkはOFFSETをアドレスとみなして参照するのでこういう使い方ではないでしょうか。100という参照してはいけないアドレスを参照してクラッシュしているのだと思います。クラッシュせずに例外をあげてくれるといいとは思います。

(let ((chunk nil)
      (offset (si:chunk-data (si:make-string-chunk "abcdefg"))))
  (si:unpack-string
   (si:make-chunk nil 256 chunk offset)
   0 256))
=> "abcdefg"

@miyamuko
Copy link
Author

あ、そうか。リファレンスを読み直したらたしかにそういう仕様でしたね。

SRC-CHUNK が nil で OFFSET が指定されていた場合には、 OFFSET をアドレス
と見なすのが特殊です。

cairo でこの機能を使っていたのにすっかり忘れてました。

今回は chunk が nil になることを期待してないコードに、うっかり nil を渡してしまって
クラッシュし、原因がなかなか分からずにハマってました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment