一些汇编器错误信息具有误导性,且缺少上下文信息。
程序员遇到的99%的错误是invalid instruction
,这并没有太大帮助。
Go(或Plan 9)汇编器有其特殊之处,使得初次体验与这样的错误信息相结合,非常令人不愉快。
错误信息的多个方面可以改进,但对于刚开始的时候,一些明显糟糕的事情可以改变。
我提出了一些错误信息可以更精确/详细的情况。如果适用,对于相同情况的clang
汇编器错误信息也提供了。
这是一个关于此主题的讨论的提议。也许有人会指出重要的陷阱,或者提供更多值得修复的情况。
此范围仅限于x86汇编器后端。
TEXT main·asmErrors(SB),$0
// 1
// Case: immediate operand overflow.
// Note: base16->base10 constant conversion inerror message
// is annoying too,but it is separate issue.
//
// Have: "invalid instruction: ADDQ $-2415919103, AX"
// Want: "ADDQ(imm32,r): constant -2415919103 overflows imm32"
ADDQ $-0x8FFFFFFF,AX
// 2
// Case: invalid operand types combination.
//
// Have: "invalid instruction: MOVL (R8), (R9)"
// Want: "MOVL with (mem,mem) operands combination does not exist"
//
// Clang:
// > invalid operand for instruction
// > movl (%R8),(%R9)
// > ^~~~~
MOVL (R8),(R9)
// 3
// Case: negative immediate for unsigned operand.
//
// Have: "invalid instruction: PSHUFL: $-10, X0, X1"
// Want: "PSHUFL(uint8,xmm,xmm): invalid negative immediate value -10"
PSHUFL $-10,X0,X1
// 4
// Case: using "SP"register as "index"inSIB addressing.
// Note: same goes for XMM andother non-suitable for index registers.
//
// Have: "invalid instruction: MOVL (AX)(SP*2), AX"
// Want: "SP register can't be used as index inSIB addressing"
MOVL (AX)(SP*2),AX
// 5
// Case: SIB without explicit "scale".
// See: #13282.
//
// Have[1]: "invalid instruction: MOVL foo<>(SB)(AX), AX"
// Have[2]: "asmidx: bad address 0/2064/2064"
// Want: "SIB addressing without explicit scale is forbidden"
MOVL foo<>(SB)(AX),AX// [1]
MOVL (AX)(AX),AX// [2]
RET
4条答案
按热度按时间qyyhg6bp1#
Want
部分提供的错误信息仅用于演示目的。我认为收集尽可能多的奇怪案例更为重要,以评估可以带来多大的改进。
这次调查使我发现了两个距离较远的相关问题。
BYTE
接受uint64
参数,但始终只写入单字节。默默无闻地。asmidx: blah-blah
这样的错误不提供错误位置(源文件+行)。2admgd592#
"非法指令"错误信息非常离奇:
https://blog.sgmansfield.com/2017/04/a-foray-into-go-assembly-programming/
我几乎准备了一个CL,用于修复大多数"无效指令"错误消息,使其更精确和描述性。
iyzzxitl3#
https://golang.org/cl/108515提到了这个问题:
cmd/internal/obj/x86: improve error messages
v6ylcynt4#
我认为收集尽可能多的奇怪案例更为重要,以评估可以带来多大的改进。我遇到了以下案例:
信息是: