除非第一条指令是跳转到非法地址(在有错误的程序中)。也许您可以选择非法地址,以便这种情况不会发生,至少不会使用相对跳转,但是假定寄存器间接跳转可以带您到任何地方。(我不知道SPARC细节是否真正关注此事,或者陷阱处理程序是否具有足够的信息来解决此问题。) - Peter Cordes
我可以想到几种处理这个问题的方法。首先,您可以阅读即将单步执行的指令,看看它是否是寄存器间接跳转,并对其进行解码以查找源寄存器和任何偏移量,然后计算跳转目标并保存以与非法地址陷阱后的TPC值进行比较。第二,只需将我们放入TNPC中的非法地址视为元数据;用伪随机数填充它,然后确认故障的非法地址是否相同。如果不是,则非法地址是由单步执行的指令引起的,而不是由我们的地址引起的。 - Rob Gardner
这两种方法听起来都很繁琐。依靠偶然性,即您没有生成与目标代码跳转到的相同地址可能是安全的(特别是使用64位地址),但最好能够做一些保证安全的事情。将TNPC指向一个陷阱指令可以避免所有这些问题吗? 这似乎是明显的选择。 - Peter Cordes
1当然,安全的做法是将TNPC指向陷阱指令。所有这些其他的谈话只是为了好玩,我从未尝试过。我想到了一种简单的方法来检测用户生成的非法地址和我们生成的地址之间的差异:在非法地址后的陷阱处理程序中,查看TNPC。如果它与陷阱之前相同,则意味着步进指令出现故障。 - Rob Gardner
整洁,也许将其编辑进你的回答中。顺便说一句,我主要只了解x86,但对其他指令集架构的设计有一些了解。对于其他机器的ISA调试支持,特别是带有分支延迟槽的支持,是很有趣的。 - Peter Cordes