使用lambda和'reduce'捕获标签时出现奇怪的非lisp错误`

使用lambda和'reduce'捕获标签时出现奇怪的非lisp错误`,lambda,crash,closures,common-lisp,allegro-cl,Lambda,Crash,Closures,Common Lisp,Allegro Cl,在用Allegro Common Lisp v9.0 for Windows开发应用程序时,我偶然发现了一个非常奇怪的错误(?)。我没有得到常规的lisp错误,而是得到封装在lisp条件中的系统错误。我设法创建了一个简单的测试用例来重现错误(这很愚蠢): 每次尝试这个测试用例时,我都会得到一个堆栈溢出错误 在我的原始代码中,我得到了大量的错误,主要是分段错误,有一次是“因为它不是listp,所以不能乘坐汽车”,还有一次是Allegro撞车 在CLisp中运行相同的代码段(或我的原始代码)时,一切

在用Allegro Common Lisp v9.0 for Windows开发应用程序时,我偶然发现了一个非常奇怪的错误(?)。我没有得到常规的lisp错误,而是得到封装在lisp条件中的系统错误。我设法创建了一个简单的测试用例来重现错误(这很愚蠢):

每次尝试这个测试用例时,我都会得到一个堆栈溢出错误

在我的原始代码中,我得到了大量的错误,主要是分段错误,有一次是“因为它不是listp,所以不能乘坐
汽车”,还有一次是Allegro撞车

在CLisp中运行相同的代码段(或我的原始代码)时,一切都正常运行,REPL给出了答案

我的问题:我在这里做了什么错事或违法的事,还是Allegro CL中有漏洞?如果是这样的话,我们能确定这个bug是什么以及如何处理它吗



一些实验似乎表明
reduce
和双标签在再现错误方面是必不可少的;用
funcall
替换
reduce
,或者如果只有一个标签,则不会给出错误。

这是一个编译器错误。请联系弗兰兹

CG-USER(8): (disassemble (lambda-producer))
;; disassembly of #<Closure Template Function (:INTERNAL LAMBDA-PRODUCER 0)>
;; formals: X
;; closure vectors:
;;      0: #<Closure (LABELS LAMBDA-PRODUCER PRODUCER-LABEL2) @ #xdfdda7a>
;;      1: #<Function (LABELS LAMBDA-PRODUCER PRODUCER-LABEL)>
;; constant vector:
0: #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
1: REDUCE

;; code start: #x21869018:
   0: 55          pushl ebp
   1: 89 e5     movl    ebp,esp
   3: 83 ec 38  subl    esp,$56
   6: 89 75 fc  movl    [ebp-4],esi
   9: 89 5d e4  movl    [ebp-28],ebx
  12: 39 63 1a  cmpl    [ebx+26],esp
  15: 76 03     jbe 20
  17: ff 57 43  call    *[edi+67]      ; SYS::TRAP-STACK-OVFL
  20: 83 f9 01  cmpl    ecx,$1
  23: 74 03     jz  28
  25: ff 57 8b  call    *[edi-117]    ; SYS::TRAP-WNAERR
  28: 8b 5d 00  movl    ebx,[ebp+0]
  31: 8b 5b ec  movl    ebx,[ebx-20]
  34: 8b 5b fa  movl    ebx,[ebx-6]
  37: 80 7f cb 00 cmpb  [edi-53],$0        ; SYS::C_INTERRUPT-PENDING
  41: 74 03     jz  46
  43: ff 57 87  call    *[edi-121]    ; SYS::TRAP-SIGNAL-HIT
  46: 8b 56 12  movl    edx,[esi+18] ; #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
  49: ff b7 43 fe pushl [edi-445] ; SYS::CLOSURE-HEADER
      ff ff 
  55: 8f 45 d0  popl    [ebp-48]
  58: ff b7 47 fe pushl [edi-441] ; SYS::CLOSURE-ADDRESS
      ff ff 
  64: 8f 45 d4  popl    [ebp-44]
  67: 89 55 d8  movl    [ebp-40],edx
  70: 89 5d dc  movl    [ebp-36],ebx
  73: 8d 5d e2  leal    ebx,[ebp-30]
  76: 89 c2     movl    edx,eax
  78: 89 d8     movl    eax,ebx
  80: 8b 5e 16  movl    ebx,[esi+22] ; REDUCE
  83: ff 57 27  call    *[edi+39]      ; SYS::TRAMP-TWO
  86: 89 7d f0  movl    [ebp-16],edi
  89: c9          leave
  90: 8b 75 fc  movl    esi,[ebp-4]
  93: c3          ret

;; disassembly of #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
;; formals: A B

;; code start: #x2186ccc0:
   0: 55          pushl ebp
   1: 89 e5     movl    ebp,esp
   3: 83 ec 30  subl    esp,$48
   6: 89 75 fc  movl    [ebp-4],esi
   9: 89 5d e4  movl    [ebp-28],ebx
  12: 39 63 1a  cmpl    [ebx+26],esp
  15: 76 03     jbe 20
  17: ff 57 43  call    *[edi+67]      ; SYS::TRAP-STACK-OVFL
  20: 83 f9 02  cmpl    ecx,$2
  23: 74 03     jz  28
  25: ff 57 8b  call    *[edi-117]    ; SYS::TRAP-WNAERR
  28: 8b 5d 00  movl    ebx,[ebp+0]
  31: 8b 5b ec  movl    ebx,[ebx-20]
  34: 8b 5b fa  movl    ebx,[ebx-6]
  37: 80 7f cb 00 cmpb  [edi-53],$0        ; SYS::C_INTERRUPT-PENDING
  41: 74 03     jz  46
  43: ff 57 87  call    *[edi-121]    ; SYS::TRAP-SIGNAL-HIT
  46: ff 73 f6  pushl   [ebx-10]
  49: 8f 45 dc  popl    [ebp-36]        ; EXCL::|local-0|
  52: 8b 75 dc  movl    esi,[ebp-36] ; EXCL::|local-0|
  55: 89 fb     movl    ebx,edi
  57: b9 02 00 00 movl  ecx,$2
      00 
  62: ff 57 23  call    *[edi+35]      ; SYS::FUNCALL-TRAMP
  65: 89 7d f0  movl    [ebp-16],edi
  68: c9          leave
  69: 8b 75 fc  movl    esi,[ebp-4]
  72: c3          ret
  73: 90          nop
