<div dir="ltr"><div class="gmail_default" style="font-size:small">The error being signalled is of class ccl::invalid-memory-access, which is a subclass of cl:storage-condition. This is more serious than an error, and is not a subclass of cl:error, hence trying to handle a cl:error won't work. It's usually best NOT to attempt to handle errors of this type, since they may mean that memory is corrupted. In your case, compiling with (optimize (speed 3) (safety 0)) means that you promise that you won't attempt to change the cdr of anything but a cons.<br><br>With the optimization, the compiler generates code that doesn't check for wrong number of arguments or types:<br><br>CL-USER> (defun f (x)<br>           (declare (optimize (safety 0) (speed 3)))<br>           (rplacd x 1))<br>F<br>CL-USER> (disassemble 'f)<br>L0<br>         (leaq (@ (:^ L0) (% rip)) (% fn))       ;     [0]<br>         (pushq (% rbp))                         ;     [7]<br>         (movq (% rsp) (% rbp))                  ;     [8]<br>         (pushq (% arg_z))                       ;    [11]<br>         (movq (% arg_z) (% arg_y))              ;    [12]<br>         (movl ($ 8) (% arg_z.l))                ;    [15]<br>         (nop)                                   ;    [20]<br>         (callq (@ .SPRPLACD))                   ;    [22]<br>         (leaq (@ (:^ L0) (% rip)) (% fn))       ;    [29]<br>         (movq (% arg_y) (% arg_z))              ;    [36]<br>         (leaveq)                                ;    [39]<br>         (retq)                                  ;    [40]<br><br>Without the declaration, the compiled code checks for one arg and that the argument to rplacd is actually a cons cell:<br><br>CL-USER> (defun f2 (x)<br>           (rplacd x 1))<br>F2<br>CL-USER> (disassemble 'f2)<br>L0<br>         (leaq (@ (:^ L0) (% rip)) (% fn))       ;     [0]<br>         (cmpl ($ 8) (% nargs))                  ;     [7]<br>         (jne L61)                               ;    [10]<br>         (pushq (% rbp))                         ;    [12]<br>         (movq (% rsp) (% rbp))                  ;    [13]<br>         (pushq (% arg_z))                       ;    [16]<br>         (movq (% arg_z) (% arg_y))              ;    [17]<br>         (movl ($ 8) (% arg_z.l))                ;    [20]<br>         (movl (% arg_y.l) (% imm0.l))           ;    [25]<br>         (andl ($ 15) (% imm0.l))                ;    [27]<br>         (cmpl ($ 3) (% imm0.l))                 ;    [30]<br>         (jne L69)                               ;    [33]<br>         (nop)                                   ;    [35]<br>         (callq (@ .SPRPLACD))                   ;    [38]<br>         (leaq (@ (:^ L0) (% rip)) (% fn))       ;    [45]<br>         (movq (% arg_y) (% arg_z))              ;    [52]<br>         (leaveq)                                ;    [55]<br>         (retq)                                  ;    [56]<br>L61<br>         (uuo-error-wrong-number-of-args)        ;    [61]<br>L69<br>         (uuo-error-reg-not-tag (% arg_y) ($ 3)) ;    [69]<br><br>The latter signals a different condition than the former if you pass it 0:<br><br>CL-USER> (ignore-errors (f2 0))<br>NIL<br>#<TYPE-ERROR #x302004355ADD><br>CL-USER> (handler-case (f 0) (storage-condition (c) c))<br>#<CCL::INVALID-MEMORY-ACCESS #x3020041F871D><br><br>-Bill<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 2, 2014 at 7:59 AM, Jared C. Davis <span dir="ltr"><<a href="mailto:jared@cs.utexas.edu" target="_blank">jared@cs.utexas.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Suppose I do something utterly boneheaded like:<br>
<br>
    (defun f (x)<br>
      (declare (optimize (safety 0) (speed 3)))<br>
      (rplacd x 1))<br>
<br>
    (f 0)<br>
<br>
This leads to an error like this: (on linux-x8664, at least)<br>
<br>
    > Error: Fault during write to memory address #x-3<br>
    > While executing: F, in process listener(1).<br>
    > Type :POP to abort, :R for a list of available restarts.<br>
    > Type :? for other options.<br>
<br>
Is there a way to catch and handle this error?  It seems for instance<br>
that (ignore-errors (f 0)) doesn't work and neither does, e.g.,:<br>
<br>
    (handler-case<br>
      (f 0)<br>
      (error (condition)<br>
             (format t "Caught error ~a~%" condition)))<br>
<br>
Maybe I just need a handler-case for some condition other than "error"?<br>
<br>
I understand that this kind of a fault is more serious than your<br>
typical error that user-level code might provoke.  I imagine that<br>
simply masking errors like this might be a terrible idea that could,<br>
for instance, lead to memory corruption that could cause mysterious<br>
errors later down the road, or that given other arguments F might<br>
immediately lead to a segmentation fault or similar.<br>
<br>
In my particular case, though, users are interacting with CCL via a<br>
web interface and can't see the CCL console.  So if an error like this<br>
occurs, I'd like to (try to) capture it and (try to) show it to the<br>
user so that they know something has gone horribly wrong.<br>
<br>
Thanks!<br>
<span class="HOEnZb"><font color="#888888">Jared<br>
<br>
--<br>
Jared C. Davis <<a href="mailto:jared@cs.utexas.edu">jared@cs.utexas.edu</a>><br>
11410 Windermere Meadows<br>
Austin, TX 78759<br>
<a href="http://www.cs.utexas.edu/users/jared/" target="_blank">http://www.cs.utexas.edu/users/jared/</a><br>
_______________________________________________<br>
Openmcl-devel mailing list<br>
<a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br>
<a href="https://lists.clozure.com/mailman/listinfo/openmcl-devel" target="_blank">https://lists.clozure.com/mailman/listinfo/openmcl-devel</a><br>
</font></span></blockquote></div><br></div>