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