CG-USER(8):(反汇编(lambda生产商))
;; 拆卸#
;; 形式:X
;; 闭合向量:
;;      0: #
;;      1: #
;; 恒定矢量:
0: #
1:减少
;; 代码开始:#x21869018:
0:55推拉ebp
1:89 e5移动ebp,esp
3:83欧共体38次级esp,56美元
6:89 75 fc movl[ebp-4],esi
9:89 5d e4 movl[ebp-28],ebx
12:39 63 1a cmpl[ebx+26],esp
15:76 03 jbe 20
17:ff 57 43呼叫*[edi+67];SYS::TRAP-STACK-OVFL
20:83 f9 01 cmpl ecx,$1
23:74 03 jz 28
25:ff 57 8b呼叫*[edi-117];SYS::TRAP-WNAERR
28:8b 5d 00 movl ebx,[ebp+0]
31:8b 5b ec movl ebx[ebx-20]
34:8b 5b fa movl ebx[ebx-6]
37:80 7f cb 00 cmpb[edi-53],$0;SYS::C_中断挂起
41:74 03 jz 46
43:ff 57 87呼叫*[edi-121];陷阱信号命中
46:8b 56 12移动edx,[esi+18]#
49:ff b7 43 fe PUSH[edi-445];SYS::CLOSURE-HEADER
ff ff
55:8f 45 d0 popl[ebp-48]
58:ff b7 47 fe PUSH[edi-441];SYS::CLOSURE-ADDRESS
ff ff
64:8f 45 d4 popl[ebp-44]
67:89 55 d8 movl[ebp-40],edx
70:89 5d直流movl[ebp-36],ebx
73:8d 5d e2水平ebx[ebp-30]
76:89 c2移动edx,eax
78:89 d8 movl eax,ebx
80:8b 5e 16 movl ebx,[esi+22];减少
83:ff 57 27呼叫*[edi+39];流浪汉二号
86:89 7d f0 movl[ebp-16],电子数据交换
89:c9休假
90:8b 75 fc电影esi,[ebp-4]
93:c3 ret
;; 拆卸#
;; 形式:A B
;; 代码开始:#x2186ccc0:
0:55推拉ebp
1:89 e5移动ebp,esp
3:83欧共体30次级esp,48美元
6:89 75 fc movl[ebp-4],esi
9:89 5d e4 movl[ebp-28],ebx
12:39 63 1a cmpl[ebx+26],esp
15:76 03 jbe 20
17:ff 57 43呼叫*[edi+67];SYS::TRAP-STACK-OVFL
20:83 f9 02 cmpl ecx,$2
23:74 03 jz 28
25:ff 57 8b呼叫*[edi-117];SYS::TRAP-WNAERR
28:8b 5d 00 movl ebx,[ebp+0]
31:8b 5b ec movl ebx[ebx-20]
34:8b 5b fa movl ebx[ebx-6]
37:80 7f cb 00 cmpb[edi-53],$0;SYS::C_中断挂起
41:74 03 jz 46
43:ff 57 87呼叫*[edi-121];陷阱信号命中
46:ff 73 f6推杆[ebx-10]
49:8f 45 dc popl[ebp-36];不包括::|本地-0|
52:8b 75直流电动画片esi[ebp-36];不包括::|本地-0|
55:89 fb movl ebx,edi
57:b9 02 00 movl ecx,2美元
00
62:ff 57 23呼叫*[edi+35];SYS::FUNCALL-TRAMP
65:89 7d f0 movl[ebp-16],电子数据交换
68:c9离开
69:8b 75 fc电影esi,[ebp-4]
72:c3 ret
73:90不
在第二个闭包模板的49和52处,您可以看到它正在将自己馈送到带有2个参数的
sys::funcall tramp
1


  • sys::funcall tramp
    是一个内部函数,我认为它可能执行或允许尾部调用

  • 根据57处的
    ecx
    ,因为
    ecx
    似乎是用来检查是否调用了内部
    sys::trap wnaerr
    ;我想
    wna
    代表wrongnargument的数量


  • 很难说。看起来它是特定于实现的。我建议向Franz寻求支持。谢谢你的回复。我已经向Franz发送了一份错误报告,引用了这个问题和答案。
    CG-USER(8): (disassemble (lambda-producer))
    ;; disassembly of #<Closure Template Function (:INTERNAL LAMBDA-PRODUCER 0)>
    ;; formals: X
    ;; closure vectors:
    ;;      0: #<Closure (LABELS LAMBDA-PRODUCER PRODUCER-LABEL2) @ #xdfdda7a>
    ;;      1: #<Function (LABELS LAMBDA-PRODUCER PRODUCER-LABEL)>
    ;; constant vector:
    0: #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
    1: REDUCE
    
    ;; code start: #x21869018:
       0: 55          pushl ebp
       1: 89 e5     movl    ebp,esp
       3: 83 ec 38  subl    esp,$56
       6: 89 75 fc  movl    [ebp-4],esi
       9: 89 5d e4  movl    [ebp-28],ebx
      12: 39 63 1a  cmpl    [ebx+26],esp
      15: 76 03     jbe 20
      17: ff 57 43  call    *[edi+67]      ; SYS::TRAP-STACK-OVFL
      20: 83 f9 01  cmpl    ecx,$1
      23: 74 03     jz  28
      25: ff 57 8b  call    *[edi-117]    ; SYS::TRAP-WNAERR
      28: 8b 5d 00  movl    ebx,[ebp+0]
      31: 8b 5b ec  movl    ebx,[ebx-20]
      34: 8b 5b fa  movl    ebx,[ebx-6]
      37: 80 7f cb 00 cmpb  [edi-53],$0        ; SYS::C_INTERRUPT-PENDING
      41: 74 03     jz  46
      43: ff 57 87  call    *[edi-121]    ; SYS::TRAP-SIGNAL-HIT
      46: 8b 56 12  movl    edx,[esi+18] ; #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
      49: ff b7 43 fe pushl [edi-445] ; SYS::CLOSURE-HEADER
          ff ff 
      55: 8f 45 d0  popl    [ebp-48]
      58: ff b7 47 fe pushl [edi-441] ; SYS::CLOSURE-ADDRESS
          ff ff 
      64: 8f 45 d4  popl    [ebp-44]
      67: 89 55 d8  movl    [ebp-40],edx
      70: 89 5d dc  movl    [ebp-36],ebx
      73: 8d 5d e2  leal    ebx,[ebp-30]
      76: 89 c2     movl    edx,eax
      78: 89 d8     movl    eax,ebx
      80: 8b 5e 16  movl    ebx,[esi+22] ; REDUCE
      83: ff 57 27  call    *[edi+39]      ; SYS::TRAMP-TWO
      86: 89 7d f0  movl    [ebp-16],edi
      89: c9          leave
      90: 8b 75 fc  movl    esi,[ebp-4]
      93: c3          ret
    
    ;; disassembly of #<Closure Template Function (:INTERNAL (:INTERNAL LAMBDA-PRODUCER 0) 0)>
    ;; formals: A B
    
    ;; code start: #x2186ccc0:
       0: 55          pushl ebp
       1: 89 e5     movl    ebp,esp
       3: 83 ec 30  subl    esp,$48
       6: 89 75 fc  movl    [ebp-4],esi
       9: 89 5d e4  movl    [ebp-28],ebx
      12: 39 63 1a  cmpl    [ebx+26],esp
      15: 76 03     jbe 20
      17: ff 57 43  call    *[edi+67]      ; SYS::TRAP-STACK-OVFL
      20: 83 f9 02  cmpl    ecx,$2
      23: 74 03     jz  28
      25: ff 57 8b  call    *[edi-117]    ; SYS::TRAP-WNAERR
      28: 8b 5d 00  movl    ebx,[ebp+0]
      31: 8b 5b ec  movl    ebx,[ebx-20]
      34: 8b 5b fa  movl    ebx,[ebx-6]
      37: 80 7f cb 00 cmpb  [edi-53],$0        ; SYS::C_INTERRUPT-PENDING
      41: 74 03     jz  46
      43: ff 57 87  call    *[edi-121]    ; SYS::TRAP-SIGNAL-HIT
      46: ff 73 f6  pushl   [ebx-10]
      49: 8f 45 dc  popl    [ebp-36]        ; EXCL::|local-0|
      52: 8b 75 dc  movl    esi,[ebp-36] ; EXCL::|local-0|
      55: 89 fb     movl    ebx,edi
      57: b9 02 00 00 movl  ecx,$2
          00 
      62: ff 57 23  call    *[edi+35]      ; SYS::FUNCALL-TRAMP
      65: 89 7d f0  movl    [ebp-16],edi
      68: c9          leave
      69: 8b 75 fc  movl    esi,[ebp-4]
      72: c3          ret
      73: 90          nop