#2992·capstone

AArch64: eret*/drps/bc.<cond> 解码正确,但没有指令组(跳转/相对跳转/返回)

作者: r0ny123创建于 2026年7月11日更新于 2026年7月12日
标签bugAArch64

在 capstone 5.0.7 中测试了 (CS_ARCH_ARM64/CS_MODE_ARM, detail = True)。b.<cond> 已正确地标记了控制流组,但其他几个与控制流相关的 AArch64 指令(如同 b.eq)解码时,groups 数组为空:

python
import capstone
md = capstone.Cs(capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM)
md.detail = True
tests = {
    'bc.eq': bytes.fromhex('10000054'),  # FEAT_HBC hinted conditional branch
    'b.eq':  bytes.fromhex('00000054'),
    'drps':  bytes.fromhex('e003bfd6'),  # Debug Restore PState
    'eret':  bytes.fromhex('e0039fd6'),
}
for name, code in tests.items():
    for insn in md.disasm(code, 0x401000):
        groups = [insn.group_name(g) for g in insn.groups]
        print(f'{name}: mnemonic={insn.mnemonic!r} groups={groups}')

输出:

bc.eq: mnemonic='bc.eq' groups=[]
b.eq:  mnemonic='b.eq'  groups=['jump', 'branch_relative']
drps:  mnemonic='drps'  groups=[]
eret:  mnemonic='eret'  groups=[]

bc.<cond> (AARCH64_INS_BC, FEAT_HBC / ARMv8.8-9.3) 与 b.<cond> 共用完全相同的 imm19 分支偏移编码(仅在位 4 处不同),因此似乎是一个简单的疏漏,没有将其标记为 jump/branch_relativeeret/eretaa/eretabdrps 是异常级/调试状态控制传输(到 ELR_ELx),没有操作数,也没有任何组 — AArch64_add_cs_groups 只为 ret/retaa/retab 添加了 AARCH64_GRP_RET,对于这些指令没有添加任何组。

内容来源: capstone-engine/capstone