这是我在调试的代码,当我发现这个(我觉得很有趣)。
int function(void) {
static int i, state = 0;
switch (state) {
case 0: goto LABEL0;
case 1: goto LABEL1;
}
LABEL0: /* start of function */
for (i = 0; i < 10; i++) {
state = 1; /* so we will come back to LABEL1 */
return i;
LABEL1:; /* resume control straight after the return */
}
}因此,我观察到的是,当标签在A循环goto LABEL1;中时,这个语句-从不将PC直接移动到标签之后的代码。到目前一切尚好。当我将代码更改为这个并再次调试时,事情变得非常混乱:
int function(void) {
static int i, state = 0;
switch (state) {
case 0: goto LABEL0;
case 1: goto LABEL1;
}
for(;;){
i++;
LABEL0: /* start of function */
for (i = 0; i < 10; i++) {
state = 1; /* so we will come back to LABEL1 */
return i;
LABEL1:; /* resume control straight after the return */
}
}
}我故意将LABEL0嵌套到循环中,以便确认观察到的结果。虽然观测结果没有证实预期的结果。这一次,goto语句将程序直接发送到它所引用的标签之后的代码(LABEL0:),尽管标签被嵌套到虚拟for(;;)循环中)。
我真的希望你能理解这个场景。有人能解释一下这种行为(我找不到一致性)吗?
发布于 2016-09-21 11:38:28
调试器通常不能非常准确地显示PC,因为单个源行由多个操作码组成,有时根本没有操作代码,因此它不能总是将PC映射到正确的源行。
在第一个示例中,在LABEL1之后放置一个虚拟语句,以查看是否在那里设置了PC。
如果调试器支持“反汇编”视图,则切换到“反汇编视图”或类似视图。
https://stackoverflow.com/questions/39615239
复制相似问题